Finesse parsing of --dhcp-remoteid and --dhcp-subscrid.

To be treated as hex, the pattern must consist of only hex digits AND
contain at least one ':'. Thanks to Bengt-Erik Sandstrom who tripped
over a pattern consisting of a decimal number which was interpreted
surprisingly.
This commit is contained in:
Simon Kelley
2021-12-30 23:22:43 +00:00
parent d242cbffa4
commit ea5d8c56a0
2 changed files with 13 additions and 4 deletions

View File

@@ -21,6 +21,12 @@ version 2.87
Add snooping of IPv6 prefix-delegations to the DHCP-relay system. Add snooping of IPv6 prefix-delegations to the DHCP-relay system.
Finesse parsing of --dhcp-remoteid and --dhcp-subscrid. To be treated
as hex, the pattern must consist of only hex digits AND contain
at least one ':'. Thanks to Bengt-Erik Sandstrom who tripped
over a pattern consisting of a decimal number which was interpreted
surprisingly.
version 2.86 version 2.86
Handle DHCPREBIND requests in the DHCPv6 server code. Handle DHCPREBIND requests in the DHCPv6 server code.

View File

@@ -4128,7 +4128,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
case LOPT_SUBSCR: /* --dhcp-subscrid */ case LOPT_SUBSCR: /* --dhcp-subscrid */
{ {
unsigned char *p; unsigned char *p;
int dig = 0; int dig, colon;
struct dhcp_vendor *new = opt_malloc(sizeof(struct dhcp_vendor)); struct dhcp_vendor *new = opt_malloc(sizeof(struct dhcp_vendor));
if (!(comma = split(arg))) if (!(comma = split(arg)))
@@ -4152,13 +4152,16 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
else else
comma = arg; comma = arg;
for (p = (unsigned char *)comma; *p; p++) for (dig = 0, colon = 0, p = (unsigned char *)comma; *p; p++)
if (isxdigit(*p)) if (isxdigit(*p))
dig = 1; dig = 1;
else if (*p != ':') else if (*p == ':')
colon = 1;
else
break; break;
unhide_metas(comma); unhide_metas(comma);
if (option == 'U' || option == 'j' || *p || !dig) if (option == 'U' || option == 'j' || *p || !dig || !colon)
{ {
new->len = strlen(comma); new->len = strlen(comma);
new->data = opt_malloc(new->len); new->data = opt_malloc(new->len);