summaryrefslogtreecommitdiff
path: root/networking/udhcp/dhcpc.c
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2008-05-26 17:32:35 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2008-05-26 17:32:35 +0000
commitfc9e1080320e52fb97ae694627d8101af64f3dad (patch)
tree2b57edddb15071f8fa13a47e45a735d0e8c52edc /networking/udhcp/dhcpc.c
parent6bb55cfb99090565d565588c281c08ca21993e78 (diff)
downloadbusybox-w32-fc9e1080320e52fb97ae694627d8101af64f3dad.tar.gz
busybox-w32-fc9e1080320e52fb97ae694627d8101af64f3dad.tar.bz2
busybox-w32-fc9e1080320e52fb97ae694627d8101af64f3dad.zip
udhcpc: shrink
udhcpc: guard against zero lease time function old new delta timeout 4 - -4 server_addr 4 - -4 requested_ip 4 - -4 perform_release 134 112 -22 udhcpc_main 2511 2485 -26 ------------------------------------------------------------------------------ (add/remove: 0/3 grow/shrink: 0/2 up/down: 0/-60) Total: -60 bytes
Diffstat (limited to 'networking/udhcp/dhcpc.c')
-rw-r--r--networking/udhcp/dhcpc.c33
1 files changed, 22 insertions, 11 deletions
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c
index fef8632f6..f1aa36fe6 100644
--- a/networking/udhcp/dhcpc.c
+++ b/networking/udhcp/dhcpc.c
@@ -18,9 +18,6 @@
18#include "options.h" 18#include "options.h"
19 19
20 20
21static int timeout; /* = 0. Must be signed */
22static uint32_t requested_ip; /* = 0 */
23static uint32_t server_addr;
24static int sockfd = -1; 21static int sockfd = -1;
25 22
26#define LISTEN_NONE 0 23#define LISTEN_NONE 0
@@ -28,6 +25,14 @@ static int sockfd = -1;
28#define LISTEN_RAW 2 25#define LISTEN_RAW 2
29static smallint listen_mode; 26static smallint listen_mode;
30 27
28#define INIT_SELECTING 0
29#define REQUESTING 1
30#define BOUND 2
31#define RENEWING 3
32#define REBINDING 4
33#define INIT_REBOOT 5
34#define RENEW_REQUESTED 6
35#define RELEASED 7
31static smallint state; 36static smallint state;
32 37
33/* struct client_config_t client_config is in bb_common_bufsiz1 */ 38/* struct client_config_t client_config is in bb_common_bufsiz1 */
@@ -71,7 +76,7 @@ static void perform_renew(void)
71 76
72 77
73/* perform a release */ 78/* perform a release */
74static void perform_release(void) 79static void perform_release(uint32_t requested_ip, uint32_t server_addr)
75{ 80{
76 char buffer[sizeof("255.255.255.255")]; 81 char buffer[sizeof("255.255.255.255")];
77 struct in_addr temp_addr; 82 struct in_addr temp_addr;
@@ -90,7 +95,6 @@ static void perform_release(void)
90 95
91 change_listen_mode(LISTEN_NONE); 96 change_listen_mode(LISTEN_NONE);
92 state = RELEASED; 97 state = RELEASED;
93 timeout = INT_MAX;
94} 98}
95 99
96 100
@@ -140,9 +144,12 @@ int udhcpc_main(int argc ATTRIBUTE_UNUSED, char **argv)
140 int tryagain_timeout = 20; 144 int tryagain_timeout = 20;
141 int discover_timeout = 3; 145 int discover_timeout = 3;
142 int discover_retries = 3; 146 int discover_retries = 3;
147 uint32_t server_addr = server_addr; /* for compiler */
148 uint32_t requested_ip = 0;
143 uint32_t xid = 0; 149 uint32_t xid = 0;
144 uint32_t lease_seconds = 0; /* can be given as 32-bit quantity */ 150 uint32_t lease_seconds = 0; /* can be given as 32-bit quantity */
145 int packet_num; 151 int packet_num;
152 int timeout; /* must be signed */
146 unsigned already_waited_sec; 153 unsigned already_waited_sec;
147 unsigned opt; 154 unsigned opt;
148 int max_fd; 155 int max_fd;
@@ -332,6 +339,7 @@ int udhcpc_main(int argc ATTRIBUTE_UNUSED, char **argv)
332 udhcp_run_script(NULL, "deconfig"); 339 udhcp_run_script(NULL, "deconfig");
333 change_listen_mode(LISTEN_RAW); 340 change_listen_mode(LISTEN_RAW);
334 packet_num = 0; 341 packet_num = 0;
342 timeout = 0;
335 already_waited_sec = 0; 343 already_waited_sec = 0;
336 344
337 /* Main event loop. select() waits on signal pipe and possibly 345 /* Main event loop. select() waits on signal pipe and possibly
@@ -510,8 +518,8 @@ int udhcpc_main(int argc ATTRIBUTE_UNUSED, char **argv)
510 continue; 518 continue;
511 /* still selecting - this server looks bad */ 519 /* still selecting - this server looks bad */
512 } 520 }
513 /* can be misaligned, thus memcpy */ 521 /* it IS unaligned sometimes, don't "optimize" */
514 memcpy(&server_addr, temp, 4); 522 server_addr = get_unaligned_u32p((uint32_t*)temp);
515 xid = packet.xid; 523 xid = packet.xid;
516 requested_ip = packet.yiaddr; 524 requested_ip = packet.yiaddr;
517 525
@@ -535,7 +543,9 @@ int udhcpc_main(int argc ATTRIBUTE_UNUSED, char **argv)
535 /* can be misaligned, thus memcpy */ 543 /* can be misaligned, thus memcpy */
536 memcpy(&lease_seconds, temp, 4); 544 memcpy(&lease_seconds, temp, 4);
537 lease_seconds = ntohl(lease_seconds); 545 lease_seconds = ntohl(lease_seconds);
538 lease_seconds &= 0x0fffffff; /* paranoia: must not be negative */ 546 lease_seconds &= 0x0fffffff; /* paranoia: must not be prone to overflows */
547 if (lease_seconds < 10) /* and not too small */
548 lease_seconds = 10;
539 } 549 }
540#if ENABLE_FEATURE_UDHCPC_ARPING 550#if ENABLE_FEATURE_UDHCPC_ARPING
541 if (opt & OPT_a) { 551 if (opt & OPT_a) {
@@ -576,7 +586,7 @@ int udhcpc_main(int argc ATTRIBUTE_UNUSED, char **argv)
576 change_listen_mode(LISTEN_NONE); 586 change_listen_mode(LISTEN_NONE);
577 if (client_config.quit_after_lease) { 587 if (client_config.quit_after_lease) {
578 if (client_config.release_on_quit) 588 if (client_config.release_on_quit)
579 perform_release(); 589 perform_release(requested_ip, server_addr);
580 goto ret0; 590 goto ret0;
581 } 591 }
582 if (!client_config.foreground) 592 if (!client_config.foreground)
@@ -618,12 +628,13 @@ int udhcpc_main(int argc ATTRIBUTE_UNUSED, char **argv)
618 timeout = 0; 628 timeout = 0;
619 break; 629 break;
620 case SIGUSR2: 630 case SIGUSR2:
621 perform_release(); 631 perform_release(requested_ip, server_addr);
632 timeout = INT_MAX;
622 break; 633 break;
623 case SIGTERM: 634 case SIGTERM:
624 bb_info_msg("Received SIGTERM"); 635 bb_info_msg("Received SIGTERM");
625 if (client_config.release_on_quit) 636 if (client_config.release_on_quit)
626 perform_release(); 637 perform_release(requested_ip, server_addr);
627 goto ret0; 638 goto ret0;
628 } 639 }
629 } 640 }