From ebf1dcaeaf04fc28b322ca641caee752ea5e633e Mon Sep 17 00:00:00 2001 From: Neal Norwitz Date: Wed, 25 Jan 2006 05:29:17 +0000 Subject: Backport: Fix bug #1413192, fix seg fault in bsddb if a txn was deleted before the env. --- Lib/bsddb/test/test_1413192.py | 16 ++++++++++++++++ Lib/bsddb/test/test_all.py | 6 ++++++ Lib/test/test_bsddb3.py | 6 ++++++ Misc/NEWS | 3 +++ Modules/_bsddb.c | 9 ++++++--- 5 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 Lib/bsddb/test/test_1413192.py diff --git a/Lib/bsddb/test/test_1413192.py b/Lib/bsddb/test/test_1413192.py new file mode 100644 index 0000000..45afb36 --- /dev/null +++ b/Lib/bsddb/test/test_1413192.py @@ -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) diff --git a/Lib/bsddb/test/test_all.py b/Lib/bsddb/test/test_all.py index 7b1bf3d..23dba0c 100644 --- a/Lib/bsddb/test/test_all.py +++ b/Lib/bsddb/test/test_all.py @@ -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', diff --git a/Lib/test/test_bsddb3.py b/Lib/test/test_bsddb3.py index cd6ccc6..34555ff 100644 --- a/Lib/test/test_bsddb3.py +++ b/Lib/test/test_bsddb3.py @@ -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', diff --git a/Misc/NEWS b/Misc/NEWS index 8382e86..e23712b 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -208,6 +208,9 @@ Core and builtins Extension Modules ----------------- +- Bug #1413192, fix seg fault in bsddb if a transaction was deleted + before the env. + - Bug #1402308, (possible) segfault when using mmap.mmap(-1, ...) - Bug #1400822, _curses over{lay,write} doesn't work when passing 6 ints. diff --git a/Modules/_bsddb.c b/Modules/_bsddb.c index 0ef797c..c6efa1c 100644 --- a/Modules/_bsddb.c +++ b/Modules/_bsddb.c @@ -265,6 +265,7 @@ typedef struct { typedef struct { PyObject_HEAD DB_TXN* txn; + PyObject *env; #ifdef HAVE_WEAKREF PyObject *in_weakreflist; /* List of weak references */ #endif @@ -921,6 +922,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 @@ -931,11 +934,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; @@ -966,6 +968,7 @@ DBTxn_dealloc(DBTxnObject* self) } #endif + Py_DECREF(self->env); PyObject_Del(self); } -- cgit v0.12