aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2021-06-15 01:15:44 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2021-06-15 01:15:44 +0200
commit9e27fed6b9a21454149873cfc4e034c8226f8ffb (patch)
tree65b2833c8e33b7beb2465a0334b52ada7b103a9a
parent827b690fa7b9dd006f305449c342fb1b9bff6fb7 (diff)
downloadbusybox-w32-9e27fed6b9a21454149873cfc4e034c8226f8ffb.tar.gz
busybox-w32-9e27fed6b9a21454149873cfc4e034c8226f8ffb.tar.bz2
busybox-w32-9e27fed6b9a21454149873cfc4e034c8226f8ffb.zip
udhcpc: rename server_addr to server_id, fix id comparison if it's not specified
Even though it is _meant to be_ an IP address, in the wild servers sometimes give bogus server ids, like 1.1.1.1 function old new delta udhcpc_main 2551 2542 -9 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--networking/udhcp/dhcpc.c44
1 files changed, 19 insertions, 25 deletions
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c
index 1c3c478ac..d67f60c00 100644
--- a/networking/udhcp/dhcpc.c
+++ b/networking/udhcp/dhcpc.c
@@ -1113,7 +1113,7 @@ static void change_listen_mode(int new_mode)
1113 /* else LISTEN_NONE: client_data.sockfd stays closed */ 1113 /* else LISTEN_NONE: client_data.sockfd stays closed */
1114} 1114}
1115 1115
1116static void perform_release(uint32_t server_addr, uint32_t requested_ip) 1116static void perform_release(uint32_t server_id, uint32_t requested_ip)
1117{ 1117{
1118 char buffer[sizeof("255.255.255.255")]; 1118 char buffer[sizeof("255.255.255.255")];
1119 struct in_addr temp_addr; 1119 struct in_addr temp_addr;
@@ -1126,13 +1126,13 @@ static void perform_release(uint32_t server_addr, uint32_t requested_ip)
1126 || client_data.state == REBINDING 1126 || client_data.state == REBINDING
1127 || client_data.state == RENEW_REQUESTED 1127 || client_data.state == RENEW_REQUESTED
1128 ) { 1128 ) {
1129 temp_addr.s_addr = server_addr; 1129 temp_addr.s_addr = server_id;
1130 strcpy(buffer, inet_ntoa(temp_addr)); 1130 strcpy(buffer, inet_ntoa(temp_addr));
1131 temp_addr.s_addr = requested_ip; 1131 temp_addr.s_addr = requested_ip;
1132 bb_info_msg("unicasting a release of %s to %s", 1132 bb_info_msg("unicasting a release of %s to %s",
1133 inet_ntoa(temp_addr), buffer); 1133 inet_ntoa(temp_addr), buffer);
1134 client_data.xid = random_xid(); //TODO: can omit? 1134 client_data.xid = random_xid(); //TODO: can omit?
1135 send_release(server_addr, requested_ip); /* unicast */ 1135 send_release(server_id, requested_ip); /* unicast */
1136 } 1136 }
1137 bb_simple_info_msg("entering released state"); 1137 bb_simple_info_msg("entering released state");
1138/* 1138/*
@@ -1218,7 +1218,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
1218 int tryagain_timeout = 20; 1218 int tryagain_timeout = 20;
1219 int discover_timeout = 3; 1219 int discover_timeout = 3;
1220 int discover_retries = 3; 1220 int discover_retries = 3;
1221 uint32_t server_addr = server_addr; /* for compiler */ 1221 uint32_t server_id = server_id; /* for compiler */
1222 uint32_t requested_ip = 0; 1222 uint32_t requested_ip = 0;
1223 int packet_num; 1223 int packet_num;
1224 int timeout; /* must be signed */ 1224 int timeout; /* must be signed */
@@ -1481,7 +1481,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
1481 case REQUESTING: 1481 case REQUESTING:
1482 if (packet_num < 3) { 1482 if (packet_num < 3) {
1483 /* send broadcast select packet */ 1483 /* send broadcast select packet */
1484 send_select(server_addr, requested_ip); 1484 send_select(server_id, requested_ip);
1485 timeout = discover_timeout; 1485 timeout = discover_timeout;
1486 packet_num++; 1486 packet_num++;
1487 continue; 1487 continue;
@@ -1512,7 +1512,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
1512 * Anyway, it does recover by eventually failing through 1512 * Anyway, it does recover by eventually failing through
1513 * into INIT_SELECTING state. 1513 * into INIT_SELECTING state.
1514 */ 1514 */
1515 if (send_renew(server_addr, requested_ip) >= 0) { 1515 if (send_renew(server_id, requested_ip) >= 0) {
1516 timeout = discover_timeout; 1516 timeout = discover_timeout;
1517 packet_num++; 1517 packet_num++;
1518 continue; 1518 continue;
@@ -1603,7 +1603,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
1603 timeout = 0; 1603 timeout = 0;
1604 continue; 1604 continue;
1605 case SIGUSR2: 1605 case SIGUSR2:
1606 perform_release(server_addr, requested_ip); 1606 perform_release(server_id, requested_ip);
1607 /* ^^^ switches to LISTEN_NONE */ 1607 /* ^^^ switches to LISTEN_NONE */
1608 timeout = INT_MAX; 1608 timeout = INT_MAX;
1609 continue; 1609 continue;
@@ -1688,13 +1688,13 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
1688 * They either supply DHCP_SERVER_ID of 0.0.0.0 or don't supply it at all. 1688 * They either supply DHCP_SERVER_ID of 0.0.0.0 or don't supply it at all.
1689 * They say ISC DHCP client supports this case. 1689 * They say ISC DHCP client supports this case.
1690 */ 1690 */
1691 server_addr = 0; 1691 server_id = 0;
1692 temp = udhcp_get_option32(&packet, DHCP_SERVER_ID); 1692 temp = udhcp_get_option32(&packet, DHCP_SERVER_ID);
1693 if (!temp) { 1693 if (!temp) {
1694 bb_simple_info_msg("no server ID, using 0.0.0.0"); 1694 bb_simple_info_msg("no server ID, using 0.0.0.0");
1695 } else { 1695 } else {
1696 /* it IS unaligned sometimes, don't "optimize" */ 1696 /* it IS unaligned sometimes, don't "optimize" */
1697 move_from_unaligned32(server_addr, temp); 1697 move_from_unaligned32(server_id, temp);
1698 } 1698 }
1699 /*xid = packet.xid; - already is */ 1699 /*xid = packet.xid; - already is */
1700 temp_addr.s_addr = requested_ip = packet.yiaddr; 1700 temp_addr.s_addr = requested_ip = packet.yiaddr;
@@ -1718,7 +1718,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
1718 1718
1719 change_listen_mode(LISTEN_NONE); 1719 change_listen_mode(LISTEN_NONE);
1720 1720
1721 temp_addr.s_addr = server_addr; 1721 temp_addr.s_addr = server_id;
1722 strcpy(server_str, inet_ntoa(temp_addr)); 1722 strcpy(server_str, inet_ntoa(temp_addr));
1723 temp_addr.s_addr = packet.yiaddr; 1723 temp_addr.s_addr = packet.yiaddr;
1724 1724
@@ -1766,7 +1766,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
1766 bb_simple_info_msg("offered address is in use " 1766 bb_simple_info_msg("offered address is in use "
1767 "(got ARP reply), declining"); 1767 "(got ARP reply), declining");
1768 client_data.xid = random_xid(); //TODO: can omit? 1768 client_data.xid = random_xid(); //TODO: can omit?
1769 send_decline(server_addr, packet.yiaddr); 1769 send_decline(server_id, packet.yiaddr);
1770 1770
1771 if (client_data.state != REQUESTING) 1771 if (client_data.state != REQUESTING)
1772 d4_run_script_deconfig(); 1772 d4_run_script_deconfig();
@@ -1810,20 +1810,14 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
1810 * "wrong" server can reply first, with a NAK. 1810 * "wrong" server can reply first, with a NAK.
1811 * Do not interpret it as a NAK from "our" server. 1811 * Do not interpret it as a NAK from "our" server.
1812 */ 1812 */
1813 if (server_addr != 0) { 1813 uint32_t svid = 0; /* we treat no server id as 0.0.0.0 */
1814 uint32_t svid; 1814 uint8_t *temp = udhcp_get_option32(&packet, DHCP_SERVER_ID);
1815 uint8_t *temp; 1815 if (temp)
1816
1817 temp = udhcp_get_option32(&packet, DHCP_SERVER_ID);
1818 if (!temp) {
1819 non_matching_svid:
1820 log1("received DHCP NAK with wrong"
1821 " server ID%s", ", ignoring packet");
1822 continue;
1823 }
1824 move_from_unaligned32(svid, temp); 1816 move_from_unaligned32(svid, temp);
1825 if (svid != server_addr) 1817 if (svid != server_id) {
1826 goto non_matching_svid; 1818 log1("received DHCP NAK with wrong"
1819 " server ID%s", ", ignoring packet");
1820 continue;
1827 } 1821 }
1828 /* return to init state */ 1822 /* return to init state */
1829 change_listen_mode(LISTEN_NONE); 1823 change_listen_mode(LISTEN_NONE);
@@ -1847,7 +1841,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
1847 1841
1848 ret0: 1842 ret0:
1849 if (opt & OPT_R) /* release on quit */ 1843 if (opt & OPT_R) /* release on quit */
1850 perform_release(server_addr, requested_ip); 1844 perform_release(server_id, requested_ip);
1851 retval = 0; 1845 retval = 0;
1852 ret: 1846 ret:
1853 /*if (client_data.pidfile) - remove_pidfile has its own check */ 1847 /*if (client_data.pidfile) - remove_pidfile has its own check */