]> git.sur5r.net Git - openldap/commitdiff
normalize rewritten DN-valued attrs (ITS#5772)
authorPierangelo Masarati <ando@openldap.org>
Sun, 26 Oct 2008 19:29:36 +0000 (19:29 +0000)
committerPierangelo Masarati <ando@openldap.org>
Sun, 26 Oct 2008 19:29:36 +0000 (19:29 +0000)
servers/slapd/overlays/rwm.c
servers/slapd/overlays/rwm.h
servers/slapd/overlays/rwmmap.c

index 1c8e704751d670a50502ec6c52942a51e70619ec..48fbce147c112b311afd90315e1f857abfcadc90 100644 (file)
@@ -1225,7 +1225,7 @@ remove_oc:;
                                || ( mapping != NULL && mapping->m_src_ad->ad_type->sat_syntax == slap_schema.si_syn_distinguishedName ) )
                {
                        dc.ctx = "searchAttrDN";
-                       rc = rwm_dnattr_result_rewrite( &dc, (*ap)->a_vals );
+                       rc = rwm_dnattr_result_rewrite( &dc, (*ap)->a_vals, (*ap)->a_nvals );
                        if ( rc != LDAP_SUCCESS ) {
                                goto cleanup_attr;
                        }
index 5a83dd0183ac221e49abc2aa3eb00d52ad5a2b52..c7b44410357cec3f4fb3b5d96e4049e800fa0eb8 100644 (file)
@@ -175,7 +175,7 @@ rwm_referral_rewrite(
        void                    *cookie,
        BerVarray               a_vals,
        BerVarray               *pa_nvals );
-extern int rwm_dnattr_result_rewrite( dncookie *dc, BerVarray a_vals );
+extern int rwm_dnattr_result_rewrite( dncookie *dc, BerVarray a_vals, BerVarray a_nvals );
 extern int rwm_referral_result_rewrite( dncookie *dc, BerVarray a_vals );
 
 LDAP_END_DECL
index ad03d87effddc4ccf1c98be167fff91dedb434f3..8c77dbdad80c1ac373a0045e6fd8d7855fd62f75 100644 (file)
@@ -1178,7 +1178,8 @@ rwm_referral_result_rewrite(
 int
 rwm_dnattr_result_rewrite(
        dncookie                *dc,
-       BerVarray               a_vals )
+       BerVarray               a_vals,
+       BerVarray               a_nvals )
 {
        int             i, last;
 
@@ -1186,11 +1187,11 @@ rwm_dnattr_result_rewrite(
        last--;
 
        for ( i = 0; !BER_BVISNULL( &a_vals[i] ); i++ ) {
-               struct berval   dn;
+               struct berval   pdn, ndn;
                int             rc;
                
-               dn = a_vals[i];
-               rc = rwm_dn_massage_pretty( dc, &a_vals[i], &dn );
+               pdn = a_vals[i];
+               rc = rwm_dn_massage_pretty_normalize( dc, &a_vals[i], &pdn, &ndn );
                switch ( rc ) {
                case LDAP_UNWILLING_TO_PERFORM:
                        /*
@@ -1198,19 +1199,27 @@ rwm_dnattr_result_rewrite(
                         * legal to trim values when adding/modifying;
                         * it should be when searching (e.g. ACLs).
                         */
+                       assert( a_vals[i].bv_val != a_nvals[i].bv_val );
                        ch_free( a_vals[i].bv_val );
+                       ch_free( a_nvals[i].bv_val );
                        if ( last > i ) {
                                a_vals[i] = a_vals[last];
+                               a_nvals[i] = a_nvals[last];
                        }
                        BER_BVZERO( &a_vals[last] );
+                       BER_BVZERO( &a_nvals[last] );
                        last--;
                        break;
 
                default:
                        /* leave attr untouched if massage failed */
-                       if ( !BER_BVISNULL( &dn ) && a_vals[i].bv_val != dn.bv_val ) {
+                       if ( !BER_BVISNULL( &pdn ) && a_vals[i].bv_val != pdn.bv_val ) {
                                ch_free( a_vals[i].bv_val );
-                               a_vals[i] = dn;
+                               a_vals[i] = pdn;
+                       }
+                       if ( !BER_BVISNULL( &ndn ) && a_nvals[i].bv_val != ndn.bv_val ) {
+                               ch_free( a_nvals[i].bv_val );
+                               a_nvals[i] = ndn;
                        }
                        break;
                }