mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-30 11:39:34 -05:00
ITS#7515 Fix nested transaction error handling.
mdb_txn_begin(): Do not free(mt_free_pgs), it needs mdb_midl_free(). mdb_txn_commit(): Catch commit(child) error.
This commit is contained in:
parent
521fdb00cc
commit
2d6aed7537
1 changed files with 9 additions and 8 deletions
|
|
@ -1939,14 +1939,11 @@ mdb_txn_begin(MDB_env *env, MDB_txn *parent, unsigned int flags, MDB_txn **ret)
|
|||
|
||||
if (parent) {
|
||||
unsigned int i;
|
||||
txn->mt_free_pgs = mdb_midl_alloc();
|
||||
if (!txn->mt_free_pgs) {
|
||||
free(txn);
|
||||
return ENOMEM;
|
||||
}
|
||||
txn->mt_u.dirty_list = malloc(sizeof(MDB_ID2)*MDB_IDL_UM_SIZE);
|
||||
if (!txn->mt_u.dirty_list) {
|
||||
free(txn->mt_free_pgs);
|
||||
if (!txn->mt_u.dirty_list ||
|
||||
!(txn->mt_free_pgs = mdb_midl_alloc()))
|
||||
{
|
||||
free(txn->mt_u.dirty_list);
|
||||
free(txn);
|
||||
return ENOMEM;
|
||||
}
|
||||
|
|
@ -2138,8 +2135,12 @@ mdb_txn_commit(MDB_txn *txn)
|
|||
assert(txn->mt_env != NULL);
|
||||
|
||||
if (txn->mt_child) {
|
||||
mdb_txn_commit(txn->mt_child);
|
||||
rc = mdb_txn_commit(txn->mt_child);
|
||||
txn->mt_child = NULL;
|
||||
if (rc) {
|
||||
mdb_txn_abort(txn);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
env = txn->mt_env;
|
||||
|
|
|
|||
Loading…
Reference in a new issue