]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
ITS#3448 fixes
authorHoward Chu <hyc@openldap.org>
Sat, 25 Dec 2004 20:44:30 +0000 (20:44 +0000)
committerHoward Chu <hyc@openldap.org>
Sat, 25 Dec 2004 20:44:30 +0000 (20:44 +0000)
servers/slapd/back-bdb/init.c
servers/slapd/back-bdb/proto-bdb.h
servers/slapd/back-bdb/search.c

index 618760a2cc3eb9ff1d0e74b68bce151bdc7b29d9..13310a3e2f8819e6ec42c4d508a07d0f334f0ac6 100644 (file)
@@ -655,7 +655,7 @@ bdb_initialize(
        bi->bi_op_unbind = 0;
 
        bi->bi_op_abandon = bdb_abandon;
-       bi->bi_op_cancel = bdb_cancel;
+       bi->bi_op_cancel = bdb_abandon;
 
        bi->bi_extended = bdb_extended;
 
index 5f33ddd5a11a54ec1f94ca89bf53f8cebc517922..2474c83b77293271034c559439b8a8a1dcc51565 100644 (file)
@@ -539,12 +539,10 @@ int bdb_locker_id( Operation *op, DB_ENV *env, int *locker );
  */
 
 #define bdb_abandon                                    BDB_SYMBOL(abandon)
-#define bdb_cancel                                     BDB_SYMBOL(cancel)
 #define bdb_do_search                          BDB_SYMBOL(do_search)
 #define bdb_psearch                            BDB_SYMBOL(psearch)
 
 BI_op_abandon bdb_abandon;
-BI_op_cancel bdb_cancel;
 
 int bdb_psearch(
        Operation       *op,
index abcd1f4c2eb74cc8ef2a473d4e0044d782d14253..744baedd0d9caff743457875496d8d4da55c883b 100644 (file)
@@ -306,7 +306,7 @@ sameido:
 #define IS_PSEARCH (op != sop)
 
 static Operation *
-bdb_drop_psearch( Operation *op, ber_int_t msgid )
+bdb_drop_psearch( Operation *op, ber_int_t msgid, int lock )
 {
        Operation       *ps_list;
        struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
@@ -316,13 +316,15 @@ bdb_drop_psearch( Operation *op, ber_int_t msgid )
                        if ( ps_list->o_msgid == msgid ) {
                                ps_list->o_abandon = 1;
                                LDAP_LIST_REMOVE( ps_list, o_ps_link );
-                               ldap_pvt_thread_mutex_lock( &op->o_conn->c_mutex );
+                               if ( lock )
+                                       ldap_pvt_thread_mutex_lock( &op->o_conn->c_mutex );
                                LDAP_STAILQ_REMOVE( &op->o_conn->c_ops, ps_list,
                                        slap_op, o_next );
                                LDAP_STAILQ_NEXT( ps_list, o_next ) = NULL;
                                op->o_conn->c_n_ops_executing--;
                                op->o_conn->c_n_ops_completed++;
-                               ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex );
+                               if ( lock )
+                                       ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex );
                                return ps_list;
                        }
                }
@@ -337,7 +339,7 @@ bdb_abandon( Operation *op, SlapReply *rs )
        Operation       *ps;
        void            *saved_tmpmemctx;
 
-       ps = bdb_drop_psearch( op, op->oq_abandon.rs_msgid );
+       ps = bdb_drop_psearch( op, op->oq_abandon.rs_msgid, (op->o_tag != LDAP_REQ_ABANDON) );
        if ( ps ) {
                if ( ps->o_savmemctx ) {
                        ps->o_tmpmemctx = ps->o_savmemctx;
@@ -345,50 +347,10 @@ bdb_abandon( Operation *op, SlapReply *rs )
                        ber_set_option(ps->o_ber, LBER_OPT_BER_MEMCTX, &ps->o_savmemctx);
                }
                saved_tmpmemctx = ps->o_tmpmemctx;
-
-               if (!BER_BVISNULL(&ps->o_req_dn)) {
-                       slap_sl_free( ps->o_req_dn.bv_val, ps->o_tmpmemctx );
-               }
-               if (!BER_BVISNULL(&ps->o_req_ndn)) {
-                       slap_sl_free( ps->o_req_ndn.bv_val, ps->o_tmpmemctx );
-               }
-               if (!BER_BVISNULL(&ps->ors_filterstr)) {
-                       ps->o_tmpfree(ps->ors_filterstr.bv_val, ps->o_tmpmemctx);
-               }
-               if (ps->ors_filter != NULL) {
-                       filter_free_x(ps, ps->ors_filter);
-               }
-               if (ps->ors_attrs != NULL) {
-                       ps->o_tmpfree(ps->ors_attrs, ps->o_tmpmemctx);
-               }
-
-               slap_op_free ( ps );
-
-               if ( saved_tmpmemctx ) {
-                       sl_mem_destroy( NULL, saved_tmpmemctx );
-               }
-
-               return LDAP_SUCCESS;
-       }
-       return LDAP_UNAVAILABLE;
-}
-
-int
-bdb_cancel( Operation *op, SlapReply *rs )
-{
-       Operation       *ps;
-       void            *saved_tmpmemctx;
-
-       ps = bdb_drop_psearch( op, op->oq_cancel.rs_msgid );
-       if ( ps ) {
-               if ( ps->o_savmemctx ) {
-                       ps->o_tmpmemctx = ps->o_savmemctx;
-                       ps->o_tmpmfuncs = &sl_mfuncs;
-                       ber_set_option(ps->o_ber, LBER_OPT_BER_MEMCTX, &ps->o_savmemctx);
+               if ( op->o_tag != LDAP_REQ_ABANDON ) {
+                       rs->sr_err = LDAP_CANCELLED;
+                       send_ldap_result( ps, rs );
                }
-               saved_tmpmemctx = ps->o_tmpmemctx;
-               rs->sr_err = LDAP_CANCELLED;
-               send_ldap_result( ps, rs );
 
                if (!BER_BVISNULL(&ps->o_req_dn)) {
                        slap_sl_free( ps->o_req_dn.bv_val, ps->o_tmpmemctx );
@@ -940,7 +902,7 @@ loop_begin:
                /* check for abandon */
                if ( sop->o_abandon ) {
                        if ( sop != op ) {
-                               bdb_drop_psearch( sop, sop->o_msgid );
+                               bdb_drop_psearch( sop, sop->o_msgid, 1 );
                        }
                        rs->sr_err = LDAP_SUCCESS;
                        goto done;