From: Tom Gundersen Date: Sun, 23 Feb 2014 18:21:50 +0000 (+0100) Subject: sd-dhcp: don't reject packets with the 'wrong' source port X-Git-Tag: v210~32 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=8fa2eeace7beecedb01c82811e28949cacec1236 sd-dhcp: don't reject packets with the 'wrong' source port The RFC does not specify that the packets from the DHCP server must come from the DHCP server port, only that that's where they should be sent. This fixes a problem when running networkd in VirtualBox. Thanks to Sébastien Luttringer for reporting the bug and very patiently testing various fixes. --- diff --git a/src/libsystemd-dhcp/dhcp-packet.c b/src/libsystemd-dhcp/dhcp-packet.c index 8f9ec43c4..13881ea0d 100644 --- a/src/libsystemd-dhcp/dhcp-packet.c +++ b/src/libsystemd-dhcp/dhcp-packet.c @@ -164,7 +164,7 @@ int dhcp_packet_verify_headers(DHCPPacket *packet, size_t len) { return -EINVAL; } - if (hdrlen + be16toh(packet->udp.len) > len) { + if (len < hdrlen + be16toh(packet->udp.len)) { log_dhcp_client(client, "ignoring packet: packet (%zu bytes) " "smaller than expected (%zu) by UDP header", len, hdrlen + be16toh(packet->udp.len)); @@ -182,10 +182,10 @@ int dhcp_packet_verify_headers(DHCPPacket *packet, size_t len) { } } - if (be16toh(packet->udp.source) != DHCP_PORT_SERVER || - be16toh(packet->udp.dest) != DHCP_PORT_CLIENT) { - log_dhcp_client(client, "ignoring packet: wrong ports (source: %u, destination: %u)", - be16toh(packet->udp.source), be16toh(packet->udp.dest)); + if (be16toh(packet->udp.dest) != DHCP_PORT_CLIENT) { + log_dhcp_client(client, "ignoring packet: to port %u, which " + "is not the DHCP client port (%u)", + be16toh(packet->udp.dest), DHCP_PORT_CLIENT); return -EINVAL; }