Skip to content

Commit

Permalink
sd-bus: fix buffer overflow
Browse files Browse the repository at this point in the history
Fixes #23486.
  • Loading branch information
yuwata authored and keszybz committed May 28, 2022
1 parent 5ad69b0 commit 89b6a3f
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 7 deletions.
30 changes: 23 additions & 7 deletions src/libsystemd/sd-bus/bus-message.c
Original file line number Diff line number Diff line change
Expand Up @@ -428,7 +428,7 @@ int bus_message_from_header(

_cleanup_free_ sd_bus_message *m = NULL;
struct bus_header *h;
size_t a, label_sz;
size_t a, label_sz = 0; /* avoid false maybe-uninitialized warning */

assert(bus);
assert(header || header_accessible <= 0);
Expand Down Expand Up @@ -506,7 +506,10 @@ int bus_message_from_header(
m->fields_size = BUS_MESSAGE_BSWAP32(m, h->dbus1.fields_size);
m->body_size = BUS_MESSAGE_BSWAP32(m, h->dbus1.body_size);

if (sizeof(struct bus_header) + ALIGN8(m->fields_size) + m->body_size != message_size)
assert(message_size >= sizeof(struct bus_header));
if (m->fields_size > message_size - sizeof(struct bus_header) ||
ALIGN8(m->fields_size) > message_size - sizeof(struct bus_header) ||
m->body_size != message_size - sizeof(struct bus_header) - ALIGN8(m->fields_size))
return -EBADMSG;
}

Expand Down Expand Up @@ -3061,15 +3064,21 @@ void bus_body_part_unmap(struct bus_body_part *part) {
return;
}

static int buffer_peek(const void *p, uint32_t sz, size_t *rindex, size_t align, size_t nbytes, void **r) {
static int buffer_peek(const void *p, size_t sz, size_t *rindex, size_t align, size_t nbytes, void **r) {
size_t k, start, end;

assert(rindex);
assert(align > 0);

start = ALIGN_TO((size_t) *rindex, align);
end = start + nbytes;
start = ALIGN_TO(*rindex, align);
if (start > sz)
return -EBADMSG;

/* Avoid overflow below */
if (nbytes > SIZE_MAX - start)
return -EBADMSG;

end = start + nbytes;
if (end > sz)
return -EBADMSG;

Expand Down Expand Up @@ -3272,10 +3281,17 @@ static int message_peek_body(
assert(rindex);
assert(align > 0);

start = ALIGN_TO((size_t) *rindex, align);
start = ALIGN_TO(*rindex, align);
if (start > m->user_body_size)
return -EBADMSG;

padding = start - *rindex;
end = start + nbytes;

/* Avoid overflow below */
if (nbytes > SIZE_MAX - start)
return -EBADMSG;

end = start + nbytes;
if (end > m->user_body_size)
return -EBADMSG;

Expand Down
Binary file added test/fuzz/fuzz-bus-message/issue-23486-case-1
Binary file not shown.
Binary file added test/fuzz/fuzz-bus-message/issue-23486-case-2
Binary file not shown.
Binary file added test/fuzz/fuzz-bus-message/issue-23486-case-3
Binary file not shown.

0 comments on commit 89b6a3f

Please sign in to comment.