Root/m1/patches/rtems/fix-dns-in-dhcp.patch

1commit efedf0ad42d7d8989b62ec7c158b0a0a1f3b4197
2Author: Sebastien Bourdeauducq <sebastien@milkymist.org>
3Date: Fri Feb 24 23:04:56 2012 +0100
4
5    Fix incorrect processing of DNS info from DHCP (revised patch)
6
7Index: rtems/cpukit/libnetworking/rtems/rtems_dhcp.c
8===================================================================
9--- rtems.orig/cpukit/libnetworking/rtems/rtems_dhcp.c 2012-05-14 12:34:47.363444000 +0800
10+++ rtems/cpukit/libnetworking/rtems/rtems_dhcp.c 2012-05-14 12:35:04.922660000 +0800
11@@ -205,6 +205,35 @@
12                                                          DHCP_DNS,
13                                                          DHCP_HOST,
14                                                          DHCP_DOMAIN_NAME };
15+#define NUM_NAMESERVERS \
16+ (sizeof rtems_bsdnet_config.name_server / sizeof rtems_bsdnet_config.name_server[0])
17+static struct in_addr rtems_dhcpd_nameserver[NUM_NAMESERVERS];
18+static int rtems_dhcpd_nameserver_count = 0;
19+
20+/*
21+ * Clean any DNS entries add by a DHCP request.
22+ */
23+static void
24+clean_dns_entries (void)
25+{
26+ int e;
27+ for (e = 0; e < rtems_dhcpd_nameserver_count; ++e)
28+ {
29+ int n;
30+ for (n = 0; n < rtems_bsdnet_nameserver_count; ++ n)
31+ {
32+ if (memcmp (&rtems_dhcpd_nameserver[e], &rtems_bsdnet_nameserver[n], 4) == 0)
33+ {
34+ if (n < (NUM_NAMESERVERS - 1))
35+ memmove (&rtems_bsdnet_nameserver[n],
36+ &rtems_bsdnet_nameserver[n + 1],
37+ (NUM_NAMESERVERS - n - 1) * 4);
38+ --rtems_bsdnet_nameserver_count;
39+ }
40+ }
41+ }
42+ rtems_dhcpd_nameserver_count = 0;
43+}
44 
45 /*
46  * Format an IP address in dotted decimal.
47@@ -363,10 +392,12 @@
48         {
49           int dlen = 0;
50           while ((dlen < len) &&
51- (rtems_bsdnet_nameserver_count <
52- sizeof rtems_bsdnet_config.name_server /
53- sizeof rtems_bsdnet_config.name_server[0]))
54+ (rtems_dhcpd_nameserver_count < NUM_NAMESERVERS) &&
55+ (rtems_bsdnet_nameserver_count < NUM_NAMESERVERS))
56           {
57+ memcpy (&rtems_dhcpd_nameserver
58+ [rtems_dhcpd_nameserver_count], p + dlen, 4);
59+ rtems_dhcpd_nameserver_count++;
60             memcpy (&rtems_bsdnet_nameserver
61                     [rtems_bsdnet_nameserver_count], p + dlen, 4);
62             rtems_bsdnet_nameserver_count++;
63@@ -743,6 +774,15 @@
64         continue;
65       }
66 
67+ /*
68+ * We have an ack. Clear the DNS entries that have been assigned by a previous
69+ * DHCP request.
70+ */
71+ clean_dns_entries ();
72+
73+ /*
74+ * Process this requests options.
75+ */
76       process_options (&dhcp_req.vend[4], sizeof (dhcp_req.vend) - 4);
77 
78       if (dhcp_message_type != DHCP_ACK)
79@@ -857,6 +897,8 @@
80   struct sockaddr_dl *sdl = NULL;
81   struct proc *procp = NULL;
82 
83+ clean_dns_entries();
84+
85   /*
86    * If we are to update the files create the root
87    * file structure.
88

Archive Download this file

Branches:
master



interactive