int r;
assert_return(m, -EINVAL);
- assert_return(p, -EINVAL);
assert_return(!m->sealed, -EPERM);
assert_return(bus_type_is_basic(type), -EINVAL);
assert_return(!m->poisoned, -ESTALE);
break;
case SD_BUS_TYPE_BOOLEAN:
+
+ if (!p) {
+ r = -EINVAL;
+ goto fail;
+ }
+
align = sz = 4;
assert_cc(sizeof(int) == sizeof(uint32_t));
case SD_BUS_TYPE_UNIX_FD: {
int z, *f;
+ if (!p) {
+ r = -EINVAL;
+ goto fail;
+ }
+
if (!m->allow_fds) {
r = -ENOTSUP;
goto fail;
}
default:
+ if (!p) {
+ r = -EINVAL;
+ goto fail;
+ }
+
align = bus_type_get_alignment(type);
sz = bus_type_get_size(type);
break;
case SD_BUS_TYPE_BOOLEAN:
if (p)
- *(unsigned*) p = !!*(uint32_t*) q;
+ *(int*) p = !!*(uint32_t*) q;
break;
case SD_BUS_TYPE_INT16:
c = message_get_container(m);
sz = BUS_MESSAGE_BSWAP32(m, *c->array_size);
- r = message_peek_body(m, &m->rindex, align, sz, &p);
- if (r < 0)
- goto fail;
- if (r == 0) {
- r = -EBADMSG;
- goto fail;
+ if (sz == 0)
+ /* Zero length array, let's return some aligned
+ * pointer that is not NULL */
+ p = (uint8_t*) NULL + align;
+ else {
+ r = message_peek_body(m, &m->rindex, align, sz, &p);
+ if (r < 0)
+ goto fail;
+ if (r == 0) {
+ r = -EBADMSG;
+ goto fail;
+ }
}
r = sd_bus_message_exit_container(m);
return 0;
}
-int sd_bus_message_read_strv(sd_bus_message *m, char ***l) {
+_public_ int sd_bus_message_read_strv(sd_bus_message *m, char ***l) {
char **strv = NULL;
int r;