]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
ITS#9091 drop attr mappings added in an aborted txn
authorHoward Chu <hyc@openldap.org>
Mon, 14 Oct 2019 17:34:07 +0000 (18:34 +0100)
committerQuanah Gibson-Mount <quanah@openldap.org>
Fri, 22 Nov 2019 18:06:35 +0000 (18:06 +0000)
If a txn is aborted in id2entry_put, attribute index mappings
added during that txn must also be dropped from memory.

servers/slapd/back-mdb/attr.c
servers/slapd/back-mdb/id2entry.c
servers/slapd/back-mdb/proto-mdb.h

index 56767275fe4d13e2dff97e2c8aaa146c87ec7c1f..42f150a6fa9228384b620cdab55b7d9efc4b4c3e 100644 (file)
@@ -628,3 +628,14 @@ int mdb_ad_get( struct mdb_info *mdb, MDB_txn *txn, AttributeDescription *ad )
 
        return rc;
 }
+
+void mdb_ad_unwind( struct mdb_info *mdb, int prev_ads )
+{
+       int i;
+
+       for (i=mdb->mi_numads; i>prev_ads; i--) {
+               mdb->mi_adxs[mdb->mi_ads[i]->ad_index] = 0;
+               mdb->mi_ads[i] = NULL;
+       }
+       mdb->mi_numads = i;
+}
index 6682d91407ce9e7c2ee7dde8bbe9d8a9719ba189..fc8aba32a5cb90a2d10a3dce5dcb47a38febb3f0 100644 (file)
@@ -47,7 +47,7 @@ static int mdb_id2entry_put(
        struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private;
        Ecount ec;
        MDB_val key, data;
-       int rc;
+       int rc, prev_ads = mdb->mi_numads;
 
        /* We only store rdns, and they go in the dn2id database. */
 
@@ -55,8 +55,10 @@ static int mdb_id2entry_put(
        key.mv_size = sizeof(ID);
 
        rc = mdb_entry_partsize( mdb, txn, e, &ec );
-       if (rc)
-               return LDAP_OTHER;
+       if (rc) {
+               rc = LDAP_OTHER;
+               goto fail;
+       }
 
        flag |= MDB_RESERVE;
 
@@ -72,7 +74,7 @@ again:
        if (rc == MDB_SUCCESS) {
                rc = mdb_entry_encode( op, e, &data, &ec );
                if( rc != LDAP_SUCCESS )
-                       return rc;
+                       goto fail;
        }
        if (rc) {
                /* Was there a hole from slapadd? */
@@ -87,6 +89,10 @@ again:
                if ( rc != MDB_KEYEXIST )
                        rc = LDAP_OTHER;
        }
+fail:
+       if (rc) {
+               mdb_ad_unwind( mdb, prev_ads );
+       }
        return rc;
 }
 
index 533d39281883bd468d06c1907c2316ec9e232836..21bdf9ea5510c74142198700d855b25e6dbf2e45 100644 (file)
@@ -48,6 +48,7 @@ void mdb_attr_info_free( AttrInfo *ai );
 
 int mdb_ad_read( struct mdb_info *mdb, MDB_txn *txn );
 int mdb_ad_get( struct mdb_info *mdb, MDB_txn *txn, AttributeDescription *ad );
+void mdb_ad_unwind( struct mdb_info *mdb, int prev_ads );
 
 /*
  * config.c