diff options
author | Benjamin Peterson <benjamin@python.org> | 2016-12-03 13:03:18 -0800 |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2016-12-03 13:03:18 -0800 |
commit | 2e5780441740769474cf24cff64ce44bd514f7be (patch) | |
tree | d0ddc92b480efb85dd8849f81cc27229d144ce59 | |
parent | 5538166bc988db918b17116456021bbed6d6674f (diff) | |
download | cpython-2e5780441740769474cf24cff64ce44bd514f7be.tar.gz |
do not leak the FILE * pointer in error cases of fdopen()
-rw-r--r-- | Modules/posixmodule.c | 14 |
1 files 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, "<fdopen>", 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, "<fdopen>", 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); |