chiark / gitweb /
libsystemd-dhcp: Compute UDP checksum only if set
authorPatrik Flykt <patrik.flykt@linux.intel.com>
Fri, 31 Jan 2014 09:31:23 +0000 (11:31 +0200)
committerTom Gundersen <teg@jklm.no>
Fri, 31 Jan 2014 11:04:51 +0000 (12:04 +0100)
A checksum field with value zero means no UDP checksum has been
computed for the packet.

src/libsystemd-dhcp/sd-dhcp-client.c

index 130a61d6f8d6dceff59516259905d077e87e571b..37fad9a30159f915eb53ae218ff92660d3199865 100644 (file)
@@ -838,13 +838,18 @@ static int client_verify_headers(sd_dhcp_client *client, DHCPPacket *message,
                                                            hdrlen))
                 return -EINVAL;
 
                                                            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;
 
                 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;
         if (be16toh(message->udp.source) != DHCP_PORT_SERVER ||
             be16toh(message->udp.dest) != DHCP_PORT_CLIENT)
                 return -EINVAL;