]> granicus.if.org Git - python/commitdiff
Fix a memory leak caused by PyTokenizer_FindEncoding() returning a char * that
authorBrett Cannon <bcannon@gmail.com>
Sat, 20 Oct 2007 03:43:15 +0000 (03:43 +0000)
committerBrett Cannon <bcannon@gmail.com>
Sat, 20 Oct 2007 03:43:15 +0000 (03:43 +0000)
was PyMem_MALLOC'ed.

Python/import.c

index 323b55a540e1e1ebf05915f2aedc08365d705b71..2a316caec9eed3c20475a22bd2d13d0f1923b3da 100644 (file)
@@ -2561,6 +2561,7 @@ call_find_module(char *name, PyObject *path)
        struct filedescr *fdp;
        char pathname[MAXPATHLEN+1];
        FILE *fp = NULL;
+       char *found_encoding = NULL;
        char *encoding = NULL;
 
        pathname[0] = '\0';
@@ -2571,15 +2572,17 @@ call_find_module(char *name, PyObject *path)
                return NULL;
        if (fp != NULL) {
                if (strchr(fdp->mode, 'b') == NULL) {
-                       /* Python text file, get encoding from tokenizer */
-                       encoding = PyTokenizer_FindEncoding(fp);
-                       encoding = (encoding != NULL) ? encoding :
+                       /* PyTokenizer_FindEncoding() returns PyMem_MALLOC'ed
+                          memory. */
+                       found_encoding = PyTokenizer_FindEncoding(fp);
+                       encoding = (found_encoding != NULL) ? found_encoding :
                                   (char*)PyUnicode_GetDefaultEncoding();
                }
                fob = PyFile_FromFileEx(fp, pathname, fdp->mode, fclose, -1,
                                        (char*)encoding, NULL);
                if (fob == NULL) {
                        fclose(fp);
+                       PyMem_FREE(found_encoding);
                        return NULL;
                }
        }
@@ -2590,6 +2593,8 @@ call_find_module(char *name, PyObject *path)
        ret = Py_BuildValue("Os(ssi)",
                      fob, pathname, fdp->suffix, fdp->mode, fdp->type);
        Py_DECREF(fob);
+       PyMem_FREE(found_encoding);
+
        return ret;
 }