From 2eda0bd7da34dc6ccbe9bb6bfa105aba087ecc65 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Mon, 14 Oct 2019 18:34:07 +0100 Subject: [PATCH] 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. --- servers/slapd/back-mdb/attr.c | 11 +++++++++++ servers/slapd/back-mdb/id2entry.c | 14 ++++++++++---- servers/slapd/back-mdb/proto-mdb.h | 1 + 3 files changed, 22 insertions(+), 4 deletions(-) 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 -- 2.47.2