aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2021-09-02 14:40:54 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2021-09-02 14:40:54 +0200
commit62d0c8e02872d444ba20b4bdf638ac26c509a3dd (patch)
tree1c7b9da0053ae54b7ab7fdeb18b7cccdf7ff3356
parentd99dee944eabab5184c356027b0a7a9dd9e2541a (diff)
downloadbusybox-w32-62d0c8e02872d444ba20b4bdf638ac26c509a3dd.tar.gz
busybox-w32-62d0c8e02872d444ba20b4bdf638ac26c509a3dd.tar.bz2
busybox-w32-62d0c8e02872d444ba20b4bdf638ac26c509a3dd.zip
udhcpd: check config file for bad IP ranges (start > end)
function old new delta .rodata 104209 104238 +29 read_config 208 225 +17 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 2/0 up/down: 46/0) Total: 46 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--networking/udhcp/dhcpd.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/networking/udhcp/dhcpd.c b/networking/udhcp/dhcpd.c
index eef8a3b59..b67dfc3bc 100644
--- a/networking/udhcp/dhcpd.c
+++ b/networking/udhcp/dhcpd.c
@@ -451,6 +451,8 @@ static NOINLINE void read_config(const char *file)
451 451
452 server_data.start_ip = ntohl(server_data.start_ip); 452 server_data.start_ip = ntohl(server_data.start_ip);
453 server_data.end_ip = ntohl(server_data.end_ip); 453 server_data.end_ip = ntohl(server_data.end_ip);
454 if (server_data.start_ip > server_data.end_ip)
455 bb_error_msg_and_die("bad start/end IP range in %s", file);
454} 456}
455 457
456static void write_leases(void) 458static void write_leases(void)
@@ -858,7 +860,6 @@ int udhcpd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
858int udhcpd_main(int argc UNUSED_PARAM, char **argv) 860int udhcpd_main(int argc UNUSED_PARAM, char **argv)
859{ 861{
860 int server_socket = -1, retval; 862 int server_socket = -1, retval;
861 uint8_t *state;
862 unsigned timeout_end; 863 unsigned timeout_end;
863 unsigned num_ips; 864 unsigned num_ips;
864 unsigned opt; 865 unsigned opt;
@@ -966,6 +967,7 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
966 struct dhcp_packet packet; 967 struct dhcp_packet packet;
967 int bytes; 968 int bytes;
968 int tv; 969 int tv;
970 uint8_t *msg_type;
969 uint8_t *server_id_opt; 971 uint8_t *server_id_opt;
970 uint8_t *requested_ip_opt; 972 uint8_t *requested_ip_opt;
971 uint32_t requested_nip; 973 uint32_t requested_nip;
@@ -1040,8 +1042,8 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
1040 bb_info_msg("not a REQUEST%s", ", ignoring packet"); 1042 bb_info_msg("not a REQUEST%s", ", ignoring packet");
1041 continue; 1043 continue;
1042 } 1044 }
1043 state = udhcp_get_option(&packet, DHCP_MESSAGE_TYPE); 1045 msg_type = udhcp_get_option(&packet, DHCP_MESSAGE_TYPE);
1044 if (state == NULL || state[0] < DHCP_MINTYPE || state[0] > DHCP_MAXTYPE) { 1046 if (!msg_type || msg_type[0] < DHCP_MINTYPE || msg_type[0] > DHCP_MAXTYPE) {
1045 bb_info_msg("no or bad message type option%s", ", ignoring packet"); 1047 bb_info_msg("no or bad message type option%s", ", ignoring packet");
1046 continue; 1048 continue;
1047 } 1049 }
@@ -1077,7 +1079,7 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
1077 move_from_unaligned32(requested_nip, requested_ip_opt); 1079 move_from_unaligned32(requested_nip, requested_ip_opt);
1078 } 1080 }
1079 1081
1080 switch (state[0]) { 1082 switch (msg_type[0]) {
1081 1083
1082 case DHCPDISCOVER: 1084 case DHCPDISCOVER:
1083 log1("received %s", "DISCOVER"); 1085 log1("received %s", "DISCOVER");