From: Howard Chu Date: Mon, 9 Apr 2012 11:44:08 +0000 (-0700) Subject: ITS#7230 check and strip 0 length IDLs from freelist X-Git-Tag: OPENLDAP_REL_ENG_2_4_32~125^2~18 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=de0cb27d70554b8540cbb73bf5fe682546fd48f3;p=openldap ITS#7230 check and strip 0 length IDLs from freelist --- diff --git a/libraries/libmdb/mdb.c b/libraries/libmdb/mdb.c index e70e46d572..954690e149 100644 --- a/libraries/libmdb/mdb.c +++ b/libraries/libmdb/mdb.c @@ -1224,7 +1224,9 @@ mdb_page_alloc(MDB_cursor *mc, int num) last = *kptr; } else { MDB_val key; - int rc, exact = 0; + int rc, exact; +again: + exact = 0; last = txn->mt_env->me_pglast + 1; leaf = NULL; key.mv_data = &last; @@ -1254,13 +1256,17 @@ mdb_page_alloc(MDB_cursor *mc, int num) if (!txn->mt_env->me_pgfirst) { mdb_node_read(txn, leaf, &data); } + txn->mt_env->me_pglast = last; + if (!txn->mt_env->me_pgfirst) + txn->mt_env->me_pgfirst = last; idl = (ID *) data.mv_data; + /* We might have a zero-length IDL due to freelist growth + * during a prior commit + */ + if (!idl[0]) goto again; mop = malloc(sizeof(MDB_oldpages) + MDB_IDL_SIZEOF(idl) - sizeof(pgno_t)); mop->mo_next = txn->mt_env->me_pghead; mop->mo_txnid = last; - txn->mt_env->me_pglast = last; - if (!txn->mt_env->me_pgfirst) - txn->mt_env->me_pgfirst = last; txn->mt_env->me_pghead = mop; memcpy(mop->mo_pages, idl, MDB_IDL_SIZEOF(idl));