diff options
author | Kay Sievers <kay@vrfy.org> | 2013-10-09 14:07:46 +0200 |
---|---|---|
committer | Kay Sievers <kay@vrfy.org> | 2013-10-09 14:18:34 +0200 |
commit | b2ebf61faf1ff9efbe11f10bd2ba6cddf412aa4b (patch) | |
tree | b1ff6dc9e88f875b96599b260c122a298849a163 | |
parent | 61accc2ecd8ad4c43df3aeef4a1c26ec3d873d2a (diff) | |
download | kdbus-bus-b2ebf61faf1ff9efbe11f10bd2ba6cddf412aa4b.tar.gz kdbus-bus-b2ebf61faf1ff9efbe11f10bd2ba6cddf412aa4b.tar.bz2 kdbus-bus-b2ebf61faf1ff9efbe11f10bd2ba6cddf412aa4b.zip |
allocate only the alignment bytes for \0-bytes records
Reported-by: Daniel Kowalski <d.kowalski@samsung.com>
-rw-r--r-- | message.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/message.c b/message.c index aff68b6257f..225abcd4c9a 100644 --- a/message.c +++ b/message.c @@ -100,6 +100,7 @@ static int kdbus_msg_scan_items(struct kdbus_conn *conn, struct kdbus_kmsg *kmsg { const struct kdbus_msg *msg = &kmsg->msg; const struct kdbus_item *item; + size_t vecs_size = 0; unsigned int items_count = 0; bool has_fds = false; bool has_name = false; @@ -122,11 +123,16 @@ static int kdbus_msg_scan_items(struct kdbus_conn *conn, struct kdbus_kmsg *kmsg if (item->vec.size == 0) return -EINVAL; - kmsg->vecs_size += item->vec.size; + vecs_size += item->vec.size; if (!capable(CAP_IPC_OWNER) && - kmsg->vecs_size > KDBUS_MSG_MAX_PAYLOAD_VEC_SIZE) + vecs_size > KDBUS_MSG_MAX_PAYLOAD_VEC_SIZE) return -EMSGSIZE; + /* \0-bytes records store only the alignment bytes */ + if (KDBUS_PTR(item->vec.address)) + kmsg->vecs_size += item->vec.size; + else + kmsg->vecs_size += item->vec.size % 8; kmsg->vecs_count++; break; |