Kaydet (Commit) 5a21e831 authored tarafından Victor Stinner's avatar Victor Stinner

(merge 3.2) Issue #12467: warnings: fix a race condition if a warning is

emitted at shutdown, if globals()['__file__'] is None.
...@@ -542,6 +542,18 @@ class _WarningsTests(BaseTest): ...@@ -542,6 +542,18 @@ class _WarningsTests(BaseTest):
assert expected_line assert expected_line
self.assertEqual(second_line, expected_line) self.assertEqual(second_line, expected_line)
def test_filename_none(self):
# issue #12467: race condition if a warning is emitted at shutdown
globals_dict = globals()
oldfile = globals_dict['__file__']
try:
with original_warnings.catch_warnings(module=self.module) as w:
self.module.filterwarnings("always", category=UserWarning)
globals_dict['__file__'] = None
original_warnings.warn('test', UserWarning)
finally:
globals_dict['__file__'] = oldfile
class WarningsDisplayTests(unittest.TestCase): class WarningsDisplayTests(unittest.TestCase):
......
...@@ -209,6 +209,9 @@ Core and Builtins ...@@ -209,6 +209,9 @@ Core and Builtins
Library Library
------- -------
- Issue #12467: warnings: fix a race condition if a warning is emitted at
shutdown, if globals()['__file__'] is None.
- Issue #12451: pydoc: importfile() now opens the Python script in binary mode, - Issue #12451: pydoc: importfile() now opens the Python script in binary mode,
instead of text mode using the locale encoding, to avoid encoding issues. instead of text mode using the locale encoding, to avoid encoding issues.
......
...@@ -496,7 +496,7 @@ setup_context(Py_ssize_t stack_level, PyObject **filename, int *lineno, ...@@ -496,7 +496,7 @@ setup_context(Py_ssize_t stack_level, PyObject **filename, int *lineno,
/* Setup filename. */ /* Setup filename. */
*filename = PyDict_GetItemString(globals, "__file__"); *filename = PyDict_GetItemString(globals, "__file__");
if (*filename != NULL) { if (*filename != NULL && PyUnicode_Check(*filename)) {
Py_ssize_t len = PyUnicode_GetSize(*filename); Py_ssize_t len = PyUnicode_GetSize(*filename);
Py_UNICODE *unicode = PyUnicode_AS_UNICODE(*filename); Py_UNICODE *unicode = PyUnicode_AS_UNICODE(*filename);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment