]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
fix dhcp6.status-code success parsing
authorFrancis Dupont <fdupont@isc.org>
Mon, 3 Dec 2007 19:10:19 +0000 (19:10 +0000)
committerFrancis Dupont <fdupont@isc.org>
Mon, 3 Dec 2007 19:10:19 +0000 (19:10 +0000)
RELNOTES
common/parse.c
common/tables.c
includes/dhcpd.h

index 919f517bb6a9fb6af7ac525ec610c1604acb6fcb..98ab0e107b73d3420a2fe0219cdcf81720077a92 100644 (file)
--- a/RELNOTES
+++ b/RELNOTES
@@ -82,6 +82,9 @@ suggested fixes to <dhcp-users@isc.org>.
 - 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
index befebd75108570966c83849dd7a6c3426b9ac825..ba53584f66c7cfa109339dd4bf97105cf073b9b4 100644 (file)
@@ -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;
 
index b4e95939db21ca9f4d584dc8a2a309ee6f633993..d9cefea995101089c5f5ab09485cba27b58f921c 100644 (file)
@@ -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
index a3058fbef6d9f0a3a0afe1927763626866639e65..3d380653228ec831a111161aaf0c16b61ec806d6 100644 (file)
@@ -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));