Commit 46f64f30 authored by Neal Norwitz's avatar Neal Norwitz

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.
parent d57deb73
...@@ -69,6 +69,10 @@ class dbobjTestCase(unittest.TestCase): ...@@ -69,6 +69,10 @@ class dbobjTestCase(unittest.TestCase):
self.db.close() self.db.close()
self.env.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(): def test_suite():
......
...@@ -276,6 +276,8 @@ Library ...@@ -276,6 +276,8 @@ Library
Extension Modules Extension Modules
----------------- -----------------
- Bug #1599782: fix segfault on bsddb.db.DB().type().
- Fix bugs in ctypes: - Fix bugs in ctypes:
- anonymous structure fields that have a bit-width specified did not work - 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 - cast function did not accept c_char_p or c_wchar_p instances as first arg
......
...@@ -1779,9 +1779,7 @@ DB_get_type(DBObject* self, PyObject* args) ...@@ -1779,9 +1779,7 @@ DB_get_type(DBObject* self, PyObject* args)
return NULL; return NULL;
CHECK_DB_NOT_CLOSED(self); CHECK_DB_NOT_CLOSED(self);
MYDB_BEGIN_ALLOW_THREADS;
type = _DB_get_type(self); type = _DB_get_type(self);
MYDB_END_ALLOW_THREADS;
if (type == -1) if (type == -1)
return NULL; return NULL;
return PyInt_FromLong(type); return PyInt_FromLong(type);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment