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

emitted at shutdown, if globals()['__file__'] is None.
This commit is contained in:
Victor Stinner 2011-07-04 02:56:10 +02:00
commit 5a21e83119
3 changed files with 16 additions and 1 deletions

View file

@ -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):

View file

@ -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.

View file

@ -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);