udhcpc[6]: remove overzealous timeout clamping code
authorDenys Vlasenko <vda.linux@googlemail.com>
Wed, 17 Jan 2018 12:55:51 +0000 (13:55 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 17 Jan 2018 12:55:51 +0000 (13:55 +0100)
function                                             old     new   delta
udhcpc_main                                         2840    2826     -14
udhcpc6_main                                        2699    2670     -29

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
networking/udhcp/d6_dhcpc.c
networking/udhcp/dhcpc.c

index 460f3d9a49aa072b4d6f8442531f5e2af3b36972..f3a7b827ca2718225380eae7ced91fff2d90b80d 100644 (file)
@@ -1465,8 +1465,8 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
                        if (packet.d6_msg_type == D6_MSG_REPLY) {
                                uint32_t lease_seconds;
                                struct d6_option *option;
-                               int address_timeout;
-                               int prefix_timeout;
+                               unsigned address_timeout;
+                               unsigned prefix_timeout;
  type_is_ok:
                                address_timeout = 0;
                                prefix_timeout = 0;
@@ -1626,12 +1626,9 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
                                        move_from_unaligned32(lease_seconds, iaaddr->data + 16 + 4);
                                        lease_seconds = ntohl(lease_seconds);
 /// TODO: check for 0 lease time?
-                                       /* paranoia: must not be prone to overflows */
-                                       if (lease_seconds > 0x7fffffff / 1000)
-                                               lease_seconds = 0x7fffffff / 1000;
-                                       address_timeout = lease_seconds / 2;
                                        bb_error_msg("%s obtained, lease time %u",
                                                "IPv6", /*inet_ntoa(temp_addr),*/ (unsigned)lease_seconds);
+                                       address_timeout = lease_seconds;
                                }
                                if (option_mask32 & OPT_d) {
                                        struct d6_option *iaprefix;
@@ -1662,18 +1659,16 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
                                        }
                                        move_from_unaligned32(lease_seconds, iaprefix->data + 4);
                                        lease_seconds = ntohl(lease_seconds);
-                                       /* paranoia: must not be prone to overflows */
-                                       if (lease_seconds > 0x7fffffff / 1000)
-                                               lease_seconds = 0x7fffffff / 1000;
-                                       prefix_timeout = lease_seconds / 2;
                                        bb_error_msg("%s obtained, lease time %u",
                                                "prefix", /*inet_ntoa(temp_addr),*/ (unsigned)lease_seconds);
+                                       prefix_timeout = lease_seconds;
                                }
                                if (!address_timeout)
                                        address_timeout = prefix_timeout;
                                if (!prefix_timeout)
                                        prefix_timeout = address_timeout;
-                               timeout = address_timeout > prefix_timeout ? prefix_timeout : address_timeout;
+                               /* note: "int timeout" will not overflow even with 0xffffffff inputs here: */
+                               timeout = (prefix_timeout < address_timeout ? prefix_timeout : address_timeout) / 2;
                                /* paranoia: must not be too small */
                                if (timeout < 0x10)
                                        timeout = 0x10;
index 55f21c1870496dfdd729fd9927037b8dc70321a9..385fc499859056b263eaf43ceb09de3e14bd77e1 100644 (file)
@@ -1732,8 +1732,10 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
                                        /* paranoia: must not be too small and not prone to overflows */
                                        if (lease_seconds < 0x10)
                                                lease_seconds = 0x10;
-                                       if (lease_seconds > 0x7fffffff / 1000)
-                                               lease_seconds = 0x7fffffff / 1000;
+                                       //if (lease_seconds > 0x7fffffff)
+                                       //      lease_seconds = 0x7fffffff;
+                                       //^^^not necessary since "timeout = lease_seconds / 2"
+                                       //does not overflow even for 0xffffffff.
                                }
 #if ENABLE_FEATURE_UDHCPC_ARPING
                                if (opt & OPT_a) {