Skip to content

Commit

Permalink
gh-105699: Fix a Crasher Related to a Deprecated Global Variable (gh-…
Browse files Browse the repository at this point in the history
…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).
  • Loading branch information
ericsnowcurrently authored Jul 21, 2023
1 parent 87e7cb0 commit 0ba07b2
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down

0 comments on commit 0ba07b2

Please sign in to comment.