diff options
Diffstat (limited to 'networking/udhcp/common.c')
-rw-r--r-- | networking/udhcp/common.c | 8 |
1 files changed, 7 insertions, 1 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); |