]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* grub-core/net/ip.c (handle_dgram): Fix DHCP mac comparison.
authorBean <bean123ch@gmail.com>
Tue, 1 May 2012 13:20:20 +0000 (15:20 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Tue, 1 May 2012 13:20:20 +0000 (15:20 +0200)
Also-By: Vladimir Serbinenko <phcoder@gmail.com>
ChangeLog
grub-core/net/ip.c

index 2934494916803d41a33000c73545ab24f0496f69..4eed3f189339f630013656240a258c3ee773042c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2012-05-01  Vladimir Serbinenko  <phcoder@gmail.com>
+2012-05-01  Bean  <bean123ch@gmail.com>
+
+       * grub-core/net/ip.c (handle_dgram): Fix DHCP mac comparison.
+
 2012-05-01  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * grub-core/kern/file.c (grub_file_read): Read nothing if len = 0.
index 65a06fceef05af4fc77dbe9bcf2bd1b757a215ca..131e81ee0389b91abba1e91a1137710da2783d26 100644 (file)
@@ -237,35 +237,41 @@ handle_dgram (struct grub_net_buff *nb,
     udph = (struct udphdr *) nb->data;
     if (proto == GRUB_NET_IP_UDP && grub_be_to_cpu16 (udph->dst) == 68)
       {
+       if (udph->chksum)
+         {
+           grub_uint16_t chk, expected;
+           chk = udph->chksum;
+           udph->chksum = 0;
+           expected = grub_net_ip_transport_checksum (nb,
+                                                      GRUB_NET_IP_UDP,
+                                                      source,
+                                                      dest);
+           if (expected != chk)
+             {
+               grub_dprintf ("net", "Invalid UDP checksum. "
+                             "Expected %x, got %x\n", 
+                             grub_be_to_cpu16 (expected),
+                             grub_be_to_cpu16 (chk));
+               grub_netbuff_free (nb);
+               return GRUB_ERR_NONE;
+             }
+           udph->chksum = chk;
+         }
+
+       err = grub_netbuff_pull (nb, sizeof (*udph));
+       if (err)
+         {
+           grub_netbuff_free (nb);
+           return err;
+         }
+       
        FOR_NET_NETWORK_LEVEL_INTERFACES (inf)
          if (inf->card == card
              && inf->address.type == GRUB_NET_NETWORK_LEVEL_PROTOCOL_DHCP_RECV
-             && grub_net_hwaddr_cmp (&inf->hwaddress, hwaddress) == 0)
+             && inf->hwaddress.type == GRUB_NET_LINK_LEVEL_PROTOCOL_ETHERNET
+             && grub_memcmp (inf->hwaddress.mac, &dhcp->mac_addr,
+                             sizeof (inf->hwaddress.mac)) == 0)
            {
-             if (udph->chksum)
-               {
-                 grub_uint16_t chk, expected;
-                 chk = udph->chksum;
-                 udph->chksum = 0;
-                 expected = grub_net_ip_transport_checksum (nb,
-                                                            GRUB_NET_IP_UDP,
-                                                            source,
-                                                            dest);
-                 if (expected != chk)
-                   {
-                     grub_dprintf ("net", "Invalid UDP checksum. "
-                                   "Expected %x, got %x\n", 
-                                   grub_be_to_cpu16 (expected),
-                                   grub_be_to_cpu16 (chk));
-                     grub_netbuff_free (nb);
-                     return GRUB_ERR_NONE;
-                   }
-                 udph->chksum = chk;
-               }
-
-             err = grub_netbuff_pull (nb, sizeof (*udph));
-             if (err)
-               return err;
              grub_net_process_dhcp (nb, inf->card);
              grub_netbuff_free (nb);
              return GRUB_ERR_NONE;