Commit 6caacacf authored by Simon Kelley's avatar Simon Kelley

Putative fix to crash in IPv4 DHCP, introduced whilst

generalising the DHCP option filter code:
don't match options against context tag  when
context->netid.net == NULL, since there's no tag then.
parent 60ac5af6
...@@ -102,7 +102,7 @@ struct dhcp_netid *option_filter(struct dhcp_netid *tags, struct dhcp_netid *con ...@@ -102,7 +102,7 @@ struct dhcp_netid *option_filter(struct dhcp_netid *tags, struct dhcp_netid *con
} }
/* now flag options which are valid, including the context tags, /* now flag options which are valid, including the context tags,
otherwise valid options are inhibited if we found a higher priotity one above */ otherwise valid options are inhibited if we found a higher priority one above */
if (context_tags) if (context_tags)
{ {
struct dhcp_netid *last_tag; struct dhcp_netid *last_tag;
......
...@@ -504,10 +504,9 @@ u64 lease_find_max_addr6(struct dhcp_context *context) ...@@ -504,10 +504,9 @@ u64 lease_find_max_addr6(struct dhcp_context *context)
if (!(context->flags & (CONTEXT_STATIC | CONTEXT_PROXY))) if (!(context->flags & (CONTEXT_STATIC | CONTEXT_PROXY)))
for (lease = leases; lease; lease = lease->next) for (lease = leases; lease; lease = lease->next)
{ {
#ifdef HAVE_DHCP6
if (!(lease->flags & (LEASE_TA | LEASE_NA))) if (!(lease->flags & (LEASE_TA | LEASE_NA)))
continue; continue;
#endif
if (is_same_net6((struct in6_addr *)lease->hwaddr, &context->start6, 64) && if (is_same_net6((struct in6_addr *)lease->hwaddr, &context->start6, 64) &&
addr6part((struct in6_addr *)lease->hwaddr) > addr6part(&context->start6) && addr6part((struct in6_addr *)lease->hwaddr) > addr6part(&context->start6) &&
addr6part((struct in6_addr *)lease->hwaddr) <= addr6part(&context->end6) && addr6part((struct in6_addr *)lease->hwaddr) <= addr6part(&context->end6) &&
......
...@@ -2095,7 +2095,8 @@ static void do_options(struct dhcp_context *context, ...@@ -2095,7 +2095,8 @@ static void do_options(struct dhcp_context *context,
struct dhcp_netid_list *id_list; struct dhcp_netid_list *id_list;
/* filter options based on tags, those we want get DHOPT_TAGOK bit set */ /* filter options based on tags, those we want get DHOPT_TAGOK bit set */
tagif = option_filter(netid, &context->netid, config_opts); context->netid.next = NULL;
tagif = option_filter(netid, context->netid.net ? &context->netid : NULL, config_opts);
/* logging */ /* logging */
if (option_bool(OPT_LOG_OPTS) && req_options) if (option_bool(OPT_LOG_OPTS) && req_options)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment