chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
bus: it's OK to send messages with an empty payload but non-empty signature
[elogind.git]
/
src
/
libsystemd-bus
/
bus-message.c
diff --git
a/src/libsystemd-bus/bus-message.c
b/src/libsystemd-bus/bus-message.c
index 811374422717ff0cdbab7b5c3d52ceea88b63f6c..32af8609b3d0c0264aac21e99e33a389f02cf073 100644
(file)
--- a/
src/libsystemd-bus/bus-message.c
+++ b/
src/libsystemd-bus/bus-message.c
@@
-2026,7
+2026,7
@@
static int bus_message_close_struct(sd_bus_message *m, struct bus_container *c,
if (!BUS_MESSAGE_IS_GVARIANT(m))
return 0;
if (!BUS_MESSAGE_IS_GVARIANT(m))
return 0;
- p =
c->signature
;
+ p =
strempty(c->signature)
;
while (*p != 0) {
size_t n;
while (*p != 0) {
size_t n;
@@
-2074,7
+2074,7
@@
static int bus_message_close_struct(sd_bus_message *m, struct bus_container *c,
if (!a)
return -ENOMEM;
if (!a)
return -ENOMEM;
- p =
c->signature
;
+ p =
strempty(c->signature)
;
for (i = 0, j = 0; i < c->n_offsets; i++) {
unsigned k;
size_t n;
for (i = 0, j = 0; i < c->n_offsets; i++) {
unsigned k;
size_t n;
@@
-2404,10
+2404,12
@@
_public_ int sd_bus_message_append_array_space(
assert_return(m, -EINVAL);
assert_return(!m->sealed, -EPERM);
assert_return(m, -EINVAL);
assert_return(!m->sealed, -EPERM);
- assert_return(bus_type_is_trivial(type), -EINVAL);
+ assert_return(bus_type_is_trivial(type)
&& type != SD_BUS_TYPE_BOOLEAN
, -EINVAL);
assert_return(ptr || size == 0, -EINVAL);
assert_return(!m->poisoned, -ESTALE);
assert_return(ptr || size == 0, -EINVAL);
assert_return(!m->poisoned, -ESTALE);
+ /* alignment and size of the trivial types (except bool) is
+ * identical for gvariant and dbus1 marshalling */
align = bus_type_get_alignment(type);
sz = bus_type_get_size(type);
align = bus_type_get_alignment(type);
sz = bus_type_get_size(type);
@@
-2554,8
+2556,8
@@
_public_ int sd_bus_message_append_array_memfd(sd_bus_message *m,
part->size = size;
copy_fd = -1;
part->size = size;
copy_fd = -1;
- message_extend_containers(m, size);
m->header->body_size += size;
m->header->body_size += size;
+ message_extend_containers(m, size);
return sd_bus_message_close_container(m);
}
return sd_bus_message_close_container(m);
}
@@
-2969,8
+2971,12
@@
static int container_next_item(sd_bus_message *m, struct bus_container *c, size_
*rindex = ALIGN_TO(c->offsets[c->offset_index], alignment);
c->item_size = c->offsets[c->offset_index+1] - *rindex;
} else {
*rindex = ALIGN_TO(c->offsets[c->offset_index], alignment);
c->item_size = c->offsets[c->offset_index+1] - *rindex;
} else {
+
+ if (c->offset_index+1 >= (c->end-c->begin)/sz)
+ goto end;
+
/* Fixed-size array */
/* Fixed-size array */
- *rindex
+=
sz;
+ *rindex
= c->begin + (c->offset_index+1) *
sz;
c->item_size = sz;
}
c->item_size = sz;
}
@@
-3554,12
+3560,20
@@
static int build_struct_offsets(
int r;
assert(m);
int r;
assert(m);
- assert(signature);
assert(item_size);
assert(offsets);
assert(n_offsets);
assert(item_size);
assert(offsets);
assert(n_offsets);
+ if (isempty(signature)) {
+ *item_size = 0;
+ *offsets = NULL;
+ *n_offsets = 0;
+ return 0;
+ }
+
sz = determine_word_size(size, 0);
sz = determine_word_size(size, 0);
+ if (sz <= 0)
+ return -EBADMSG;
/* First, loop over signature and count variable elements and
* elements in general. We use this to know how large the
/* First, loop over signature and count variable elements and
* elements in general. We use this to know how large the
@@
-3897,6
+3911,7
@@
_public_ int sd_bus_message_enter_container(sd_bus_message *m,
_public_ int sd_bus_message_exit_container(sd_bus_message *m) {
struct bus_container *c;
_public_ int sd_bus_message_exit_container(sd_bus_message *m) {
struct bus_container *c;
+ unsigned saved;
int r;
assert_return(m, -EINVAL);
int r;
assert_return(m, -EINVAL);
@@
-3928,7
+3943,10
@@
_public_ int sd_bus_message_exit_container(sd_bus_message *m) {
c = message_get_container(m);
c = message_get_container(m);
+ saved = c->index;
+ c->index = c->saved_index;
r = container_next_item(m, c, &m->rindex);
r = container_next_item(m, c, &m->rindex);
+ c->index = saved;
if (r < 0)
return r;
if (r < 0)
return r;
@@
-4132,6
+4150,9
@@
_public_ int sd_bus_message_rewind(sd_bus_message *m, int complete) {
m->rindex = c->begin;
}
m->rindex = c->begin;
}
+ c->offset_index = 0;
+ c->item_size = c->n_offsets > 0 ? c->offsets[0] : c->end;
+
return !isempty(c->signature);
}
return !isempty(c->signature);
}
@@
-4830,7
+4851,7
@@
int bus_message_parse_fields(sd_bus_message *m) {
uint32_t unix_fds = 0;
void *offsets = NULL;
unsigned n_offsets = 0;
uint32_t unix_fds = 0;
void *offsets = NULL;
unsigned n_offsets = 0;
- size_t sz;
+ size_t sz
= 0
;
unsigned i = 0;
assert(m);
unsigned i = 0;
assert(m);
@@
-5064,9
+5085,6
@@
int bus_message_parse_fields(sd_bus_message *m) {
if (m->n_fds != unix_fds)
return -EBADMSG;
if (m->n_fds != unix_fds)
return -EBADMSG;
- if (isempty(m->root_container.signature) != (BUS_MESSAGE_BODY_SIZE(m) == 0))
- return -EBADMSG;
-
switch (m->header->type) {
case SD_BUS_MESSAGE_SIGNAL:
switch (m->header->type) {
case SD_BUS_MESSAGE_SIGNAL:
@@
-5281,7
+5299,7
@@
_public_ const char* sd_bus_message_get_signature(sd_bus_message *m, int complet
assert_return(m, NULL);
c = complete ? &m->root_container : message_get_container(m);
assert_return(m, NULL);
c = complete ? &m->root_container : message_get_container(m);
- return
c->signature ?: ""
;
+ return
strempty(c->signature)
;
}
_public_ int sd_bus_message_copy(sd_bus_message *m, sd_bus_message *source, int all) {
}
_public_ int sd_bus_message_copy(sd_bus_message *m, sd_bus_message *source, int all) {