diff options
author | Shawn Routhier <sar@isc.org> | 2011-02-18 18:18:20 +0000 |
---|---|---|
committer | Shawn Routhier <sar@isc.org> | 2011-02-18 18:18:20 +0000 |
commit | 919f14071d9dd69d1c09321ba8f9b74ab0e75655 (patch) | |
tree | 8e9257f64cfd5681cc55009b3cd8ecd4062b5b3c /server/ddns.c | |
parent | ef86959bc0cc547c6f23e51321fa6b649957739d (diff) | |
download | isc-dhcp-919f14071d9dd69d1c09321ba8f9b74ab0e75655.tar.gz |
Handle some DDNS corner cases better. Maintain the DDNS transaction
information when updating a lease and cancel any existing transactions
when removing the ddns information.
[ISC-Bugs #23103]
Diffstat (limited to 'server/ddns.c')
-rw-r--r-- | server/ddns.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/server/ddns.c b/server/ddns.c index 10a2c03c..cfbdd04e 100644 --- a/server/ddns.c +++ b/server/ddns.c @@ -4,7 +4,7 @@ /* * - * Copyright (c) 2009-2010 by Internet Systems Consortium, Inc. ("ISC") + * Copyright (c) 2009-2011 by Internet Systems Consortium, Inc. ("ISC") * Copyright (c) 2004-2007 by Internet Systems Consortium, Inc. ("ISC") * Copyright (c) 2000-2003 by Internet Software Consortium * @@ -109,7 +109,7 @@ ddns_updates(struct packet *packet, struct lease *lease, struct lease *old, } } else if (lease6 != NULL) { if ((old6 != NULL) && (old6->ddns_cb != NULL)) { - ddns_cancel(old->ddns_cb); + ddns_cancel(old6->ddns_cb); old6->ddns_cb = NULL; } } else { @@ -1304,9 +1304,24 @@ ddns_removals(struct lease *lease, isc_result_t rcode, execute_add = ISC_R_FAILURE; struct binding_scope **scope = NULL; int result = 0; - dhcp_ddns_cb_t *ddns_cb; + dhcp_ddns_cb_t *ddns_cb = NULL; struct data_string leaseid; + /* + * Cancel any outstanding requests. When called + * from within the DNS code we probably will have + * already done the cancel but if called from outside + * - for example as part of a lease expiry - we won't. + */ + if ((lease != NULL) && (lease->ddns_cb != NULL)) { + ddns_cancel(lease->ddns_cb); + lease->ddns_cb = NULL; + } else if ((lease6 != NULL) && (lease6->ddns_cb != NULL)) { + ddns_cancel(lease6->ddns_cb); + lease6->ddns_cb = NULL; + } else + goto cleanup; + /* allocate our control block */ ddns_cb = ddns_cb_alloc(MDL); if (ddns_cb == NULL) { @@ -1467,7 +1482,8 @@ ddns_removals(struct lease *lease, * we allocated here. */ ddns_fwd_srv_connector(lease, lease6, scope, add_ddns_cb, execute_add); - ddns_cb_free(ddns_cb, MDL); + if (ddns_cb != NULL) + ddns_cb_free(ddns_cb, MDL); return(result); } |