diff options
author | Thomas Markwalder <tmark@isc.org> | 2017-04-12 11:44:59 -0400 |
---|---|---|
committer | Thomas Markwalder <tmark@isc.org> | 2017-04-12 11:44:59 -0400 |
commit | 0aa74669d97391f0f6d26800c37fbbec6bd52b20 (patch) | |
tree | 529a19200e91892bbbf9fc4acbf7c2a9304c2557 | |
parent | 970d9b0b1bede8f6b2091ff31cdb6ce1749fcb75 (diff) | |
download | isc-dhcp-0aa74669d97391f0f6d26800c37fbbec6bd52b20.tar.gz |
[master] Execute pool statements separately in dhcpinform()
Merged 43291a.
-rw-r--r-- | RELNOTES | 1 | ||||
-rw-r--r-- | server/dhcp.c | 37 |
2 files changed, 24 insertions, 14 deletions
@@ -145,6 +145,7 @@ by Eric Young (eay@cryptsoft.com). Prior to this the server only evaluated options down to the subnet scope. Thanks to Fernando Soto at BlueCat Networks for reporting the issue. [ISC-Bugs #43219] + [ISC-Bugs #45051] Changes since 4.3.0 (bug fixes) diff --git a/server/dhcp.c b/server/dhcp.c index af456580..1109e204 100644 --- a/server/dhcp.c +++ b/server/dhcp.c @@ -3,7 +3,7 @@ DHCP Protocol engine. */ /* - * Copyright (c) 2004-2016 by Internet Systems Consortium, Inc. ("ISC") + * Copyright (c) 2004-2017 by Internet Systems Consortium, Inc. ("ISC") * Copyright (c) 1995-2003 by Internet Software Consortium * * Permission to use, copy, modify, and distribute this software for any @@ -1085,7 +1085,6 @@ void dhcpinform (packet, ms_nulltp) #if defined (DEBUG_INFORM_HOST) int h_w_fixed_addr = 0; #endif - struct lease* cip_lease = NULL; /* The client should set ciaddr to its IP address, but apparently it's common for clients not to do this, so we'll use their IP @@ -1232,22 +1231,32 @@ void dhcpinform (packet, ms_nulltp) maybe_return_agent_options(packet, options); + /* Execute statements network statements starting at the subnet level */ + execute_statements_in_scope(NULL, packet, NULL, NULL, + packet->options, options, + &global_scope, subnet->group, + NULL, NULL); + /* If we have ciaddr, find its lease so we can find its pool. */ if (zeroed_ciaddr == ISC_FALSE) { + struct lease* cip_lease = NULL; + find_lease_by_ip_addr (&cip_lease, cip, MDL); - } + + /* Overlay with pool options if ciaddr mapped to a lease. */ + if (cip_lease) { + if (cip_lease->pool && cip_lease->pool->group) { + execute_statements_in_scope( + NULL, packet, NULL, NULL, + packet->options, options, + &global_scope, + cip_lease->pool->group, + cip_lease->pool->shared_network->group, + NULL); + } - /* Execute statements starting at the pool scope if we can - * otherwise the subnet scope is a far as we can go. */ - execute_statements_in_scope(NULL, packet, NULL, NULL, - packet->options, options, - &global_scope, - (cip_lease != NULL && - cip_lease->pool != NULL ? - cip_lease->pool->group : subnet->group), - NULL, NULL); - if (cip_lease) { - lease_dereference (&cip_lease, MDL); + lease_dereference (&cip_lease, MDL); + } } /* Execute statements in the class scopes. */ |