From: Francis Dupont Date: Mon, 3 Dec 2007 19:10:19 +0000 (+0000) Subject: fix dhcp6.status-code success parsing X-Git-Tag: v4_0_0rc1~25 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c54db7086897e80266fed1814705cc0321b4b4f9;p=thirdparty%2Fdhcp.git fix dhcp6.status-code success parsing --- diff --git a/RELNOTES b/RELNOTES index 919f517bb..98ab0e107 100644 --- a/RELNOTES +++ b/RELNOTES @@ -82,6 +82,9 @@ suggested fixes to . - A bug was fixed in the dhclient-script for BSDs to correctly carry error codes through some conditions. +- The parsing of some options in the dhclient lease file, in particular + the success DHCPv6 status-code, was fixed. + Changes since 4.0.0b2 - Clarified error message when lease limit exceeded diff --git a/common/parse.c b/common/parse.c index befebd751..ba53584f6 100644 --- a/common/parse.c +++ b/common/parse.c @@ -59,6 +59,7 @@ struct enumeration *find_enumeration (const char *name, int length) struct enumeration_value *find_enumeration_value (const char *name, int length, + unsigned *widthp, const char *value) { struct enumeration *e; @@ -66,6 +67,8 @@ struct enumeration_value *find_enumeration_value (const char *name, e = find_enumeration (name, length); if (e) { + if (widthp != NULL) + *widthp = e->width; for (i = 0; e -> values [i].name; i++) { if (!strcmp (value, e -> values [i].name)) return &e -> values [i]; @@ -5103,12 +5106,12 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups) "identifier expected"); goto foo; } - e = find_enumeration_value (f, (*fmt) - f, val); + e = find_enumeration_value (f, (*fmt) - f, &len, val); if (!e) { parse_warn (cfile, "unknown value"); goto foo; } - if (!make_const_data (&t, &e -> value, 1, 0, 1, MDL)) + if (!make_const_data (&t, &e -> value, len, 0, 1, MDL)) return 0; break; @@ -5284,6 +5287,12 @@ int parse_option_decl (oc, cfile) break; case 't': /* Text string... */ + token = peek_token (&val, + &len, cfile); + if (token == SEMI && fmt[1] == 'o') { + fmt++; + break; + } token = next_token (&val, &len, cfile); if (token != STRING) { @@ -5335,7 +5344,7 @@ int parse_option_decl (oc, cfile) break; case 'N': - f = fmt; + f = fmt + 1; fmt = strchr (fmt, '.'); if (!fmt) { parse_warn (cfile, @@ -5350,13 +5359,13 @@ int parse_option_decl (oc, cfile) "identifier expected"); goto parse_exit; } - e = find_enumeration_value (f, fmt - f, val); + e = find_enumeration_value (f, fmt - f, + &len, val); if (!e) { parse_warn (cfile, "unknown value"); goto parse_exit; } - len = 1; dp = &e -> value; goto alloc; diff --git a/common/tables.c b/common/tables.c index b4e95939d..d9cefea99 100644 --- a/common/tables.c +++ b/common/tables.c @@ -335,7 +335,7 @@ static struct option dhcpv6_options[] = { &dhcpv6_universe, 11, 1 }, #endif { "unicast", "6", &dhcpv6_universe, 12, 1 }, - { "status-code", "Nstatus-codes.t", &dhcpv6_universe, 13, 1 }, + { "status-code", "Nstatus-codes.to", &dhcpv6_universe, 13, 1 }, { "rapid-commit", "", &dhcpv6_universe, 14, 1 }, #if 0 /* XXX: user-class contents are of the form "StA" where the diff --git a/includes/dhcpd.h b/includes/dhcpd.h index a3058fbef..3d3806532 100644 --- a/includes/dhcpd.h +++ b/includes/dhcpd.h @@ -1681,6 +1681,7 @@ int ddns_removals(struct lease *, struct iaaddr *); void add_enumeration (struct enumeration *); struct enumeration *find_enumeration (const char *, int); struct enumeration_value *find_enumeration_value (const char *, int, + unsigned *, const char *); void skip_to_semi PROTO ((struct parse *)); void skip_to_rbrace PROTO ((struct parse *, int));