]> 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 2089bff88341b9d8b76dfd5964e3547a11b8a072..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 {
@@ -541,39 +551,42 @@ int slap_mods_opattrs(
        if( op->o_tag == LDAP_REQ_ADD ) {
                mod = (Modifications *) ch_calloc( 1, sizeof( Modifications ) );
                mod->sml_op = mop;
-               mod->sml_desc = ad_dup( slap_schema.si_ad_creatorsName );
+               mod->sml_desc = slap_schema.si_ad_creatorsName;
                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;
 
                mod = (Modifications *) ch_calloc( 1, sizeof( Modifications ) );
                mod->sml_op = mop;
-               mod->sml_desc = ad_dup( slap_schema.si_ad_createTimestamp );
+               mod->sml_desc = slap_schema.si_ad_createTimestamp;
                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;
        }
 
        mod = (Modifications *) ch_calloc( 1, sizeof( Modifications ) );
        mod->sml_op = mop;
-       mod->sml_desc = ad_dup( slap_schema.si_ad_modifiersName );
+       mod->sml_desc = slap_schema.si_ad_modifiersName;
        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;
 
        mod = (Modifications *) ch_calloc( 1, sizeof( Modifications ) );
        mod->sml_op = mop;
-       mod->sml_desc = ad_dup( slap_schema.si_ad_modifyTimestamp );
+       mod->sml_desc = slap_schema.si_ad_modifyTimestamp;
        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;