]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/add.c
fix previous commit
[openldap] / servers / slapd / add.c
index e994b29d93b65697e18e1e890023a178c2d1d868..bb5903c0ded2a6a68a6737935715ecfe28f4525f 100644 (file)
@@ -165,7 +165,7 @@ do_add( Operation *op, SlapReply *rs )
        }
 
        rs->sr_err = slap_mods_check( modlist, &rs->sr_text,
-                         textbuf, textlen, NULL );
+               textbuf, textlen, NULL );
 
        if ( rs->sr_err != LDAP_SUCCESS ) {
                send_ldap_result( op, rs );
@@ -205,6 +205,7 @@ fe_op_add( Operation *op, SlapReply *rs )
        Modifications   *modlist = op->ora_modlist;
        Modifications   **modtail = &modlist;
        int             rc = 0;
+       BackendDB *op_be;
 
        manageDSAit = get_manageDSAit( op );
 
@@ -220,18 +221,28 @@ fe_op_add( Operation *op, SlapReply *rs )
                if ( !rs->sr_ref ) rs->sr_ref = default_referral;
                if ( rs->sr_ref ) {
                        rs->sr_err = LDAP_REFERRAL;
+                       op->o_bd = frontendDB;
                        send_ldap_result( op, rs );
+                       op->o_bd = NULL;
 
                        if ( rs->sr_ref != default_referral ) {
                                ber_bvarray_free( rs->sr_ref );
                        }
                } else {
+                       op->o_bd = frontendDB;
                        send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
                                "no global superior knowledge" );
+                       op->o_bd = NULL;
                }
                goto done;
        }
 
+       /* If we've got a glued backend, check the real backend */
+       op_be = op->o_bd;
+       if ( SLAP_GLUE_INSTANCE( op->o_bd )) {
+               op->o_bd = select_backend( &e->e_nname, manageDSAit, 0 );
+       }
+
        /* check restrictions */
        if( backend_check_restrictions( op, rs, NULL ) != LDAP_SUCCESS ) {
                send_ldap_result( op, rs );
@@ -265,6 +276,8 @@ fe_op_add( Operation *op, SlapReply *rs )
                        size_t          textlen = sizeof( textbuf );
                        slap_callback   cb = { NULL, slap_replog_cb, NULL, NULL };
 
+                       op->o_bd = op_be;
+
                        if ( !update ) {
                                rs->sr_err = slap_mods_no_update_check( modlist,
                                                &rs->sr_text,
@@ -583,6 +596,8 @@ slap_mods2entry(
                tail = &attr->a_next;
        }
 
+       *text = NULL;
+
        return LDAP_SUCCESS;
 }