diff --git a/src/libsystemd-network/dhcp-message.c b/src/libsystemd-network/dhcp-message.c index bf85dd4233..14671a0750 100644 --- a/src/libsystemd-network/dhcp-message.c +++ b/src/libsystemd-network/dhcp-message.c @@ -1342,6 +1342,11 @@ static int dhcp_message_verify_header( if (iov->iov_len < sizeof(DHCPMessageHeader)) return -EBADMSG; + /* DHCP travels over UDP, so anything larger than the maximum UDP payload cannot be a valid + * message and would also be impossible to rebuild as a UDP packet. */ + if (iov->iov_len > UDP_PAYLOAD_MAX_SIZE) + return -EBADMSG; + const DHCPMessageHeader *header = iov->iov_base; if (!IN_SET(header->op, BOOTREQUEST, BOOTREPLY)) diff --git a/test/fuzz/fuzz-dhcp-client/oversized-message b/test/fuzz/fuzz-dhcp-client/oversized-message new file mode 100644 index 0000000000..a1b3f69aa8 Binary files /dev/null and b/test/fuzz/fuzz-dhcp-client/oversized-message differ