[Python-checkins] gh-105699: Fix a Crasher Related to a Deprecated Global Variable (gh-106923)

ericsnowcurrently webhook-mailer at python.org
Fri Jul 21 10:34:13 EDT 2023


https://github.com/python/cpython/commit/0ba07b2108d4763273f3fb85544dde34c5acd40a
commit: 0ba07b2108d4763273f3fb85544dde34c5acd40a
branch: main
author: Eric Snow <ericsnowcurrently at gmail.com>
committer: ericsnowcurrently <ericsnowcurrently at gmail.com>
date: 2023-07-21T08:34:09-06:00
summary:

gh-105699: Fix a Crasher Related to a Deprecated Global Variable (gh-106923)

There was a slight race in _Py_ClearFileSystemEncoding() (when called from _Py_SetFileSystemEncoding()), between freeing the value and setting the variable to NULL, which occasionally caused crashes when multiple isolated interpreters were used.  (Notably, I saw at least 10 different, seemingly unrelated spooky-action-at-a-distance, ways this crashed. Yay, free threading!)  We avoid the problem by only setting the global variables with the main interpreter (i.e. runtime init).

files:
A Misc/NEWS.d/next/Core and Builtins/2023-07-20-12-21-37.gh-issue-105699.08ywGV.rst
M Objects/unicodeobject.c

diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-07-20-12-21-37.gh-issue-105699.08ywGV.rst b/Misc/NEWS.d/next/Core and Builtins/2023-07-20-12-21-37.gh-issue-105699.08ywGV.rst
new file mode 100644
index 0000000000000..82312718cd047
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2023-07-20-12-21-37.gh-issue-105699.08ywGV.rst	
@@ -0,0 +1,4 @@
+Python no longer crashes due to an infrequent race in setting
+``Py_FileSystemDefaultEncoding`` and ``Py_FileSystemDefaultEncodeErrors``
+(both deprecated), when simultaneously initializing two isolated
+subinterpreters.  Now they are only set during runtime initialization.
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index e8e8cab99c814..fe2660c6ce605 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -15189,10 +15189,13 @@ init_fs_codec(PyInterpreterState *interp)
 
     /* Set Py_FileSystemDefaultEncoding and Py_FileSystemDefaultEncodeErrors
        global configuration variables. */
-    if (_Py_SetFileSystemEncoding(fs_codec->encoding,
-                                  fs_codec->errors) < 0) {
-        PyErr_NoMemory();
-        return -1;
+    if (_Py_IsMainInterpreter(interp)) {
+
+        if (_Py_SetFileSystemEncoding(fs_codec->encoding,
+                                      fs_codec->errors) < 0) {
+            PyErr_NoMemory();
+            return -1;
+        }
     }
     return 0;
 }



More information about the Python-checkins mailing list