From: Patrik Flykt Date: Fri, 31 Jan 2014 09:31:23 +0000 (+0200) Subject: libsystemd-dhcp: Compute UDP checksum only if set X-Git-Tag: v209~272 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=1aed1cbc10d33e5bf5836e6838ac16add2002152;ds=sidebyside libsystemd-dhcp: Compute UDP checksum only if set A checksum field with value zero means no UDP checksum has been computed for the packet. --- diff --git a/src/libsystemd-dhcp/sd-dhcp-client.c b/src/libsystemd-dhcp/sd-dhcp-client.c index 130a61d6f..37fad9a30 100644 --- a/src/libsystemd-dhcp/sd-dhcp-client.c +++ b/src/libsystemd-dhcp/sd-dhcp-client.c @@ -838,13 +838,18 @@ static int client_verify_headers(sd_dhcp_client *client, DHCPPacket *message, hdrlen)) return -EINVAL; - message->ip.check = message->udp.len; - message->ip.ttl = 0; - - if (hdrlen + be16toh(message->udp.len) > len || - client_checksum(&message->ip.ttl, be16toh(message->udp.len) + 12)) + if (hdrlen + be16toh(message->udp.len) > len) return -EINVAL; + if (message->udp.check) { + message->ip.check = message->udp.len; + message->ip.ttl = 0; + + if (client_checksum(&message->ip.ttl, + be16toh(message->udp.len) + 12)) + return -EINVAL; + } + if (be16toh(message->udp.source) != DHCP_PORT_SERVER || be16toh(message->udp.dest) != DHCP_PORT_CLIENT) return -EINVAL;