backport r60544 from trunk:
Merge this fix from the pybsddb tree:
r293 | jcea | 2008-01-31 01:08:19 -0800 (Thu, 31 Jan 2008) | 4 lines
Solved memory leak when using cursors with
databases without environment.
diff --git a/Misc/NEWS b/Misc/NEWS
index 0a369ad..d83b9cf 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -244,6 +244,9 @@
- Bug #1372: zlibmodule.c: int overflow in PyZlib_decompress
+- bsddb module: Fix memory leak when using database cursors on
+ databases without a DBEnv.
+
Documentation
-------------
diff --git a/Modules/_bsddb.c b/Modules/_bsddb.c
index 943a4ea..4cedc98 100644
--- a/Modules/_bsddb.c
+++ b/Modules/_bsddb.c
@@ -913,7 +913,6 @@
#endif
if (self->dbc != NULL) {
- MYDB_BEGIN_ALLOW_THREADS;
/* If the underlying database has been closed, we don't
need to do anything. If the environment has been closed
we need to leak, as BerkeleyDB will crash trying to access
@@ -922,9 +921,14 @@
a database open. */
if (self->mydb->db && self->mydb->myenvobj &&
!self->mydb->myenvobj->closed)
+ /* test for: open db + no environment or non-closed environment */
+ if (self->mydb->db && (!self->mydb->myenvobj || (self->mydb->myenvobj &&
+ !self->mydb->myenvobj->closed))) {
+ MYDB_BEGIN_ALLOW_THREADS;
err = self->dbc->c_close(self->dbc);
+ MYDB_END_ALLOW_THREADS;
+ }
self->dbc = NULL;
- MYDB_END_ALLOW_THREADS;
}
Py_XDECREF( self->mydb );
PyObject_Del(self);