]> git.sur5r.net Git - openldap/commitdiff
ITS#7798 fix mdb_entry_decode()
authorHoward Chu <hyc@openldap.org>
Fri, 7 Feb 2014 11:02:33 +0000 (03:02 -0800)
committerHoward Chu <hyc@openldap.org>
Fri, 7 Feb 2014 11:02:33 +0000 (03:02 -0800)
servers/slapd/back-mdb/id2entry.c
servers/slapd/back-mdb/proto-mdb.h
servers/slapd/back-mdb/search.c
servers/slapd/back-mdb/tools.c

index 7b423bf4f538652035316724bd5f9404c5191d51..77a25a6daa0e12775f8cdf42ffb5aea784a8effb 100644 (file)
@@ -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) {
index c5242a82a36ea4329d303ee3159a435087d64e1d..3671425dbf0a1129ebe389b0d98f0497c9bd1f26 100644 (file)
@@ -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 );
index 4cac2b30df00597abc44d48429c2593120cd9172..fd4876252996d14f493a78ce9e8a455b524a270a 100644 (file)
@@ -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";
index 5b5f505ca49d432c2711ea0cfdf0cecbaf513558..0839d56784ed1571c669a3d58f0ccaaf2f795971 100644 (file)
@@ -396,7 +396,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;