]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-bdb/modify.c
normalize authcDN (ITS#3246); don't touch databases when running slapadd in dryryn...
[openldap] / servers / slapd / back-bdb / modify.c
index b2a14b022811b5e1b32aeaed6c8a9e99bc0e76e4..45d2efeb11eb9516fd8a87b3a5f4db93d7d5949f 100644 (file)
@@ -116,8 +116,11 @@ int bdb_modify_internal(
                        break;
 
                case LDAP_MOD_DELETE:
-                       if ( glue_attr_delete )
+                       if ( glue_attr_delete ) {
+                               err = LDAP_SUCCESS;
                                break;
+                       }
+
 #ifdef NEW_LOGGING
                        LDAP_LOG ( OPERATION, DETAIL1, 
                                "bdb_modify_internal: delete\n", 0, 0, 0 );
@@ -263,6 +266,10 @@ int bdb_modify_internal(
        rc = entry_schema_check( op->o_bd, e, save_attrs, text, textbuf, textlen );
        if ( rc != LDAP_SUCCESS || op->o_noop ) {
                attrs_free( e->e_attrs );
+               /* clear the indexing flags */
+               for ( ap = save_attrs; ap != NULL; ap = ap->a_next ) {
+                       ap->a_flags = 0;
+               }
                e->e_attrs = save_attrs;
 
                if ( rc != LDAP_SUCCESS ) {
@@ -346,7 +353,7 @@ bdb_modify( Operation *op, SlapReply *rs )
        size_t textlen = sizeof textbuf;
        DB_TXN  *ltid = NULL, *lt2;
        struct bdb_op_info opinfo;
-       Entry           dummy;
+       Entry           dummy = {0};
 
        u_int32_t       locker = 0;
        DB_LOCK         lock;
@@ -377,6 +384,10 @@ bdb_modify( Operation *op, SlapReply *rs )
 
        if( 0 ) {
 retry: /* transaction retry */
+               if ( dummy.e_attrs ) {
+                       attrs_free( dummy.e_attrs );
+                       dummy.e_attrs = NULL;
+               }
                if( e != NULL ) {
                        bdb_unlocked_cache_return_entry_w(&bdb->bi_cache, e);
                        e = NULL;
@@ -542,7 +553,18 @@ retry:     /* transaction retry */
        if ( rs->sr_err == LDAP_SUCCESS && !op->o_noop && !op->o_no_psearch ) {
                ldap_pvt_thread_rdwr_wlock( &bdb->bi_pslist_rwlock );
                LDAP_LIST_FOREACH ( ps_list, &bdb->bi_psearch_list, o_ps_link ) {
-                       bdb_psearch(op, rs, ps_list, e, LDAP_PSEARCH_BY_PREMODIFY );
+                       rc = bdb_psearch(op, rs, ps_list, e, LDAP_PSEARCH_BY_PREMODIFY );
+                       if ( rc ) {
+#ifdef NEW_LOGGING
+                               LDAP_LOG ( OPERATION, ERR,
+                                       "bdb_modify: persistent search failed (%d,%d)\n",
+                                       rc, rs->sr_err, 0 );
+#else
+                               Debug( LDAP_DEBUG_TRACE,
+                                       "bdb_modify: persistent search failed (%d,%d)\n",
+                                       rc, rs->sr_err, 0 );
+#endif
+                       }
                }
                ldap_pvt_thread_rdwr_wunlock( &bdb->bi_pslist_rwlock );
        }
@@ -601,6 +623,8 @@ retry:      /* transaction retry */
                if ( (rs->sr_err == LDAP_INSUFFICIENT_ACCESS) && opinfo.boi_err ) {
                        rs->sr_err = opinfo.boi_err;
                }
+               /* Only free attrs if they were dup'd.  */
+               if ( dummy.e_attrs == e->e_attrs ) dummy.e_attrs = NULL;
                switch( rs->sr_err ) {
                case DB_LOCK_DEADLOCK:
                case DB_LOCK_NOTGRANTED:
@@ -651,7 +675,7 @@ retry:      /* transaction retry */
                        postread_ctrl = &ctrls[num_ctrls++];
                        ctrls[num_ctrls] = NULL;
                }
-               if( slap_read_controls( op, rs, e,
+               if( slap_read_controls( op, rs, &dummy,
                        &slap_post_read_bv, postread_ctrl ) )
                {
 #ifdef NEW_LOGGING
@@ -679,6 +703,7 @@ retry:      /* transaction retry */
                case DB_LOCK_NOTGRANTED:
                        goto retry;
                }
+               dummy.e_attrs = NULL;
 
                if ( LDAP_STAILQ_EMPTY( &op->o_bd->be_syncinfo )) {
                        if ( ctxcsn_added ) {
@@ -691,12 +716,34 @@ retry:    /* transaction retry */
                        /* Loop through in-scope entries for each psearch spec */
                        ldap_pvt_thread_rdwr_wlock( &bdb->bi_pslist_rwlock );
                        LDAP_LIST_FOREACH ( ps_list, &bdb->bi_psearch_list, o_ps_link ) {
-                               bdb_psearch( op, rs, ps_list, e, LDAP_PSEARCH_BY_MODIFY );
+                               rc = bdb_psearch( op, rs, ps_list, e, LDAP_PSEARCH_BY_MODIFY );
+                               if ( rc ) {
+#ifdef NEW_LOGGING
+                                       LDAP_LOG ( OPERATION, ERR,
+                                               "bdb_modify: persistent search failed (%d,%d)\n",
+                                               rc, rs->sr_err, 0 );
+#else
+                                       Debug( LDAP_DEBUG_TRACE,
+                                               "bdb_modify: persistent search failed (%d,%d)\n",
+                                               rc, rs->sr_err, 0 );
+#endif
+                               }
                        }
                        pm_list = LDAP_LIST_FIRST(&op->o_pm_list);
                        while ( pm_list != NULL ) {
-                               bdb_psearch(op, rs, pm_list->ps_op,
+                               rc = bdb_psearch(op, rs, pm_list->ps_op,
                                                        e, LDAP_PSEARCH_BY_SCOPEOUT);
+                               if ( rc ) {
+#ifdef NEW_LOGGING
+                                       LDAP_LOG ( OPERATION, ERR,
+                                               "bdb_modify: persistent search failed (%d,%d)\n",
+                                               rc, rs->sr_err, 0 );
+#else
+                                       Debug( LDAP_DEBUG_TRACE,
+                                               "bdb_modify: persistent search failed (%d,%d)\n",
+                                               rc, rs->sr_err, 0 );
+#endif
+                               }
                                LDAP_LIST_REMOVE ( pm_list, ps_link );
                                pm_prev = pm_list;
                                pm_list = LDAP_LIST_NEXT ( pm_list, ps_link );
@@ -744,6 +791,9 @@ retry:      /* transaction retry */
        if( num_ctrls ) rs->sr_ctrls = ctrls;
 
 return_results:
+       if( dummy.e_attrs ) {
+               attrs_free( dummy.e_attrs );
+       }
        send_ldap_result( op, rs );
 
        if( rs->sr_err == LDAP_SUCCESS && bdb->bi_txn_cp ) {