bpo-36763: Fix Py_SetStandardStreamEncoding() (GH-13028)
authorVictor Stinner <vstinner@redhat.com>
Tue, 30 Apr 2019 23:36:13 +0000 (01:36 +0200)
committerGitHub <noreply@github.com>
Tue, 30 Apr 2019 23:36:13 +0000 (01:36 +0200)
Fix memory leak in Py_SetStandardStreamEncoding(): release memory
if the function is called twice.

Misc/NEWS.d/next/C API/2019-05-01-00-42-08.bpo-36763.vghb86.rst [new file with mode: 0644]
Python/coreconfig.c

diff --git a/Misc/NEWS.d/next/C API/2019-05-01-00-42-08.bpo-36763.vghb86.rst b/Misc/NEWS.d/next/C API/2019-05-01-00-42-08.bpo-36763.vghb86.rst
new file mode 100644 (file)
index 0000000..1c34920
--- /dev/null
@@ -0,0 +1,2 @@
+Fix memory leak in :c:func:`Py_SetStandardStreamEncoding`: release memory if
+the function is called twice.
index d05beef2aa5526b4236c3e03be9da24c9ea403ae..471d5126f8038d47ab2ed29f6107db50d9b7fdd4 100644 (file)
@@ -375,6 +375,7 @@ Py_SetStandardStreamEncoding(const char *encoding, const char *errors)
      * Py_Initialize hasn't been called yet.
      */
     if (encoding) {
+        PyMem_RawFree(_Py_StandardStreamEncoding);
         _Py_StandardStreamEncoding = _PyMem_RawStrdup(encoding);
         if (!_Py_StandardStreamEncoding) {
             res = -2;
@@ -382,11 +383,11 @@ Py_SetStandardStreamEncoding(const char *encoding, const char *errors)
         }
     }
     if (errors) {
+        PyMem_RawFree(_Py_StandardStreamErrors);
         _Py_StandardStreamErrors = _PyMem_RawStrdup(errors);
         if (!_Py_StandardStreamErrors) {
-            if (_Py_StandardStreamEncoding) {
-                PyMem_RawFree(_Py_StandardStreamEncoding);
-            }
+            PyMem_RawFree(_Py_StandardStreamEncoding);
+            _Py_StandardStreamEncoding = NULL;
             res = -3;
             goto done;
         }