]> git.proxmox.com Git - grub2.git/commitdiff
Don't react to adressed bootp packets unless in bootp transaction
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sat, 2 Jul 2011 18:11:29 +0000 (20:11 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sat, 2 Jul 2011 18:11:29 +0000 (20:11 +0200)
grub-core/kern/emu/main.c
grub-core/net/ip.c
grub-core/net/net.c
grub-core/net/udp.c
include/grub/net.h

index 096e97090d2ea69230a4e24cf45a00c53e11f06c..2092d03cb573e61caf0041e289165ac5bed9f47b 100644 (file)
@@ -49,7 +49,7 @@
 static jmp_buf main_env;
 
 /* Store the prefix specified by an argument.  */
-static char *root_dev = NULL, *dir = DEFAULT_DIRECTORY;
+static char *root_dev = NULL, *dir = NULL;
 
 int grub_no_autoload;
 
@@ -139,14 +139,18 @@ main (int argc, char *argv[])
 
   set_program_name (argv[0]);
 
+  dir = xstrdup (DEFAULT_DIRECTORY);
+
   while ((opt = getopt_long (argc, argv, "r:d:m:vH:hV", options, 0)) != -1)
     switch (opt)
       {
       case 'r':
-        root_dev = optarg;
+       free (root_dev);
+        root_dev = xstrdup (optarg);
         break;
       case 'd':
-        dir = optarg;
+       free (dir);
+        dir = xstrdup (optarg);
         break;
       case 'm':
         dev_map = optarg;
index 776937a6e277421efeeaa45edb8aa3ef2ea45f62..8b06f7d119795bef61b1ba09498f1ab859ecdbb5 100644 (file)
@@ -65,50 +65,49 @@ grub_net_recv_ip_packets (struct grub_net_buff * nb,
 {
   struct iphdr *iph = (struct iphdr *) nb->data;
   grub_err_t err;
-  struct grub_net_network_level_interface *inf;
+  struct grub_net_network_level_interface *inf = NULL;
 
   err = grub_netbuff_pull (nb, sizeof (*iph));
   if (err)
     return err;
 
-  FOR_NET_NETWORK_LEVEL_INTERFACES (inf)
+  /* DHCP needs special treatment since we don't know IP yet.  */
   {
-    if (inf->card == card
-       && inf->address.type == GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV4
-       && inf->address.ipv4 == iph->dest
-       && grub_net_hwaddr_cmp (&inf->hwaddress, hwaddress) == 0)
-      break;
+    struct udphdr *udph;
+    udph = (struct udphdr *) nb->data;
+    if (iph->protocol == IP_UDP && grub_be_to_cpu16 (udph->dst) == 68)
+      {
+       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)
+           {
+             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;
+      }
   }
+
   if (!inf)
     {
       FOR_NET_NETWORK_LEVEL_INTERFACES (inf)
+      {
        if (inf->card == card
-           && inf->address.type == GRUB_NET_NETWORK_LEVEL_PROTOCOL_PROMISC
+           && inf->address.type == GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV4
+           && inf->address.ipv4 == iph->dest
            && grub_net_hwaddr_cmp (&inf->hwaddress, hwaddress) == 0)
-       break;
-    }
-  if (!inf)
-    {
-      if (iph->protocol == IP_UDP
-         && grub_net_hwaddr_cmp (&card->default_address, hwaddress) == 0)
-       {
-         struct udphdr *udph;
-         udph = (struct udphdr *) nb->data;
-         err = grub_netbuff_pull (nb, sizeof (*udph));
-         if (err)
-           return err;
-         if (grub_be_to_cpu16 (udph->dst) == 68)
-           grub_net_process_dhcp (nb, card);
-       }
-      grub_netbuff_free (nb);
-      return GRUB_ERR_NONE;
+         break;
+      }
     }
 
   switch (iph->protocol)
     {
     case IP_UDP:
       return grub_net_recv_udp_packet (nb, inf);
-      break;
     default:
       grub_netbuff_free (nb);
       break;
index a56860eed521a86b7a5808094546d091eb470fac..d5f9e374ec03244c117aeaf10dffbd522f2ab65e 100644 (file)
@@ -119,7 +119,7 @@ match_net (const grub_net_network_level_netaddress_t *net,
     return 0;
   switch (net->type)
     {
-    case GRUB_NET_NETWORK_LEVEL_PROTOCOL_PROMISC:
+    case GRUB_NET_NETWORK_LEVEL_PROTOCOL_DHCP_RECV:
       return 0;
     case GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV4:
       {
@@ -238,8 +238,8 @@ grub_net_addr_to_str (const grub_net_network_level_address_t *target, char *buf)
 {
   switch (target->type)
     {
-    case GRUB_NET_NETWORK_LEVEL_PROTOCOL_PROMISC:
-      grub_strcpy (buf, "promisc");
+    case GRUB_NET_NETWORK_LEVEL_PROTOCOL_DHCP_RECV:
+      grub_strcpy (buf, "temporary");
       return;
     case GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV4:
       {
@@ -521,8 +521,8 @@ print_net_address (const grub_net_network_level_netaddress_t *target)
 {
   switch (target->type)
     {
-    case GRUB_NET_NETWORK_LEVEL_PROTOCOL_PROMISC:
-      grub_printf ("promisc\n");
+    case GRUB_NET_NETWORK_LEVEL_PROTOCOL_DHCP_RECV:
+      grub_printf ("temporary\n");
       break;
     case GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV4:
       {
@@ -1257,7 +1257,7 @@ grub_cmd_bootp (struct grub_command *cmd __attribute__ ((unused)),
        grub_free (ifaces);
        return grub_errno;
       }
-    ifaces[j].address.type = GRUB_NET_NETWORK_LEVEL_PROTOCOL_PROMISC;
+    ifaces[j].address.type = GRUB_NET_NETWORK_LEVEL_PROTOCOL_DHCP_RECV;
     grub_memcpy (&ifaces[j].hwaddress, &card->default_address, 
                 sizeof (ifaces[j].hwaddress));
     j++;
index 95134c0cfa2c37c4ca94f8103afa166328ce753d..b9339e49a452ae80dc07e62818f7a493edfd1d43 100644 (file)
@@ -32,8 +32,11 @@ grub_net_recv_udp_packet (struct grub_net_buff * nb,
 {
   struct udphdr *udph;
   grub_net_socket_t sock;
+  grub_err_t err;
   udph = (struct udphdr *) nb->data;
-  grub_netbuff_pull (nb, sizeof (*udph));
+  err = grub_netbuff_pull (nb, sizeof (*udph));
+  if (err)
+    return err;
 
   FOR_NET_SOCKETS (sock)
   {
@@ -54,8 +57,6 @@ grub_net_recv_udp_packet (struct grub_net_buff * nb,
        return GRUB_ERR_NONE;
       }
   }
-  if (grub_be_to_cpu16 (udph->dst) == 68)
-    grub_net_process_dhcp (nb, inf->card);
   grub_netbuff_free (nb);
   return GRUB_ERR_NONE;
 }
index 4948266250fa6e9dd81253eb279dc599b04060a8..630fd33fb45e0b02fb95470d0daa53da3399979e 100644 (file)
@@ -123,7 +123,7 @@ struct grub_net_network_level_interface;
 
 typedef enum grub_network_level_protocol_id 
 {
-  GRUB_NET_NETWORK_LEVEL_PROTOCOL_PROMISC,
+  GRUB_NET_NETWORK_LEVEL_PROTOCOL_DHCP_RECV,
   GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV4
 } grub_network_level_protocol_id_t;