summaryrefslogtreecommitdiff
path: root/server/ddns.c
diff options
context:
space:
mode:
authorShawn Routhier <sar@isc.org>2011-02-18 18:18:20 +0000
committerShawn Routhier <sar@isc.org>2011-02-18 18:18:20 +0000
commit919f14071d9dd69d1c09321ba8f9b74ab0e75655 (patch)
tree8e9257f64cfd5681cc55009b3cd8ecd4062b5b3c /server/ddns.c
parentef86959bc0cc547c6f23e51321fa6b649957739d (diff)
downloadisc-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.c24
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);
}