Fix bug #1413192, fix seg fault in bsddb if a txn was deleted before the env.

Will backport.
This commit is contained in:
Neal Norwitz 2006-01-25 05:21:55 +00:00
parent 2a4712dc80
commit 62a21121b4
5 changed files with 37 additions and 3 deletions

View File

@ -0,0 +1,16 @@
# http://python.org/sf/1413192
#
# This test relies on the variable names, see the bug report for details.
# The problem was that the env was deallocated prior to the txn.
from bsddb import db
env_name = '.'
env = db.DBEnv()
env.open(env_name, db.DB_CREATE | db.DB_INIT_TXN)
the_txn = env.txn_begin()
map = db.DB(env)
map.open('xxx.db', "p", db.DB_HASH, db.DB_CREATE, 0666, txn=the_txn)

View File

@ -46,6 +46,12 @@ test_all.verbose = verbose
def suite():
try:
# this is special, it used to segfault the interpreter
import test_1413192
except:
pass
test_modules = [
'test_associate',
'test_basics',

View File

@ -22,6 +22,12 @@ if 'silent' in sys.argv: # take care of old flag, just in case
def suite():
try:
# this is special, it used to segfault the interpreter
import bsddb.test.test_1413192
except:
pass
test_modules = [
'test_associate',
'test_basics',

View File

@ -216,6 +216,9 @@ Core and builtins
Extension Modules
-----------------
- Bug #1413192, fix seg fault in bsddb if a transaction was deleted
before the env.
- Patch #1103116: Basic AF_NETLINK support.
- Bug #1402308, (possible) segfault when using mmap.mmap(-1, ...)

View File

@ -266,6 +266,7 @@ typedef struct {
typedef struct {
PyObject_HEAD
DB_TXN* txn;
PyObject *env;
#ifdef HAVE_WEAKREF
PyObject *in_weakreflist; /* List of weak references */
#endif
@ -928,6 +929,8 @@ newDBTxnObject(DBEnvObject* myenv, DB_TXN *parent, int flags)
DBTxnObject* self = PyObject_New(DBTxnObject, &DBTxn_Type);
if (self == NULL)
return NULL;
Py_INCREF(myenv);
self->env = (PyObject*)myenv;
#ifdef HAVE_WEAKREF
self->in_weakreflist = NULL;
#endif
@ -938,11 +941,10 @@ newDBTxnObject(DBEnvObject* myenv, DB_TXN *parent, int flags)
#else
err = txn_begin(myenv->db_env, parent, &(self->txn), flags);
#endif
/* TODO add a weakref(self) to the self->myenvobj->open_child_weakrefs
* list so that a DBEnv can refuse to close without aborting any open
* open DBTxns and closing any open DBs first. */
MYDB_END_ALLOW_THREADS;
if (makeDBError(err)) {
Py_DECREF(self->env);
PyObject_Del(self);
self = NULL;
}
return self;
@ -973,6 +975,7 @@ DBTxn_dealloc(DBTxnObject* self)
}
#endif
Py_DECREF(self->env);
PyObject_Del(self);
}