[Python-checkins] cpython: Issue #15893: Improve error handling in main() and Py_FrozenMain()

victor.stinner python-checkins at python.org
Sat Jul 27 02:39:53 CEST 2013


http://hg.python.org/cpython/rev/47c6aa17fd90
changeset:   84861:47c6aa17fd90
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Sat Jul 27 02:39:09 2013 +0200
summary:
  Issue #15893: Improve error handling in main() and Py_FrozenMain()

* handle _PyMem_RawStrdup() failure
* Py_FrozenMain() releases memory on error
* Py_FrozenMain() duplicates the old locale, as done in main()

files:
  Modules/python.c    |   5 ++++
  Python/frozenmain.c |  39 +++++++++++++++++++-------------
  2 files changed, 28 insertions(+), 16 deletions(-)


diff --git a/Modules/python.c b/Modules/python.c
--- a/Modules/python.c
+++ b/Modules/python.c
@@ -45,6 +45,11 @@
 #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);
diff --git a/Python/frozenmain.c b/Python/frozenmain.c
--- a/Python/frozenmain.c
+++ b/Python/frozenmain.c
@@ -16,19 +16,19 @@
 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 @@
         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 @@
     PyWinFreeze_ExeTerm();
 #endif
     Py_Finalize();
-    for (i = 0; i < argc; i++) {
-        PyMem_RawFree(argv_copy2[i]);
+
+error:
+    PyMem_RawFree(argv_copy);
+    if (argv_copy2) {
+        for (i = 0; i < argc; i++)
+            PyMem_RawFree(argv_copy2[i]);
+        PyMem_RawFree(argv_copy2);
     }
-    PyMem_RawFree(argv_copy);
-    PyMem_RawFree(argv_copy2);
+    PyMem_RawFree(oldloc);
     return sts;
 }

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list