mirror of
https://github.com/python/cpython.git
synced 2025-01-19 06:54:52 +08:00
Fix bug #1413192, fix seg fault in bsddb if a txn was deleted before the env.
Will backport.
This commit is contained in:
parent
2a4712dc80
commit
62a21121b4
16
Lib/bsddb/test/test_1413192.py
Normal file
16
Lib/bsddb/test/test_1413192.py
Normal 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)
|
@ -46,6 +46,12 @@ test_all.verbose = verbose
|
|||||||
|
|
||||||
|
|
||||||
def suite():
|
def suite():
|
||||||
|
try:
|
||||||
|
# this is special, it used to segfault the interpreter
|
||||||
|
import test_1413192
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
test_modules = [
|
test_modules = [
|
||||||
'test_associate',
|
'test_associate',
|
||||||
'test_basics',
|
'test_basics',
|
||||||
|
@ -22,6 +22,12 @@ if 'silent' in sys.argv: # take care of old flag, just in case
|
|||||||
|
|
||||||
|
|
||||||
def suite():
|
def suite():
|
||||||
|
try:
|
||||||
|
# this is special, it used to segfault the interpreter
|
||||||
|
import bsddb.test.test_1413192
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
test_modules = [
|
test_modules = [
|
||||||
'test_associate',
|
'test_associate',
|
||||||
'test_basics',
|
'test_basics',
|
||||||
|
@ -216,6 +216,9 @@ Core and builtins
|
|||||||
Extension Modules
|
Extension Modules
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Bug #1413192, fix seg fault in bsddb if a transaction was deleted
|
||||||
|
before the env.
|
||||||
|
|
||||||
- Patch #1103116: Basic AF_NETLINK support.
|
- Patch #1103116: Basic AF_NETLINK support.
|
||||||
|
|
||||||
- Bug #1402308, (possible) segfault when using mmap.mmap(-1, ...)
|
- Bug #1402308, (possible) segfault when using mmap.mmap(-1, ...)
|
||||||
|
@ -266,6 +266,7 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
PyObject_HEAD
|
PyObject_HEAD
|
||||||
DB_TXN* txn;
|
DB_TXN* txn;
|
||||||
|
PyObject *env;
|
||||||
#ifdef HAVE_WEAKREF
|
#ifdef HAVE_WEAKREF
|
||||||
PyObject *in_weakreflist; /* List of weak references */
|
PyObject *in_weakreflist; /* List of weak references */
|
||||||
#endif
|
#endif
|
||||||
@ -928,6 +929,8 @@ newDBTxnObject(DBEnvObject* myenv, DB_TXN *parent, int flags)
|
|||||||
DBTxnObject* self = PyObject_New(DBTxnObject, &DBTxn_Type);
|
DBTxnObject* self = PyObject_New(DBTxnObject, &DBTxn_Type);
|
||||||
if (self == NULL)
|
if (self == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
Py_INCREF(myenv);
|
||||||
|
self->env = (PyObject*)myenv;
|
||||||
#ifdef HAVE_WEAKREF
|
#ifdef HAVE_WEAKREF
|
||||||
self->in_weakreflist = NULL;
|
self->in_weakreflist = NULL;
|
||||||
#endif
|
#endif
|
||||||
@ -938,11 +941,10 @@ newDBTxnObject(DBEnvObject* myenv, DB_TXN *parent, int flags)
|
|||||||
#else
|
#else
|
||||||
err = txn_begin(myenv->db_env, parent, &(self->txn), flags);
|
err = txn_begin(myenv->db_env, parent, &(self->txn), flags);
|
||||||
#endif
|
#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;
|
MYDB_END_ALLOW_THREADS;
|
||||||
if (makeDBError(err)) {
|
if (makeDBError(err)) {
|
||||||
|
Py_DECREF(self->env);
|
||||||
|
PyObject_Del(self);
|
||||||
self = NULL;
|
self = NULL;
|
||||||
}
|
}
|
||||||
return self;
|
return self;
|
||||||
@ -973,6 +975,7 @@ DBTxn_dealloc(DBTxnObject* self)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Py_DECREF(self->env);
|
||||||
PyObject_Del(self);
|
PyObject_Del(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user