aboutsummaryrefslogtreecommitdiff
path: root/networking/udhcp/common.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2010-03-27 23:23:41 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2010-03-27 23:23:41 +0100
commit9107b63a7fb80fcab0da71cf12e8c81dfc394d20 (patch)
tree566be6323a69a09949110349e720e33d7dd66fb2 /networking/udhcp/common.c
parentc2fdd41f5f97349f23b2a66592b9b29834faabaf (diff)
downloadbusybox-w32-9107b63a7fb80fcab0da71cf12e8c81dfc394d20.tar.gz
busybox-w32-9107b63a7fb80fcab0da71cf12e8c81dfc394d20.tar.bz2
busybox-w32-9107b63a7fb80fcab0da71cf12e8c81dfc394d20.zip
udhcp: abort if we see unknown option, and show valid options if so
function old new delta udhcp_option_idx - 77 +77 udhcp_str2optset 366 351 -15 udhcpc_main 2845 2801 -44 ------------------------------------------------------------------------------ (add/remove: 1/0 grow/shrink: 0/2 up/down: 77/-59) Total: 18 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'networking/udhcp/common.c')
-rw-r--r--networking/udhcp/common.c26
1 files changed, 21 insertions, 5 deletions
diff --git a/networking/udhcp/common.c b/networking/udhcp/common.c
index 9316774ff..6e8ec3e64 100644
--- a/networking/udhcp/common.c
+++ b/networking/udhcp/common.c
@@ -146,6 +146,25 @@ static void log_option(const char *pfx, const uint8_t *opt)
146# define log_option(pfx, opt) ((void)0) 146# define log_option(pfx, opt) ((void)0)
147#endif 147#endif
148 148
149unsigned FAST_FUNC udhcp_option_idx(const char *name)
150{
151 int n = index_in_strings(dhcp_option_strings, name);
152 if (n >= 0)
153 return n;
154
155 {
156 char buf[sizeof(dhcp_option_strings)];
157 char *d = buf;
158 const char *s = dhcp_option_strings;
159 while (s < dhcp_option_strings + sizeof(dhcp_option_strings) - 2) {
160 *d++ = (*s == '\0' ? ' ' : *s);
161 s++;
162 }
163 *d = '\0';
164 bb_error_msg_and_die("unknown option '%s', known options: %s", name, buf);
165 }
166}
167
149/* get an option with bounds checking (warning, result is not aligned). */ 168/* get an option with bounds checking (warning, result is not aligned). */
150uint8_t* FAST_FUNC udhcp_get_option(struct dhcp_packet *packet, int code) 169uint8_t* FAST_FUNC udhcp_get_option(struct dhcp_packet *packet, int code)
151{ 170{
@@ -372,7 +391,7 @@ int FAST_FUNC udhcp_str2optset(const char *const_str, void *arg)
372 char *opt, *val, *endptr; 391 char *opt, *val, *endptr;
373 char *str; 392 char *str;
374 const struct dhcp_option *option; 393 const struct dhcp_option *option;
375 int retval, length, idx; 394 int retval, length;
376 char buffer[8] ALIGNED(4); 395 char buffer[8] ALIGNED(4);
377 uint16_t *result_u16 = (uint16_t *) buffer; 396 uint16_t *result_u16 = (uint16_t *) buffer;
378 uint32_t *result_u32 = (uint32_t *) buffer; 397 uint32_t *result_u32 = (uint32_t *) buffer;
@@ -383,10 +402,7 @@ int FAST_FUNC udhcp_str2optset(const char *const_str, void *arg)
383 if (!opt) 402 if (!opt)
384 return 0; 403 return 0;
385 404
386 idx = index_in_strings(dhcp_option_strings, opt); /* NB: was strcasecmp! */ 405 option = &dhcp_options[udhcp_option_idx(opt)];
387 if (idx < 0)
388 return 0;
389 option = &dhcp_options[idx];
390 406
391 retval = 0; 407 retval = 0;
392 do { 408 do {