From 81b0c68c2a8100d0bf7187a764e742f3a988785a Mon Sep 17 00:00:00 2001
From: Howard Chu <hyc@openldap.org>
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));
 
-- 
GitLab