diff --git a/libraries/libmdb/mdb.c b/libraries/libmdb/mdb.c
index e70e46d57244b65713c1c63cf4ce0509228168cf..954690e14952cbaa3811b26709a75ae222f7611a 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));