diff options
Diffstat (limited to 'usr.sbin/dhcpd/confpars.c')
| -rw-r--r-- | usr.sbin/dhcpd/confpars.c | 57 |
1 files changed, 32 insertions, 25 deletions
diff --git a/usr.sbin/dhcpd/confpars.c b/usr.sbin/dhcpd/confpars.c index 654b7a5d905..8b79d263a80 100644 --- a/usr.sbin/dhcpd/confpars.c +++ b/usr.sbin/dhcpd/confpars.c @@ -1,4 +1,4 @@ -/* $OpenBSD: confpars.c,v 1.23 2014/07/09 13:42:24 yasuoka Exp $ */ +/* $OpenBSD: confpars.c,v 1.24 2015/05/18 17:51:21 krw Exp $ */ /* * Copyright (c) 1995, 1996, 1997 The Internet Software Consortium. @@ -825,6 +825,7 @@ void parse_group_declaration(cfile, group) int parse_cidr(FILE *cfile, unsigned char *addr, unsigned char *prefix) { + const char *errstr; char *val; int token; int len = 4; @@ -842,12 +843,12 @@ parse_cidr(FILE *cfile, unsigned char *addr, unsigned char *prefix) goto nocidr; } - *prefix = 0; token = next_token(&val, cfile); - if (token == TOK_NUMBER) - convert_num(prefix, val, 10, 8); + if (token == TOK_NUMBER_OR_NAME) + *prefix = strtonum(val, 0, 32, &errstr); - if (token != TOK_NUMBER || *prefix > 32) { + if (token != TOK_NUMBER_OR_NAME || errstr) { + *prefix = 0; parse_warn("Expecting CIDR prefix length, got '%s'", val); goto nocidr; } @@ -879,23 +880,28 @@ struct tree *parse_ip_addr_or_hostname(cfile, uniform) struct tree *rv; struct hostent *h; + name = NULL; + h = NULL; + token = peek_token(&val, cfile); if (is_identifier(token)) { name = parse_host_name(cfile); - if (!name) - return NULL; - h = gethostbyname(name); - if (h == NULL) { - parse_warn("%s (%d): could not resolve hostname", - val, token); - return NULL; + if (name) + h = gethostbyname(name); + if (name && h) { + rv = tree_const(h->h_addr_list[0], h->h_length); + if (!uniform) + rv = tree_limit(rv, 4); + return rv; } - rv = tree_const(h->h_addr_list[0], h->h_length); - if (!uniform) - rv = tree_limit(rv, 4); - } else if (token == TOK_NUMBER) { - if (!parse_numeric_aggregate(cfile, addr, &len, '.', 10, 8)) + } + + if (token == TOK_NUMBER_OR_NAME) { + if (!parse_numeric_aggregate(cfile, addr, &len, '.', 10, 8)) { + parse_warn("%s (%d): expecting IP address or hostname", + val, token); return NULL; + } rv = tree_const(addr, len); } else { if (token != '{' && token != '}') @@ -1037,15 +1043,13 @@ void parse_option_param(cfile, group) switch (*fmt) { case 'X': token = peek_token(&val, cfile); - if (token == TOK_NUMBER_OR_NAME || - token == TOK_NUMBER) { + if (token == TOK_NUMBER_OR_NAME) { do { token = next_token (&val, cfile); - if (token != TOK_NUMBER && - token != TOK_NUMBER_OR_NAME) { + if (token != TOK_NUMBER_OR_NAME) { parse_warn("expecting " - "number."); + "hex number."); if (token != ';') skip_to_semi( cfile); @@ -1096,7 +1100,8 @@ void parse_option_param(cfile, group) case 'L': /* Unsigned 32-bit integer... */ case 'l': /* Signed 32-bit integer... */ token = next_token(&val, cfile); - if (token != TOK_NUMBER) { + if (token != TOK_NUMBER && token != + TOK_NUMBER_OR_NAME) { parse_warn("expecting number."); if (token != ';') skip_to_semi(cfile); @@ -1108,7 +1113,8 @@ void parse_option_param(cfile, group) case 's': /* Signed 16-bit integer. */ case 'S': /* Unsigned 16-bit integer. */ token = next_token(&val, cfile); - if (token != TOK_NUMBER) { + if (token != TOK_NUMBER && token != + TOK_NUMBER_OR_NAME) { parse_warn("expecting number."); if (token != ';') skip_to_semi(cfile); @@ -1120,7 +1126,8 @@ void parse_option_param(cfile, group) case 'b': /* Signed 8-bit integer. */ case 'B': /* Unsigned 8-bit integer. */ token = next_token(&val, cfile); - if (token != TOK_NUMBER) { + if (token != TOK_NUMBER && token != + TOK_NUMBER_OR_NAME) { parse_warn("expecting number."); if (token != ';') skip_to_semi(cfile); |
