diff options
author | Brian Foley <bpfoley@google.com> | 2016-10-25 14:20:55 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2016-10-25 14:20:55 +0200 |
commit | f9beeb22e2a4128ed85a8dc267d0823e5cfd3f47 (patch) | |
tree | 6c83a9185531079940b7c5b0d687c253a4bced06 | |
parent | 69312e87b008363575a6d6603f54f94d8150e1cc (diff) | |
download | busybox-w32-f9beeb22e2a4128ed85a8dc267d0823e5cfd3f47.tar.gz busybox-w32-f9beeb22e2a4128ed85a8dc267d0823e5cfd3f47.tar.bz2 busybox-w32-f9beeb22e2a4128ed85a8dc267d0823e5cfd3f47.zip |
udhcpc: check read of option length byte to be within packet
function old new delta
udhcp_get_option 215 220 +5
udhcp_run_script 802 803 +1
Signed-off-by: Brian Foley <bpfoley@google.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | networking/udhcp/common.c | 8 | ||||
-rw-r--r-- | networking/udhcp/dhcpc.c | 4 |
2 files changed, 9 insertions, 3 deletions
diff --git a/networking/udhcp/common.c b/networking/udhcp/common.c index 0cf4dab63..589bcd674 100644 --- a/networking/udhcp/common.c +++ b/networking/udhcp/common.c | |||
@@ -226,9 +226,12 @@ uint8_t* FAST_FUNC udhcp_get_option(struct dhcp_packet *packet, int code) | |||
226 | rem = sizeof(packet->options); | 226 | rem = sizeof(packet->options); |
227 | while (1) { | 227 | while (1) { |
228 | if (rem <= 0) { | 228 | if (rem <= 0) { |
229 | complain: | ||
229 | bb_error_msg("bad packet, malformed option field"); | 230 | bb_error_msg("bad packet, malformed option field"); |
230 | return NULL; | 231 | return NULL; |
231 | } | 232 | } |
233 | |||
234 | /* DHCP_PADDING and DHCP_END have no [len] byte */ | ||
232 | if (optionptr[OPT_CODE] == DHCP_PADDING) { | 235 | if (optionptr[OPT_CODE] == DHCP_PADDING) { |
233 | rem--; | 236 | rem--; |
234 | optionptr++; | 237 | optionptr++; |
@@ -251,10 +254,13 @@ uint8_t* FAST_FUNC udhcp_get_option(struct dhcp_packet *packet, int code) | |||
251 | } | 254 | } |
252 | break; | 255 | break; |
253 | } | 256 | } |
257 | |||
258 | if (rem <= OPT_LEN) | ||
259 | goto complain; /* complain and return NULL */ | ||
254 | len = 2 + optionptr[OPT_LEN]; | 260 | len = 2 + optionptr[OPT_LEN]; |
255 | rem -= len; | 261 | rem -= len; |
256 | if (rem < 0) | 262 | if (rem < 0) |
257 | continue; /* complain and return NULL */ | 263 | goto complain; /* complain and return NULL */ |
258 | 264 | ||
259 | if (optionptr[OPT_CODE] == code) { | 265 | if (optionptr[OPT_CODE] == code) { |
260 | log_option("option found", optionptr); | 266 | log_option("option found", optionptr); |
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c index bef73277a..1c1051107 100644 --- a/networking/udhcp/dhcpc.c +++ b/networking/udhcp/dhcpc.c | |||
@@ -450,7 +450,7 @@ static char **fill_envp(struct dhcp_packet *packet) | |||
450 | temp = udhcp_get_option(packet, i); | 450 | temp = udhcp_get_option(packet, i); |
451 | if (temp) { | 451 | if (temp) { |
452 | if (i == DHCP_OPTION_OVERLOAD) | 452 | if (i == DHCP_OPTION_OVERLOAD) |
453 | overload = *temp; | 453 | overload |= *temp; |
454 | else if (i == DHCP_SUBNET) | 454 | else if (i == DHCP_SUBNET) |
455 | envc++; /* for $mask */ | 455 | envc++; /* for $mask */ |
456 | envc++; | 456 | envc++; |
@@ -476,7 +476,7 @@ static char **fill_envp(struct dhcp_packet *packet) | |||
476 | * uint16_t secs; // elapsed since client began acquisition/renewal | 476 | * uint16_t secs; // elapsed since client began acquisition/renewal |
477 | * uint16_t flags; // only one flag so far: bcast. Never set by server | 477 | * uint16_t flags; // only one flag so far: bcast. Never set by server |
478 | * uint32_t ciaddr; // client IP (usually == yiaddr. can it be different | 478 | * uint32_t ciaddr; // client IP (usually == yiaddr. can it be different |
479 | * // if during renew server wants to give us differn IP?) | 479 | * // if during renew server wants to give us different IP?) |
480 | * uint32_t gateway_nip; // relay agent IP address | 480 | * uint32_t gateway_nip; // relay agent IP address |
481 | * uint8_t chaddr[16]; // link-layer client hardware address (MAC) | 481 | * uint8_t chaddr[16]; // link-layer client hardware address (MAC) |
482 | * TODO: export gateway_nip as $giaddr? | 482 | * TODO: export gateway_nip as $giaddr? |