]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
ITS#9531 back-mdb: fix delete of context entry
authorHoward Chu <hyc@openldap.org>
Mon, 26 Apr 2021 17:27:40 +0000 (18:27 +0100)
committerQuanah Gibson-Mount <quanah@openldap.org>
Fri, 30 Apr 2021 17:06:39 +0000 (17:06 +0000)
We already checked if attempting to delete the suffix, but
didn't skip the parent check as we should have.

servers/slapd/back-mdb/delete.c

index 5d3a5746a9fb1d281e2a09af00a829415b4595a7..a77cde9ee7a766106ae83b4dcd4569aebb37684a 100644 (file)
@@ -113,57 +113,58 @@ txnReturn:
                slap_get_csn( op, &csn, 1 );
        }
 
-       if ( !be_issuffix( op->o_bd, &op->o_req_ndn ) ) {
-               dnParent( &op->o_req_ndn, &pdn );
-       }
-
        rs->sr_err = mdb_cursor_open( txn, mdb->mi_dn2id, &mc );
        if ( rs->sr_err ) {
                rs->sr_err = LDAP_OTHER;
                rs->sr_text = "internal error";
                goto return_results;
        }
-       /* get parent */
-       rs->sr_err = mdb_dn2entry( op, txn, mc, &pdn, &p, NULL, 1 );
-       switch( rs->sr_err ) {
-       case 0:
-       case MDB_NOTFOUND:
-               break;
-       case LDAP_BUSY:
-               rs->sr_text = "ldap server busy";
-               goto return_results;
-       default:
-               rs->sr_err = LDAP_OTHER;
-               rs->sr_text = "internal error";
-               goto return_results;
-       }
-       if ( rs->sr_err == MDB_NOTFOUND ) {
-               Debug( LDAP_DEBUG_ARGS,
-                       "<=- " LDAP_XSTRING(mdb_delete) ": no such object %s\n",
-                       op->o_req_dn.bv_val, 0, 0);
 
-               if ( p && !BER_BVISEMPTY( &p->e_name )) {
-                       rs->sr_matched = ch_strdup( p->e_name.bv_val );
-                       if ( is_entry_referral( p )) {
-                               BerVarray ref = get_entry_referrals( op, p );
-                               rs->sr_ref = referral_rewrite( ref, &p->e_name,
-                                       &op->o_req_dn, LDAP_SCOPE_DEFAULT );
-                               ber_bvarray_free( ref );
+       if ( !be_issuffix( op->o_bd, &op->o_req_ndn ) ) {
+               dnParent( &op->o_req_ndn, &pdn );
+
+               /* get parent */
+               rs->sr_err = mdb_dn2entry( op, txn, mc, &pdn, &p, NULL, 1 );
+               switch( rs->sr_err ) {
+               case 0:
+               case MDB_NOTFOUND:
+                       break;
+               case LDAP_BUSY:
+                       rs->sr_text = "ldap server busy";
+                       goto return_results;
+               default:
+                       rs->sr_err = LDAP_OTHER;
+                       rs->sr_text = "internal error";
+                       goto return_results;
+               }
+               if ( rs->sr_err == MDB_NOTFOUND ) {
+                       Debug( LDAP_DEBUG_ARGS,
+                               "<=- " LDAP_XSTRING(mdb_delete) ": no such object %s\n",
+                               op->o_req_dn.bv_val, 0, 0 );
+
+                       if ( p && !BER_BVISEMPTY( &p->e_name )) {
+                               rs->sr_matched = ch_strdup( p->e_name.bv_val );
+                               if ( is_entry_referral( p )) {
+                                       BerVarray ref = get_entry_referrals( op, p );
+                                       rs->sr_ref = referral_rewrite( ref, &p->e_name,
+                                               &op->o_req_dn, LDAP_SCOPE_DEFAULT );
+                                       ber_bvarray_free( ref );
+                               } else {
+                                       rs->sr_ref = NULL;
+                               }
                        } else {
-                               rs->sr_ref = NULL;
+                               rs->sr_ref = referral_rewrite( default_referral, NULL,
+                                               &op->o_req_dn, LDAP_SCOPE_DEFAULT );
+                       }
+                       if ( p ) {
+                               mdb_entry_return( op, p );
+                               p = NULL;
                        }
-               } else {
-                       rs->sr_ref = referral_rewrite( default_referral, NULL,
-                                       &op->o_req_dn, LDAP_SCOPE_DEFAULT );
-               }
-               if ( p ) {
-                       mdb_entry_return( op, p );
-                       p = NULL;
-               }
 
-               rs->sr_err = LDAP_REFERRAL;
-               rs->sr_flags = REP_MATCHED_MUSTBEFREED | REP_REF_MUSTBEFREED;
-               goto return_results;
+                       rs->sr_err = LDAP_REFERRAL;
+                       rs->sr_flags = REP_MATCHED_MUSTBEFREED | REP_REF_MUSTBEFREED;
+                       goto return_results;
+               }
        }
 
        /* get entry */