Skip to content

Commit

Permalink
[3.12] gh-105699: Fix a Crasher Related to a Deprecated Global Variab…
Browse files Browse the repository at this point in the history
…le (gh-106923) (#106964)

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).
(cherry picked from commit 0ba07b2)

Co-authored-by: Eric Snow <ericsnowcurrently@gmail.com>
  • Loading branch information
miss-islington and ericsnowcurrently committed Jul 21, 2023
1 parent ffc7678 commit 957f14d
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 4 deletions.
@@ -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.
11 changes: 7 additions & 4 deletions Objects/unicodeobject.c
Expand Up @@ -15177,10 +15177,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;
}
Expand Down

0 comments on commit 957f14d

Please sign in to comment.