[Freeipa-devel] [PATCH 0090] Fix origin handling in dn_to_dnsname() for zone DNs

Adam Tkac atkac at redhat.com
Thu Nov 22 12:18:33 UTC 2012


On Tue, Nov 13, 2012 at 05:46:20PM +0100, Petr Spacek wrote:
> Hello,
> 
> I found the bug in dn_to_dnsname() during my work on
> https://fedorahosted.org/bind-dyndb-ldap/ticket/91
> "Cache is not flushed properly if renamed/deleted zone has superior zone in LDAP"
> 
> Consider this change as part of solution for ticket #91:
> 
>     Fix origin handling in dn_to_dnsname() for zone DNs.
> 
>     This patch fixes case where DN is zone (i.e. DN with single idnsName
>     component) and origin is non-NULL.
> 
>     Function str_to_isc_buffer() was fixed to not truncate last character.

Ack

> From 840dd9d6ee6eefde0baf00930590bb279e73db75 Mon Sep 17 00:00:00 2001
> From: Petr Spacek <pspacek at redhat.com>
> Date: Tue, 13 Nov 2012 17:29:05 +0100
> Subject: [PATCH] Fix origin handling in dn_to_dnsname() for zone DNs.
> 
> This patch fixes case where DN is zone (i.e. DN with single idnsName
> component) and origin is non-NULL.
> 
> Function str_to_isc_buffer() was fixed to not truncate last character.
> 
> Signed-off-by: Petr Spacek <pspacek at redhat.com>
> ---
>  src/ldap_convert.c | 39 +++++++++++++++++++++++++--------------
>  src/str.c          |  2 +-
>  2 files changed, 26 insertions(+), 15 deletions(-)
> 
> diff --git a/src/ldap_convert.c b/src/ldap_convert.c
> index 3352c573cafc54421c77b0b770657841b90ebd71..394d8d036c1d4e0f8a82499282d1acef7d442bcd 100644
> --- a/src/ldap_convert.c
> +++ b/src/ldap_convert.c
> @@ -91,12 +91,11 @@ dn_to_dnsname(isc_mem_t *mctx, const char *dn, dns_name_t *target,
>  
>  	CHECK(dn_to_text(dn, str, ostr));
>  	str_to_isc_buffer(str, &buffer);
> -	CHECK(dns_name_fromtext(&name, &buffer, dns_rootname, 0, NULL));
> +	CHECK(dns_name_fromtext(&name, &buffer, NULL, 0, NULL));
>  
>  	if (otarget != NULL) {
>  		str_to_isc_buffer(ostr, &buffer);
> -		CHECK(dns_name_fromtext(&origin, &buffer, dns_rootname, 0,
> -		      NULL));
> +		CHECK(dns_name_fromtext(&origin, &buffer, NULL, 0, NULL));
>  	}
>  
>  cleanup:
> @@ -124,14 +123,26 @@ cleanup:
>  	return result;
>  }
>  
> -/*
> - * Convert LDAP dn to DNS name.
> +/**
> + * Convert LDAP DN to absolute DNS name.
>   *
> - * Example:
> - * dn = "idnsName=foo, idnsName=bar, idnsName=example.org, cn=dns,"
> - *      "dc=example, dc=org"
> + * @param[out] target Absolute DNS name derived from the all idnsNames.
> + * @param[out] origin Absolute DNS name derived from the last idnsName
> + *                    component of DN, i.e. zone. Can be NULL.
>   *
> - * The resulting string will be "foo.bar.example.org."
> + * @code
> + * Examples:
> + * dn = "idnsName=foo, idnsName=bar, idnsName=example.org,"
> + *      "cn=dns, dc=example, dc=org"
> + * target = "foo.bar.example.org."
> + * origin = "example.org."
> + *
> + * dn = "idnsname=89, idnsname=4.34.10.in-addr.arpa.",
> + *      " cn=dns, dc=example, dc=org"
> + * target = "89.4.34.10.in-addr.arpa."
> + * origin = "4.34.10.in-addr.arpa."
> + * (The dot at the end is not doubled when it's already present.)
> + * @endcode
>   */
>  isc_result_t
>  dn_to_text(const char *dn, ld_string_t *target, ld_string_t *origin)
> @@ -159,24 +170,24 @@ dn_to_text(const char *dn, ld_string_t *target, ld_string_t *origin)
>  
>  		CHECK(explode_rdn(exploded_dn[i], &exploded_rdn, 1));
>  		CHECK(str_cat_char(target, exploded_rdn[0]));
> -		CHECK(str_cat_char(target, "."));
> +		if (str_buf(target)[str_len(target)-1] != '.')
> +			CHECK(str_cat_char(target, "."));
>  	}
>  
>  	if (origin != NULL) {
>  		str_clear(origin);
>  
>  		/*
>  		 * If we have DNs with only one idnsName part,
> -		 * treat them as absolute.
> +		 * treat them as absolute zone name.
>  		 */
> -
>  		if (i < 2)
>  			CHECK(str_init_char(origin, "."));
>  		else {
>  			CHECK(str_cat_char(origin, exploded_rdn[0]));
> -			CHECK(str_cat_char(origin, "."));
> +			if (str_buf(origin)[str_len(origin)-1] != '.')
> +				CHECK(str_cat_char(origin, "."));
>  		}
> -			
>  	}
>  
>  	if (str_len(target) == 0)
> diff --git a/src/str.c b/src/str.c
> index 83645365ee6eff7bda5fbeda6837f30d4dec41ae..1be3f5b61250cb6900820dd4bf1375a3ed77359c 100644
> --- a/src/str.c
> +++ b/src/str.c
> @@ -465,7 +465,7 @@ str_to_isc_buffer(const ld_string_t *src, isc_buffer_t *dest)
>  	REQUIRE(src != NULL);
>  	REQUIRE(dest != NULL);
>  
> -	len = str_len_internal(src) - 1;
> +	len = str_len_internal(src);
>  
>  	isc_buffer_init(dest, src->data, len);
>  	isc_buffer_add(dest, len);
> -- 
> 1.7.11.7
> 


-- 
Adam Tkac, Red Hat, Inc.




More information about the Freeipa-devel mailing list