From: Howard Chu Date: Mon, 14 Oct 2019 17:34:07 +0000 (+0100) Subject: ITS#9091 drop attr mappings added in an aborted txn X-Git-Tag: OPENLDAP_REL_ENG_2_4_49~39 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2eda0bd7da34dc6ccbe9bb6bfa105aba087ecc65;p=thirdparty%2Fopenldap.git ITS#9091 drop attr mappings added in an aborted txn If a txn is aborted in id2entry_put, attribute index mappings added during that txn must also be dropped from memory. --- diff --git a/servers/slapd/back-mdb/attr.c b/servers/slapd/back-mdb/attr.c index 56767275fe..42f150a6fa 100644 --- a/servers/slapd/back-mdb/attr.c +++ b/servers/slapd/back-mdb/attr.c @@ -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; +} diff --git a/servers/slapd/back-mdb/id2entry.c b/servers/slapd/back-mdb/id2entry.c index 6682d91407..fc8aba32a5 100644 --- a/servers/slapd/back-mdb/id2entry.c +++ b/servers/slapd/back-mdb/id2entry.c @@ -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; } diff --git a/servers/slapd/back-mdb/proto-mdb.h b/servers/slapd/back-mdb/proto-mdb.h index 533d392818..21bdf9ea55 100644 --- a/servers/slapd/back-mdb/proto-mdb.h +++ b/servers/slapd/back-mdb/proto-mdb.h @@ -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