From de0cb27d70554b8540cbb73bf5fe682546fd48f3 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Mon, 9 Apr 2012 04:44:08 -0700 Subject: [PATCH] ITS#7230 check and strip 0 length IDLs from freelist --- libraries/libmdb/mdb.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) 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)); -- 2.39.5