From d3035d5d3da11b464580ee2a49c6fcf0d23f0252 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Sat, 3 Dec 2016 13:03:18 -0800 Subject: [PATCH] do not leak the FILE * pointer in error cases of fdopen() --- Modules/posixmodule.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 72bf7d206c..12f6bc034f 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -6906,6 +6906,11 @@ posix_fdopen(PyObject *self, PyObject *args) } } #endif + /* The dummy filename used here must be kept in sync with the value + tested against in gzip.GzipFile.__init__() - see issue #13781. */ + f = PyFile_FromFile(NULL, "", orgmode, fclose); + if (f == NULL) + return NULL; Py_BEGIN_ALLOW_THREADS #if !defined(MS_WINDOWS) && defined(HAVE_FCNTL_H) if (mode[0] == 'a') { @@ -6926,13 +6931,10 @@ posix_fdopen(PyObject *self, PyObject *args) #endif Py_END_ALLOW_THREADS PyMem_FREE(mode); - if (fp == NULL) + if (fp == NULL) { + Py_DECREF(f); return posix_error(); - /* The dummy filename used here must be kept in sync with the value - tested against in gzip.GzipFile.__init__() - see issue #13781. */ - f = PyFile_FromFile(NULL, "", orgmode, fclose); - if (f == NULL) - return NULL; + } /* We now know we will succeed, so initialize the file object. */ ((PyFileObject *)f)->f_fp = fp; PyFile_SetBufSize(f, bufsize); -- 2.50.1