mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-20 22:59:34 -05:00
Fix freelist bug on page split
NULL out env->pghead before writing it, so that its pages can't be used to satisfy the write.
This commit is contained in:
parent
85bfb3c1d1
commit
ea0d07ffa3
1 changed files with 4 additions and 3 deletions
|
|
@ -1128,7 +1128,7 @@ mdb_page_alloc(MDB_cursor *mc, int num)
|
||||||
if (pgno == P_INVALID) {
|
if (pgno == P_INVALID) {
|
||||||
/* DB size is maxed out */
|
/* DB size is maxed out */
|
||||||
if (txn->mt_next_pgno + num >= txn->mt_env->me_maxpg) {
|
if (txn->mt_next_pgno + num >= txn->mt_env->me_maxpg) {
|
||||||
DPRINTF("DB size maxed out");
|
DPUTS("DB size maxed out");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1764,13 +1764,13 @@ mdb_txn_commit(MDB_txn *txn)
|
||||||
MDB_oldpages *mop;
|
MDB_oldpages *mop;
|
||||||
|
|
||||||
mop = env->me_pghead;
|
mop = env->me_pghead;
|
||||||
|
env->me_pghead = NULL;
|
||||||
key.mv_size = sizeof(pgno_t);
|
key.mv_size = sizeof(pgno_t);
|
||||||
key.mv_data = &mop->mo_txnid;
|
key.mv_data = &mop->mo_txnid;
|
||||||
data.mv_size = MDB_IDL_SIZEOF(mop->mo_pages);
|
data.mv_size = MDB_IDL_SIZEOF(mop->mo_pages);
|
||||||
data.mv_data = mop->mo_pages;
|
data.mv_data = mop->mo_pages;
|
||||||
mdb_cursor_put(&mc, &key, &data, 0);
|
mdb_cursor_put(&mc, &key, &data, 0);
|
||||||
free(env->me_pghead);
|
free(mop);
|
||||||
env->me_pghead = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update DB root pointers. Their pages have already been
|
/* Update DB root pointers. Their pages have already been
|
||||||
|
|
@ -3202,6 +3202,7 @@ mdb_page_search(MDB_cursor *mc, MDB_val *key, int modify)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert(root > 1);
|
||||||
if ((rc = mdb_page_get(mc->mc_txn, root, &mc->mc_pg[0])))
|
if ((rc = mdb_page_get(mc->mc_txn, root, &mc->mc_pg[0])))
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue