diff --git a/servers/slapd/back-mdb/id2entry.c b/servers/slapd/back-mdb/id2entry.c index 7b423bf4f538652035316724bd5f9404c5191d51..77a25a6daa0e12775f8cdf42ffb5aea784a8effb 100644 --- a/servers/slapd/back-mdb/id2entry.c +++ b/servers/slapd/back-mdb/id2entry.c @@ -188,7 +188,7 @@ int mdb_id2entry( rc = MDB_NOTFOUND; if ( rc ) return rc; - rc = mdb_entry_decode( op, &data, e ); + rc = mdb_entry_decode( op, mdb_cursor_txn( mc ), &data, e ); if ( rc ) return rc; (*e)->e_id = id; @@ -638,7 +638,7 @@ static int mdb_entry_encode(Operation *op, Entry *e, MDB_val *data, Ecount *eh) * structure. Attempting to do so will likely corrupt memory. */ -int mdb_entry_decode(Operation *op, MDB_val *data, Entry **e) +int mdb_entry_decode(Operation *op, MDB_txn *txn, MDB_val *data, Entry **e) { struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private; int i, j, nattrs, nvals; @@ -669,7 +669,19 @@ int mdb_entry_decode(Operation *op, MDB_val *data, Entry **e) for (;nattrs>0; nattrs--) { int have_nval = 0; - a->a_desc = mdb->mi_ads[*lp++]; + i = *lp++; + if (i > mdb->mi_numads) { + rc = mdb_ad_read(mdb, txn); + if (rc) + return rc; + if (i > mdb->mi_numads) { + Debug( LDAP_DEBUG_ANY, + "mdb_entry_decode: attribute index %d not recognized\n", + i, 0, 0 ); + return LDAP_OTHER; + } + } + a->a_desc = mdb->mi_ads[i]; a->a_flags = SLAP_ATTR_DONT_FREE_DATA | SLAP_ATTR_DONT_FREE_VALS; a->a_numvals = *lp++; if (a->a_numvals & HIGH_BIT) { diff --git a/servers/slapd/back-mdb/proto-mdb.h b/servers/slapd/back-mdb/proto-mdb.h index c5242a82a36ea4329d303ee3159a435087d64e1d..3671425dbf0a1129ebe389b0d98f0497c9bd1f26 100644 --- a/servers/slapd/back-mdb/proto-mdb.h +++ b/servers/slapd/back-mdb/proto-mdb.h @@ -193,7 +193,7 @@ int mdb_entry_return( Operation *op, Entry *e ); BI_entry_release_rw mdb_entry_release; BI_entry_get_rw mdb_entry_get; -int mdb_entry_decode( Operation *op, MDB_val *data, Entry **e ); +int mdb_entry_decode( Operation *op, MDB_txn *txn, MDB_val *data, Entry **e ); void mdb_reader_flush( MDB_env *env ); int mdb_opinfo_get( Operation *op, struct mdb_info *mdb, int rdonly, mdb_op_info **moi ); diff --git a/servers/slapd/back-mdb/search.c b/servers/slapd/back-mdb/search.c index 4cac2b30df00597abc44d48429c2593120cd9172..fd4876252996d14f493a78ce9e8a455b524a270a 100644 --- a/servers/slapd/back-mdb/search.c +++ b/servers/slapd/back-mdb/search.c @@ -806,7 +806,7 @@ notfound: goto done; } - rs->sr_err = mdb_entry_decode( op, &edata, &e ); + rs->sr_err = mdb_entry_decode( op, ltid, &edata, &e ); if ( rs->sr_err ) { rs->sr_err = LDAP_OTHER; rs->sr_text = "internal error in mdb_entry_decode"; diff --git a/servers/slapd/back-mdb/tools.c b/servers/slapd/back-mdb/tools.c index ccca51d0317a891062ac3ad8801df7faba86b63f..a2a4a1b858ac9b862eb6298b14c648864e3000db 100644 --- a/servers/slapd/back-mdb/tools.c +++ b/servers/slapd/back-mdb/tools.c @@ -373,7 +373,7 @@ mdb_tool_entry_get_int( BackendDB *be, ID id, Entry **ep ) } } } - rc = mdb_entry_decode( &op, &data, &e ); + rc = mdb_entry_decode( &op, txn, &data, &e ); e->e_id = id; if ( !BER_BVISNULL( &dn )) { e->e_name = dn;