]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/modify.c
Fixup bdb_entry_release now that entry_decode uses two memory blocks
[openldap] / servers / slapd / modify.c
index c3e21d1b8e9cd859ae17c083928b13f698fdd0bf..783d9ac89f81482bf8a5566a74b6c5517951e55c 100644 (file)
@@ -252,8 +252,13 @@ do_modify(
         * if we don't hold it.
         */
        if ( (be = select_backend( ndn, manageDSAit )) == NULL ) {
+               struct berval **ref = referral_rewrite( default_referral,
+                       NULL, dn, LDAP_SCOPE_DEFAULT );
+
                send_ldap_result( conn, op, rc = LDAP_REFERRAL,
-                       NULL, NULL, default_referral, NULL );
+                       NULL, NULL, ref ? ref : default_referral, NULL );
+
+               ber_bvecfree( ref );
                goto cleanup;
        }
 
@@ -282,8 +287,7 @@ do_modify(
         */
        if ( be->be_modify ) {
                /* do the update here */
-               int repl_user = (be->be_update_ndn != NULL &&
-                       strcmp( be->be_update_ndn, op->o_ndn ) == 0);
+               int repl_user = be_isupdate( be, op->o_ndn );
 #ifndef SLAPD_MULTIMASTER
                /* Multimaster slapd does not have to check for replicator dn
                 * because it accepts each modify request
@@ -337,9 +341,15 @@ do_modify(
 #ifndef SLAPD_MULTIMASTER
                /* send a referral */
                } else {
+                       struct berval **defref = be->be_update_refs
+                               ? be->be_update_refs : default_referral;
+                       struct berval **ref = referral_rewrite( defref,
+                               NULL, dn, LDAP_SCOPE_DEFAULT );
+
                        send_ldap_result( conn, op, rc = LDAP_REFERRAL, NULL, NULL,
-                               be->be_update_refs ? be->be_update_refs : default_referral,
-                               NULL );
+                               ref ? ref : defref, NULL );
+
+                       ber_bvecfree( ref );
 #endif
                }
        } else {
@@ -545,7 +555,7 @@ int slap_mods_opattrs(
                mod->sml_bvalues = (struct berval **) malloc( 2 * sizeof( struct berval * ) );
                mod->sml_bvalues[0] = ber_bvdup( &name );
                mod->sml_bvalues[1] = NULL;
-
+               assert( mod->sml_bvalues[0] );
                *modtail = mod;
                modtail = &mod->sml_next;
 
@@ -555,6 +565,7 @@ int slap_mods_opattrs(
                mod->sml_bvalues = (struct berval **) malloc( 2 * sizeof( struct berval * ) );
                mod->sml_bvalues[0] = ber_bvdup( &timestamp );
                mod->sml_bvalues[1] = NULL;
+               assert( mod->sml_bvalues[0] );
                *modtail = mod;
                modtail = &mod->sml_next;
        }
@@ -565,6 +576,7 @@ int slap_mods_opattrs(
        mod->sml_bvalues = (struct berval **) malloc( 2 * sizeof( struct berval * ) );
        mod->sml_bvalues[0] = ber_bvdup( &name );
        mod->sml_bvalues[1] = NULL;
+       assert( mod->sml_bvalues[0] );
        *modtail = mod;
        modtail = &mod->sml_next;
 
@@ -574,6 +586,7 @@ int slap_mods_opattrs(
        mod->sml_bvalues = (struct berval **) malloc( 2 * sizeof( struct berval * ) );
        mod->sml_bvalues[0] = ber_bvdup( &timestamp );
        mod->sml_bvalues[1] = NULL;
+       assert( mod->sml_bvalues[0] );
        *modtail = mod;
        modtail = &mod->sml_next;