You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Py_SetStandardStreamEncoding leads to a memory error in debug mode #74004
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
assignee=Noneclosed_at=<Date2019-05-15.02:53:12.376>created_at=<Date2017-03-15.11:27:39.955>labels= ['interpreter-core', '3.7', 'type-crash']
title='Py_SetStandardStreamEncoding leads to a memory error in debug mode'updated_at=<Date2019-05-15.02:53:12.374>user='https://github.com/ncoghlan'
For PEP-538, setting PYTHONIOENCODING turned out to have undesirable side effects on Python 2 instances in subprocesses, since Python 2 has no 'surrogateescape' error handler.
So I switched to using the "Py_SetStandardStreamEncoding" API defined in http://bugs.python.org/issue16129 instead, but this turns out to have problematic interactions with the dynamic memory allocator management, so it fails with a fatal exception in debug mode. An example of the error can be seen here: https://travis-ci.org/python/cpython/jobs/211293576
The problem appears to be that between the allocation of the memory with _PyMem_RawStrdup in Py_SetStandardStreamEncoding and the release of that memory in initstdio, the active memory manager has changed (at least in a debug build), so the deallocation as part of the interpreter startup fails.
While that works (at least in the absence of a PYTHONMALLOC setting) it seems fragile. It would be nicer if there was a way for Py_SetStandardStreamEncoding to indicate which allocator should be used for the deallocation.
Activity
ncoghlan commentedon Mar 15, 2017
For PEP-538, setting PYTHONIOENCODING turned out to have undesirable side effects on Python 2 instances in subprocesses, since Python 2 has no 'surrogateescape' error handler.
So I switched to using the "Py_SetStandardStreamEncoding" API defined in http://bugs.python.org/issue16129 instead, but this turns out to have problematic interactions with the dynamic memory allocator management, so it fails with a fatal exception in debug mode. An example of the error can be seen here: https://travis-ci.org/python/cpython/jobs/211293576
The problem appears to be that between the allocation of the memory with
_PyMem_RawStrdupinPy_SetStandardStreamEncodingand the release of that memory ininitstdio, the active memory manager has changed (at least in a debug build), so the deallocation as part of the interpreter startup fails.That interpretation is based on this comment in Programs/python.c:
The allocations in Py_SetStandardStreamEncoding happen before the call to Py_Main/Py_Initialize, but the deallocation happens in Py_Initialize.
The "fix" I applied to the PEP branch was to make the default allocator conditional in Programs/python.c as well:
While that works (at least in the absence of a PYTHONMALLOC setting) it seems fragile. It would be nicer if there was a way for Py_SetStandardStreamEncoding to indicate which allocator should be used for the deallocation.
vstinner commentedon May 15, 2019
I fixed this issue in Python 3.7. Py_SetStandardStreamEncoding() now uses: