From: Neal Norwitz Date: Tue, 21 Nov 2006 05:29:34 +0000 (+0000) Subject: Backport of 52811: X-Git-Tag: v2.5.1c1~242 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5890a6a8a68eb5658b7002501ec30e2e30eba144;p=thirdparty%2FPython%2Fcpython.git Backport of 52811: Bug #1599782: Fix segfault on bsddb.db.DB().type(). The problem is that _DB_get_type() can't be called without the GIL because it calls a bunch of PyErr_* APIs when an error occurs. There were no other cases in this file that it was called without the GIL. Removing the BEGIN/END THREAD around _DB_get_type() made everything work. --- diff --git a/Lib/bsddb/test/test_dbobj.py b/Lib/bsddb/test/test_dbobj.py index 6799fc9c220a..af494e19fd93 100644 --- a/Lib/bsddb/test/test_dbobj.py +++ b/Lib/bsddb/test/test_dbobj.py @@ -69,6 +69,10 @@ class dbobjTestCase(unittest.TestCase): self.db.close() self.env.close() + def test03_dbobj_type_before_open(self): + # Ensure this doesn't cause a segfault. + self.assertRaises(db.DBInvalidArgError, db.DB().type) + #---------------------------------------------------------------------- def test_suite(): diff --git a/Misc/NEWS b/Misc/NEWS index 28543f6f7553..231004dc4ae0 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -276,6 +276,8 @@ Library Extension Modules ----------------- +- Bug #1599782: fix segfault on bsddb.db.DB().type(). + - Fix bugs in ctypes: - anonymous structure fields that have a bit-width specified did not work - cast function did not accept c_char_p or c_wchar_p instances as first arg diff --git a/Modules/_bsddb.c b/Modules/_bsddb.c index 9d56e2765d47..8e343a652e9b 100644 --- a/Modules/_bsddb.c +++ b/Modules/_bsddb.c @@ -1779,9 +1779,7 @@ DB_get_type(DBObject* self, PyObject* args) return NULL; CHECK_DB_NOT_CLOSED(self); - MYDB_BEGIN_ALLOW_THREADS; type = _DB_get_type(self); - MYDB_END_ALLOW_THREADS; if (type == -1) return NULL; return PyInt_FromLong(type);