Skip to content

Commit 91d78af

Browse files
gh-144069: Fix memory leak in _dbm.open() on failure
1 parent 31c81ab commit 91d78af

File tree

2 files changed

+10
-1
lines changed

2 files changed

+10
-1
lines changed

Lib/test/test_dbm.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,10 @@ def setUp(self):
244244
self.addCleanup(cleaunup_test_dir)
245245
setup_test_dir()
246246

247+
def test_open_nonexistent_directory(self):
248+
missing_dir = os.path.join(dirname + "_does_not_exist", "test.db")
249+
with self.assertRaises(OSError):
250+
dbm.open(missing_dir, "c")
247251

248252
class WhichDBTestCase(unittest.TestCase):
249253
def test_whichdb(self):

Modules/_dbmmodule.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,11 +85,16 @@ newdbmobject(_dbm_state *state, const char *file, int flags, int mode)
8585
}
8686
dp->di_size = -1;
8787
dp->flags = flags;
88+
dp->di_dbm = NULL;
8889
PyObject_GC_Track(dp);
8990

9091
/* See issue #19296 */
91-
if ( (dp->di_dbm = dbm_open((char *)file, flags, mode)) == 0 ) {
92+
if ( (dp->di_dbm = dbm_open((char *)file, flags, mode)) == NULL ) {
9293
PyErr_SetFromErrnoWithFilename(state->dbm_error, file);
94+
if (dp->di_dbm != NULL) {
95+
dbm_close(dp->di_dbm);
96+
dp->di_dbm = NULL;
97+
}
9398
Py_DECREF(dp);
9499
return NULL;
95100
}

0 commit comments

Comments
 (0)