From: Gregory P. Smith Date: Sun, 3 Feb 2008 07:26:23 +0000 (+0000) Subject: backport r60544 from trunk: X-Git-Tag: v2.5.2c1~34 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=946de92f9b947c6a588cc9f6568665600324e212;p=python 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 0a369adb81..d83b9cf49c 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -244,6 +244,9 @@ Extension Modules - 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 943a4ea0e7..4cedc98d7b 100644 --- a/Modules/_bsddb.c +++ b/Modules/_bsddb.c @@ -913,7 +913,6 @@ DBCursor_dealloc(DBCursorObject* self) #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 @@ DBCursor_dealloc(DBCursorObject* self) 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);