On 18.4.2013 16:58, Petr Spacek wrote:
Hello,
Do not delete whole node during PTR record synchronization.
https://fedorahosted.org/bind-dyndb-ldap/ticket/115
Tbabej's GCC cries about uninitialized variable 'delete_node', but we weren't
able to find any real error.
This version of the patch contains a workaround for the GCC oddities.
--
Petr^2 Spacek
From 532e454b46720b098328701edcfcd632055dcf0a Mon Sep 17 00:00:00 2001
From: Petr Spacek <[email protected]>
Date: Thu, 18 Apr 2013 16:57:00 +0200
Subject: [PATCH] Do not delete whole node during PTR record synchronization.
https://fedorahosted.org/bind-dyndb-ldap/ticket/115
Signed-off-by: Petr Spacek <[email protected]>
---
src/ldap_helper.c | 28 +++++++++++++++++++++-------
1 file changed, 21 insertions(+), 7 deletions(-)
diff --git a/src/ldap_helper.c b/src/ldap_helper.c
index 6c5cf2e79d762251954e3bb099dbef98a0b2d805..198568016303b8aa5c330c69eaf94b1b0ab8fd89 100644
--- a/src/ldap_helper.c
+++ b/src/ldap_helper.c
@@ -2922,6 +2922,8 @@ cleanup:
* @param[in] ptr_name Name of PTR record generated from IP address in A/AAAA.
* @param[in] mod_op LDAP_MOD_DELETE if A/AAAA record is being deleted
* or LDAP_MOD_ADD if A/AAAA record is being added.
+ * @param[out] delete_node Will be set to ISC_TRUE if the database node
+ * is empty after PTR record deletion.
*
* @retval ISC_R_IGNORE A and PTR records match, no change is required.
* @retval ISC_R_SUCCESS Prerequisites fulfilled, update is allowed.
@@ -2934,11 +2936,11 @@ cleanup:
*
* ; PTR update will be allowed if the zone contains following data:
* www.example.com. A 192.0.2.1
- * 1.2.0.192.in-addr.arpa. PTR www.example.com.
-
+ * 1.2.0.192.in-addr.arpa. PTR www.example.com.
+ *
* ; PTR update will not be allowed if the zone contains following data:
* www.example.com. A 192.0.2.1
- * 1.2.0.192.in-addr.arpa. PTR mail.example.com.
+ * 1.2.0.192.in-addr.arpa. PTR mail.example.com.
* @endcode
*
* @code
@@ -2955,7 +2957,7 @@ cleanup:
static isc_result_t
ldap_sync_ptr_validate(ldap_instance_t *ldap_inst, dns_name_t *a_name,
const char *a_name_str, dns_name_t *ptr_name,
- int mod_op) {
+ int mod_op, isc_boolean_t *delete_node) {
isc_result_t result;
isc_mem_t *mctx = ldap_inst->mctx;
@@ -2977,6 +2979,8 @@ ldap_sync_ptr_validate(ldap_instance_t *ldap_inst, dns_name_t *a_name,
ptr_found = ISC_FALSE;
result = ldapdb_rdatalist_get(mctx, ldap_inst, ptr_name,
NULL, &ldap_rdlist);
+
+ *delete_node = ISC_FALSE;
if (result != ISC_R_SUCCESS && result != ISC_R_NOTFOUND) {
log_error_r(SYNCPTR_FMTPRE "failed in ldapdb_rdatalist_get()",
SYNCPTR_FMTPOST);
@@ -3037,6 +3041,13 @@ ldap_sync_ptr_validate(ldap_instance_t *ldap_inst, dns_name_t *a_name,
SYNCPTR_FMTPOST, ptr_name_str, ptr_rdata_str,
a_name_str);
CLEANUP_WITH(ISC_R_UNEXPECTEDTOKEN);
+
+ } else if (HEAD(ldap_rdlist) == TAIL(ldap_rdlist)) {
+ /* Exactly one PTR record was found and rdlist contains
+ * exactly one RRset, so the deleted PTR record
+ * is the only RR in the node. */
+ REQUIRE(HEAD(ldap_rdlist)->type == dns_rdatatype_ptr);
+ *delete_node = ISC_TRUE;
}
} else if (mod_op == LDAP_MOD_ADD && ptr_found == ISC_TRUE) {
@@ -3066,7 +3077,7 @@ cleanup:
static isc_result_t
ldap_sync_ptr(ldap_instance_t *ldap_inst, dns_name_t *a_name,
- const char *ip_str, int mod_op, isc_boolean_t delete_node) {
+ const char *ip_str, int mod_op) {
isc_result_t result;
isc_mem_t *mctx = ldap_inst->mctx;
@@ -3083,6 +3094,8 @@ ldap_sync_ptr(ldap_instance_t *ldap_inst, dns_name_t *a_name,
settings_set_t *zone_settings = NULL;
isc_boolean_t zone_dyn_update;
+ isc_boolean_t delete_node;
+
dns_name_init(&zone_name, NULL);
dns_fixedname_init(&ptr_name);
CHECK(str_new(mctx, &ptr_dn));
@@ -3119,7 +3132,8 @@ ldap_sync_ptr(ldap_instance_t *ldap_inst, dns_name_t *a_name,
}
result = ldap_sync_ptr_validate(ldap_inst, a_name, a_name_str,
- dns_fixedname_name(&ptr_name), mod_op);
+ dns_fixedname_name(&ptr_name), mod_op,
+ &delete_node);
if (result == ISC_R_IGNORE)
CLEANUP_WITH(ISC_R_SUCCESS);
else if (result != ISC_R_SUCCESS)
@@ -3242,7 +3256,7 @@ modify_ldap_common(dns_name_t *owner, ldap_instance_t *ldap_inst,
log_debug(3, "sync PTR is enabled for zone '%s'", zone_dn);
result = ldap_sync_ptr(ldap_inst, owner, change[0]->mod_values[0],
- mod_op, delete_node);
+ mod_op);
}
cleanup:
--
1.8.2.1
_______________________________________________
Freeipa-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/freeipa-devel