diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2021-09-02 14:40:54 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2021-09-02 14:40:54 +0200 |
commit | 62d0c8e02872d444ba20b4bdf638ac26c509a3dd (patch) | |
tree | 1c7b9da0053ae54b7ab7fdeb18b7cccdf7ff3356 | |
parent | d99dee944eabab5184c356027b0a7a9dd9e2541a (diff) | |
download | busybox-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.c | 10 |
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 | ||
456 | static void write_leases(void) | 458 | static void write_leases(void) |
@@ -858,7 +860,6 @@ int udhcpd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | |||
858 | int udhcpd_main(int argc UNUSED_PARAM, char **argv) | 860 | int 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"); |