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>
This commit is contained in:
Denys Vlasenko
2010-03-27 23:23:41 +01:00
parent c2fdd41f5f
commit 9107b63a7f
3 changed files with 26 additions and 12 deletions

View File

@ -146,6 +146,25 @@ static void log_option(const char *pfx, const uint8_t *opt)
# define log_option(pfx, opt) ((void)0)
#endif
unsigned FAST_FUNC udhcp_option_idx(const char *name)
{
int n = index_in_strings(dhcp_option_strings, name);
if (n >= 0)
return n;
{
char buf[sizeof(dhcp_option_strings)];
char *d = buf;
const char *s = dhcp_option_strings;
while (s < dhcp_option_strings + sizeof(dhcp_option_strings) - 2) {
*d++ = (*s == '\0' ? ' ' : *s);
s++;
}
*d = '\0';
bb_error_msg_and_die("unknown option '%s', known options: %s", name, buf);
}
}
/* get an option with bounds checking (warning, result is not aligned). */
uint8_t* FAST_FUNC udhcp_get_option(struct dhcp_packet *packet, int code)
{
@ -372,7 +391,7 @@ int FAST_FUNC udhcp_str2optset(const char *const_str, void *arg)
char *opt, *val, *endptr;
char *str;
const struct dhcp_option *option;
int retval, length, idx;
int retval, length;
char buffer[8] ALIGNED(4);
uint16_t *result_u16 = (uint16_t *) buffer;
uint32_t *result_u32 = (uint32_t *) buffer;
@ -383,10 +402,7 @@ int FAST_FUNC udhcp_str2optset(const char *const_str, void *arg)
if (!opt)
return 0;
idx = index_in_strings(dhcp_option_strings, opt); /* NB: was strcasecmp! */
if (idx < 0)
return 0;
option = &dhcp_options[idx];
option = &dhcp_options[udhcp_option_idx(opt)];
retval = 0;
do {