]> granicus.if.org Git - python/commitdiff
Issue #15893: Improve error handling in main() and Py_FrozenMain()
authorVictor Stinner <victor.stinner@gmail.com>
Sat, 27 Jul 2013 00:39:09 +0000 (02:39 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Sat, 27 Jul 2013 00:39:09 +0000 (02:39 +0200)
* handle _PyMem_RawStrdup() failure
* Py_FrozenMain() releases memory on error
* Py_FrozenMain() duplicates the old locale, as done in main()

Modules/python.c
Python/frozenmain.c

index 326aa36983681be00a733c14fc3c15c51beec35a..9811c01d4918c69c1a995a01a84ce121aa1a52d5 100644 (file)
@@ -45,6 +45,11 @@ main(int argc, char **argv)
 #endif
 
     oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
+    if (!oldloc) {
+        fprintf(stderr, "out of memory\n");
+        return 1;
+    }
+
     setlocale(LC_ALL, "");
     for (i = 0; i < argc; i++) {
         argv_copy[i] = _Py_char2wchar(argv[i], NULL);
index f628ddc846cffe6791892f3586a473e76deba234..55d05fc26f02e8f469684cd6162df0e16d3fcb35 100644 (file)
@@ -16,19 +16,19 @@ int
 Py_FrozenMain(int argc, char **argv)
 {
     char *p;
-    int i, n, sts;
+    int i, n, sts = 1;
     int inspect = 0;
     int unbuffered = 0;
-    char *oldloc;
-    wchar_t **argv_copy;
+    char *oldloc = NULL;
+    wchar_t **argv_copy = NULL;
     /* We need a second copies, as Python might modify the first one. */
-    wchar_t **argv_copy2;
+    wchar_t **argv_copy2 = NULL;
 
-    argv_copy = PyMem_RawMalloc(sizeof(wchar_t*)*argc);
-    argv_copy2 = PyMem_RawMalloc(sizeof(wchar_t*)*argc);
+    argv_copy = PyMem_RawMalloc(sizeof(wchar_t*) * argc);
+    argv_copy2 = PyMem_RawMalloc(sizeof(wchar_t*) * argc);
     if (!argv_copy || !argv_copy2) {
         fprintf(stderr, "out of memory\n");
-        return 1;
+        goto error;
     }
 
     Py_FrozenFlag = 1; /* Suppress errors from getpath.c */
@@ -44,23 +44,26 @@ Py_FrozenMain(int argc, char **argv)
         setbuf(stderr, (char *)NULL);
     }
 
-    if (!argv_copy) {
+    oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
+    if (!oldloc) {
         fprintf(stderr, "out of memory\n");
-        return 1;
+        goto error;
     }
 
-    oldloc = setlocale(LC_ALL, NULL);
     setlocale(LC_ALL, "");
     for (i = 0; i < argc; i++) {
         argv_copy[i] = _Py_char2wchar(argv[i], NULL);
+        argv_copy2[i] = argv_copy[i];
         if (!argv_copy[i]) {
             fprintf(stderr, "Unable to decode the command line argument #%i\n",
                             i + 1);
-            return 1;
+            argc = i;
+            goto error;
         }
-        argv_copy2[i] = argv_copy[i];
     }
     setlocale(LC_ALL, oldloc);
+    PyMem_RawFree(oldloc);
+    oldloc = NULL;
 
 #ifdef MS_WINDOWS
     PyInitFrozenExtensions();
@@ -94,10 +97,14 @@ Py_FrozenMain(int argc, char **argv)
     PyWinFreeze_ExeTerm();
 #endif
     Py_Finalize();
-    for (i = 0; i < argc; i++) {
-        PyMem_RawFree(argv_copy2[i]);
-    }
+
+error:
     PyMem_RawFree(argv_copy);
-    PyMem_RawFree(argv_copy2);
+    if (argv_copy2) {
+        for (i = 0; i < argc; i++)
+            PyMem_RawFree(argv_copy2[i]);
+        PyMem_RawFree(argv_copy2);
+    }
+    PyMem_RawFree(oldloc);
     return sts;
 }