X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-dnssrv%2Freferral.c;h=2ef38b8d058717b43b940bdcde0235b06ca3952a;hb=fcf97e84486e1159c0f57114e3b130cf49d7f89d;hp=1d5ba88edb9df55153619465eaba25c91316c25a;hpb=d026e2c9f7a390b6adf9b03af3ee125c2cd52958;p=openldap diff --git a/servers/slapd/back-dnssrv/referral.c b/servers/slapd/back-dnssrv/referral.c index 1d5ba88edb..2ef38b8d05 100644 --- a/servers/slapd/back-dnssrv/referral.c +++ b/servers/slapd/back-dnssrv/referral.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 2000-2004 The OpenLDAP Foundation. + * Copyright 2000-2009 The OpenLDAP Foundation. * Portions Copyright 2000-2003 Kurt D. Zeilenga. * All rights reserved. * @@ -27,7 +27,7 @@ #include #include "slap.h" -#include "external.h" +#include "proto-dnssrv.h" int dnssrv_back_referrals( @@ -41,7 +41,13 @@ dnssrv_back_referrals( char **hosts = NULL; BerVarray urls = NULL; - if( op->o_req_dn.bv_len == 0 ) { + if ( BER_BVISEMPTY( &op->o_req_dn ) ) { + /* FIXME: need some means to determine whether the database + * is a glue instance */ + if ( SLAP_GLUE_INSTANCE( op->o_bd ) ) { + return LDAP_SUCCESS; + } + rs->sr_text = "DNS SRV operation upon null (empty) DN disallowed"; return LDAP_UNWILLING_TO_PERFORM; } @@ -59,16 +65,18 @@ dnssrv_back_referrals( rs->sr_err = LDAP_REFERRAL; rs->sr_ref = default_referral; send_ldap_result( op, rs ); + rs->sr_ref = NULL; return LDAP_REFERRAL; } Debug( LDAP_DEBUG_TRACE, "DNSSRV: dn=\"%s\" -> domain=\"%s\"\n", op->o_req_dn.bv_val, domain, 0 ); - if( ( rc = ldap_domain2hostlist( domain, &hostlist ) ) ) { + i = ldap_domain2hostlist( domain, &hostlist ); + if ( i ) { Debug( LDAP_DEBUG_TRACE, "DNSSRV: domain2hostlist(%s) returned %d\n", - domain, rc, 0 ); + domain, i, 0 ); rs->sr_text = "no DNS SRV RR available for DN"; rc = LDAP_NO_SUCH_OBJECT; goto done; @@ -85,11 +93,11 @@ dnssrv_back_referrals( for( i=0; hosts[i] != NULL; i++) { struct berval url; - url.bv_len = sizeof("ldap://")-1 + strlen(hosts[i]); + url.bv_len = STRLENOF( "ldap://" ) + strlen( hosts[i] ); url.bv_val = ch_malloc( url.bv_len + 1 ); strcpy( url.bv_val, "ldap://" ); - strcpy( &url.bv_val[sizeof("ldap://")-1], hosts[i] ); + strcpy( &url.bv_val[STRLENOF( "ldap://" )], hosts[i] ); if ( ber_bvarray_add( &urls, &url ) < 0 ) { free( url.bv_val ); @@ -109,6 +117,8 @@ dnssrv_back_referrals( rs->sr_ref = urls; send_ldap_error( op, rs, LDAP_REFERRAL, "DNS SRV generated referrals" ); + rs->sr_ref = NULL; + rc = LDAP_REFERRAL; done: if( domain != NULL ) ch_free( domain );