summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Gundersen <teg@jklm.no>2014-02-23 19:21:50 +0100
committerTom Gundersen <teg@jklm.no>2014-02-23 22:59:43 +0100
commit8fa2eeace7beecedb01c82811e28949cacec1236 (patch)
tree88349a086ecc7ebb425de5514d64d6f901f0e3df
parent5266a81ea2b5d355916695c1ecc8c4570a54727b (diff)
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.
-rw-r--r--src/libsystemd-dhcp/dhcp-packet.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/src/libsystemd-dhcp/dhcp-packet.c b/src/libsystemd-dhcp/dhcp-packet.c
index 8f9ec43c43..13881ea0dd 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;
}