summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKay Sievers <kay@vrfy.org>2013-10-09 14:07:46 +0200
committerKay Sievers <kay@vrfy.org>2013-10-09 14:18:34 +0200
commitb2ebf61faf1ff9efbe11f10bd2ba6cddf412aa4b (patch)
treeb1ff6dc9e88f875b96599b260c122a298849a163
parent61accc2ecd8ad4c43df3aeef4a1c26ec3d873d2a (diff)
downloadkdbus-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.c10
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;