diff --git a/RELNOTES b/RELNOTES index 6a67baa0..312169eb 100644 --- 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 diff --git a/common/conflex.c b/common/conflex.c index 3625a78d..e7426417 100644 --- a/common/conflex.c +++ b/common/conflex.c @@ -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")) diff --git a/includes/dhctoken.h b/includes/dhctoken.h index f7382d25..3cb397ac 100644 --- a/includes/dhctoken.h +++ b/includes/dhctoken.h @@ -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 && \ diff --git a/server/confpars.c b/server/confpars.c index 88ae3b52..63dc465d 100644 --- a/server/confpars.c +++ b/server/confpars.c @@ -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;