]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
- A bug was fixed that caused the 'conflict-done' state to fail to be parsed
authorDavid Hankins <dhankins@isc.org>
Wed, 17 Jun 2009 21:42:04 +0000 (21:42 +0000)
committerDavid Hankins <dhankins@isc.org>
Wed, 17 Jun 2009 21:42:04 +0000 (21:42 +0000)
  in failover state records.  [ISC-Bugs #19739]

RELNOTES
common/conflex.c
includes/dhctoken.h
server/confpars.c

index 6a67baa0a8d9832d379ab44b8823347b6c0bef1b..312169eba34a06ad7aca9f6f32854640c1d5911e 100644 (file)
--- a/RELNOTES
+++ b/RELNOTES
@@ -134,6 +134,9 @@ work on other platforms. Please report any problems and suggested fixes to
   failover connect yet (e.g.: connection refused, asynch socket connect()
   timeouts).
 
+- A bug was fixed that caused the 'conflict-done' state to fail to be parsed
+  in failover state records.
+
                        Changes since 4.1.0b1
 
 - A missing "else" in dhcrelay.c could have caused an interface not to
index 3625a78d62f7afd1111a9453c1d8ffbc915df7ff..e7426417221d4c3f589d7f482643fc5e644708ec 100644 (file)
@@ -778,46 +778,69 @@ intern(char *atom, enum dhcp_token dfv) {
                        return BOUND;
                break;
              case 'c':
-               if (!strcasecmp (atom + 1, "ase"))
+               if (!strcasecmp(atom + 1, "ase"))
                        return CASE;
-               if (!strcasecmp (atom + 1, "ommit"))
-                       return COMMIT;
-               if (!strcasecmp (atom + 1, "ode"))
-                       return CODE;
-               if (!strcasecmp (atom + 1, "onfig-option"))
-                       return CONFIG_OPTION;
-               if (!strcasecmp (atom + 1, "heck"))
+               if (!strcasecmp(atom + 1, "heck"))
                        return CHECK;
-               if (!strcasecmp (atom + 1, "lass"))
-                       return CLASS;
-               if (!strcasecmp (atom + 1, "lose"))
-                       return TOKEN_CLOSE;
-               if (!strcasecmp(atom + 1, "ompressed"))
-                       return COMPRESSED;
-               if (!strcasecmp (atom + 1, "reate"))
-                       return TOKEN_CREATE;
-               if (!strcasecmp (atom + 1, "iaddr"))
+               if (!strcasecmp(atom + 1, "iaddr"))
                        return CIADDR;
-               if (!strncasecmp (atom + 1, "lient", 5)) {
-                       if (!strcasecmp (atom + 6, "-identifier"))
-                               return CLIENT_IDENTIFIER;
-                       if (!strcasecmp (atom + 6, "-hostname"))
-                               return CLIENT_HOSTNAME;
-                       if (!strcasecmp (atom + 6, "-state"))
-                               return CLIENT_STATE;
-                       if (!strcasecmp (atom + 6, "-updates"))
-                               return CLIENT_UPDATES;
-                       if (!strcasecmp (atom + 6, "s"))
-                               return CLIENTS;
+               if (isascii(atom[1]) &&
+                   tolower((unsigned char)atom[1]) == 'l') {
+                       if (!strcasecmp(atom + 2, "ass"))
+                               return CLASS;
+                       if (!strncasecmp(atom + 2, "ient", 4)) {
+                               if (!strcasecmp(atom + 6, "s"))
+                                       return CLIENTS;
+                               if (atom[7] == '-') {
+                                       if (!strcasecmp(atom + 7, "hostname"))
+                                               return CLIENT_HOSTNAME;
+                                       if (!strcasecmp(atom + 7, "identifier"))
+                                               return CLIENT_IDENTIFIER;
+                                       if (!strcasecmp(atom + 7, "state"))
+                                               return CLIENT_STATE;
+                                       if (!strcasecmp(atom + 7, "updates"))
+                                               return CLIENT_UPDATES;
+                                       break;
+                               }
+                               break;
+                       }
+                       if (!strcasecmp(atom + 2, "ose"))
+                               return TOKEN_CLOSE;
+                       if (!strcasecmp(atom + 2, "tt"))
+                               return CLTT;
+                       break;
                }
-               if (!strcasecmp (atom + 1, "oncat"))
-                       return CONCAT;
-               if (!strcasecmp (atom + 1, "onnect"))
-                       return CONNECT;
-               if (!strcasecmp (atom + 1, "ommunications-interrupted"))
-                       return COMMUNICATIONS_INTERRUPTED;
-               if (!strcasecmp (atom + 1, "ltt"))
-                       return CLTT;
+               if (isascii(atom[1]) &&
+                   tolower((unsigned char)atom[1]) == 'o') {
+                       if (!strcasecmp(atom + 2, "de"))
+                               return CODE;
+                       if (isascii(atom[2]) &&
+                           tolower((unsigned char)atom[2]) == 'm') {
+                               if (!strcasecmp(atom + 3, "mit"))
+                                       return COMMIT;
+                               if (!strcasecmp(atom + 3,
+                                               "munications-interrupted"))
+                                       return COMMUNICATIONS_INTERRUPTED;
+                               if (!strcasecmp(atom + 3, "pressed"))
+                                       return COMPRESSED;
+                               break;
+                       }
+                       if (isascii(atom[2]) &&
+                           tolower((unsigned char)atom[2]) == 'n') {
+                               if (!strcasecmp(atom + 3, "cat"))
+                                       return CONCAT;
+                               if (!strcasecmp(atom + 3, "fig-option"))
+                                       return CONFIG_OPTION;
+                               if (!strcasecmp(atom + 3, "flict-done"))
+                                       return CONFLICT_DONE;
+                               if (!strcasecmp(atom + 3, "nect"))
+                                       return CONNECT;
+                               break;
+                       }
+                       break;
+               }
+               if (!strcasecmp(atom + 1, "reate"))
+                       return TOKEN_CREATE;
                break;
              case 'd':
                if (!strcasecmp(atom + 1, "b-time-format"))
index f7382d2549749ce336a915f394654671e5790202..3cb397ac3663a762f4a051f9984931603b66bff3 100644 (file)
@@ -353,8 +353,8 @@ enum dhcp_token {
        TEMPORARY = 656,
        PREFIX6 = 657,
        FIXED_PREFIX6 = 658,
-       ANYCAST_MAC = 659
-
+       ANYCAST_MAC = 659,
+       CONFLICT_DONE = 660
 };
 
 #define is_identifier(x)       ((x) >= FIRST_TOKEN &&  \
index 88ae3b527c2fab3eec706d87d5a3ffd4d614aa7d..63dc465db87767e5da90edb457e22b2f56b696bb 100644 (file)
@@ -1315,6 +1315,10 @@ void parse_failover_state (cfile, state, stos)
                state_in = communications_interrupted;
                break;
 
+             case CONFLICT_DONE:
+               state_in = conflict_done;
+               break;
+
              case RESOLUTION_INTERRUPTED:
                state_in = resolution_interrupted;
                break;