diff options
Diffstat (limited to 'networking/udhcp/common.c')
-rw-r--r-- | networking/udhcp/common.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/networking/udhcp/common.c b/networking/udhcp/common.c index 0cf4dab63..1aaf5255c 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); |
@@ -262,7 +268,8 @@ uint8_t* FAST_FUNC udhcp_get_option(struct dhcp_packet *packet, int code) | |||
262 | } | 268 | } |
263 | 269 | ||
264 | if (optionptr[OPT_CODE] == DHCP_OPTION_OVERLOAD) { | 270 | if (optionptr[OPT_CODE] == DHCP_OPTION_OVERLOAD) { |
265 | overload |= optionptr[OPT_DATA]; | 271 | if (len >= 3) |
272 | overload |= optionptr[OPT_DATA]; | ||
266 | /* fall through */ | 273 | /* fall through */ |
267 | } | 274 | } |
268 | optionptr += len; | 275 | optionptr += len; |