]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-38631: Avoid Py_FatalError() in readline (GH-16998)
authorVictor Stinner <vstinner@python.org>
Wed, 30 Oct 2019 15:39:27 +0000 (16:39 +0100)
committerGitHub <noreply@github.com>
Wed, 30 Oct 2019 15:39:27 +0000 (16:39 +0100)
readline now calls PyErr_NoMemory() rather than Py_FatalError() on
memory allocation failure, when importing the module.

Modules/readline.c

index 930e63975c5ce8581288f1883536023c0783fd58..b76861f7b0407e7afddbafbcd1d8a51c7e44dd9a 100644 (file)
@@ -1066,15 +1066,16 @@ done:
 }
 
 
-/* Helper to initialize GNU readline properly. */
-
-static void
+/* Helper to initialize GNU readline properly.
+   Return -1 on memory allocation failure, return 0 on success. */
+static int
 setup_readline(readlinestate *mod_state)
 {
 #ifdef SAVE_LOCALE
     char *saved_locale = strdup(setlocale(LC_CTYPE, NULL));
-    if (!saved_locale)
-        Py_FatalError("not enough memory to save locale");
+    if (!saved_locale) {
+        return -1;
+    }
 #endif
 
     /* The name must be defined before initialization */
@@ -1156,6 +1157,7 @@ setup_readline(readlinestate *mod_state)
         rl_initialize();
 
     RESTORE_LOCALE(saved_locale)
+    return 0;
 }
 
 /* Wrapper around GNU readline that handles signals differently. */
@@ -1369,7 +1371,10 @@ PyInit_readline(void)
 
     mod_state = (readlinestate *) PyModule_GetState(m);
     PyOS_ReadlineFunctionPointer = call_readline;
-    setup_readline(mod_state);
+    if (setup_readline(mod_state) < 0) {
+        PyErr_NoMemory();
+        goto error;
+    }
 
     return m;