diff --git a/src/libsystemd/sd-bus/bus-message.c b/src/libsystemd/sd-bus/bus-message.c index 55b07fece0..5c4f473f36 100644 --- a/src/libsystemd/sd-bus/bus-message.c +++ b/src/libsystemd/sd-bus/bus-message.c @@ -2218,7 +2218,7 @@ _public_ int sd_bus_message_append_array_memfd( if (offset == 0 && size == UINT64_MAX) size = real_size; - else if (offset + size > real_size) + else if (size > real_size || offset > real_size - size) return -EMSGSIZE; align = bus_type_get_alignment(type); @@ -2233,6 +2233,9 @@ _public_ int sd_bus_message_append_array_memfd( if (size % sz != 0) return -EINVAL; + if (size == 0) + return -EINVAL; + if (size > (uint64_t) UINT32_MAX) return -EINVAL; @@ -2248,11 +2251,13 @@ _public_ int sd_bus_message_append_array_memfd( if (!part) return -ENOMEM; - part->memfd = copy_fd; + if (m->body_size > UINT32_MAX - size) + return -EMSGSIZE; + + part->memfd = TAKE_FD(copy_fd); part->memfd_offset = offset; part->sealed = true; part->size = size; - copy_fd = -EBADF; m->body_size += size; message_extend_containers(m, size); @@ -2293,7 +2298,7 @@ _public_ int sd_bus_message_append_string_memfd( if (offset == 0 && size == UINT64_MAX) size = real_size; - else if (offset + size > real_size) + else if (size > real_size || offset > real_size - size) return -EMSGSIZE; /* We require this to be NUL terminated */ @@ -2333,11 +2338,13 @@ _public_ int sd_bus_message_append_string_memfd( if (!part) return -ENOMEM; - part->memfd = copy_fd; + if (m->body_size > UINT32_MAX - size) + return -EMSGSIZE; + + part->memfd = TAKE_FD(copy_fd); part->memfd_offset = offset; part->sealed = true; part->size = size; - copy_fd = -EBADF; m->body_size += size; message_extend_containers(m, size);