summaryrefslogtreecommitdiff
path: root/sbin/dhclient/clparse.c
diff options
context:
space:
mode:
authorKenneth R Westerback <krw@cvs.openbsd.org>2012-11-27 14:14:17 +0000
committerKenneth R Westerback <krw@cvs.openbsd.org>2012-11-27 14:14:17 +0000
commit5b34aecd1c8bddda6ebe6f9c1b95510ed3f9a254 (patch)
tree596a82f7ff7ea42775ab243f7dbf11e97f59583e /sbin/dhclient/clparse.c
parent1533e93900f0e5d84a4eb84f45a6215b09a9f3f6 (diff)
Clean up parsing of option lists. Part 5.
Don't toss away an existing request/require list unless the new list is successfully parsed.
Diffstat (limited to 'sbin/dhclient/clparse.c')
-rw-r--r--sbin/dhclient/clparse.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/sbin/dhclient/clparse.c b/sbin/dhclient/clparse.c
index 197871e8006..33f1f8c8c26 100644
--- a/sbin/dhclient/clparse.c
+++ b/sbin/dhclient/clparse.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: clparse.c,v 1.46 2012/11/25 16:45:31 krw Exp $ */
+/* $OpenBSD: clparse.c,v 1.47 2012/11/27 14:14:16 krw Exp $ */
/* Parser for dhclient config and lease files... */
@@ -153,7 +153,7 @@ read_client_leases(void)
void
parse_client_statement(FILE *cfile)
{
- u_int8_t ignorelist[256];
+ u_int8_t optlist[256];
int token, code, count, i;
switch (next_token(NULL, cfile)) {
@@ -171,10 +171,9 @@ parse_client_statement(FILE *cfile)
config->default_actions[code] = ACTION_SUPERSEDE;
return;
case TOK_IGNORE:
- count = parse_option_list(cfile, ignorelist,
- sizeof(ignorelist));
+ count = parse_option_list(cfile, optlist, sizeof(optlist));
for (i = 0; i < count; i++)
- config->default_actions[ignorelist[i]] = ACTION_IGNORE;
+ config->default_actions[optlist[i]] = ACTION_IGNORE;
return;
case TOK_APPEND:
code = parse_option_decl(cfile, &config->defaults[0]);
@@ -193,14 +192,20 @@ parse_client_statement(FILE *cfile)
parse_hardware_param(cfile, &ifi->hw_address);
return;
case TOK_REQUEST:
- config->requested_option_count = parse_option_list(cfile,
- config->requested_options,
- sizeof(config->requested_options));
+ count = parse_option_list(cfile, optlist, sizeof(optlist));
+ if (count > 0) {
+ config->requested_option_count = count;
+ memcpy(config->requested_options, optlist,
+ sizeof(config->requested_options));
+ }
return;
case TOK_REQUIRE:
- config->required_option_count = parse_option_list(cfile,
- config->required_options,
- sizeof(config->required_options));
+ count = parse_option_list(cfile, optlist, sizeof(optlist));
+ if (count > 0) {
+ config->required_option_count = count;
+ memcpy(config->required_options, optlist,
+ sizeof(config->required_options));
+ }
return;
case TOK_LINK_TIMEOUT:
parse_lease_time(cfile, &config->link_timeout);