New submission from STINNER Victor: Under very low memory condition, PyErr_NoMemory() or PyErr_NormalizeException() enters an unlimited loop when the free list of MemoryError becomes empty.
I propose to add a MemoryError read-only singleton to fix this corner case. Attributes cannot be modified, new attributes cannot be added. MemoryError attributes values: * __cause__ = None * __context__ = None * __suppress_context__ = False * __traceback__ = None * args = () PyException_SetTraceback(), PyException_SetCause() and PyException_SetContext() do nothing when called on the MemoryError singleton. A MemoryError can be raised on an integer overflow when computing the size of a memory block. In this case, you may still have available free memory and so you may be able to build a traceback object, chain exceptions, etc. If you consider that attributes must be modifiable in this case, we can keep the MemoryError unchanged and keep the free list, but add a new special "ReadOnlyMemoryError" type which has exactly one instance, preallocated at startup (the singleton). Read-only attributes are required to not keep references to objects when the MemoryError (singleton) is ne more used ("destroyed"): see for example test_memory_error_cleanup() of test_exceptions. Python has already a PyExc_RecursionErrorInst singleton, which is used on recursion error. It is just a preallocated RuntimeError error, attributes are modifiable. Does this exception keep a traceback when it is no more used ("destroyed")? Maybe using read-only attributes is overkill? Replacing the free list with a singleton is enough? -- See also issue #5437: before Python had a MemoryError singleton, but it was replaced by a free list to not keep references. changeset: 65690:c6d86439aa91 branch: 3.1 parent: 65672:e4425d68dadf user: Antoine Pitrou <solip...@pitrou.net> date: Thu Oct 28 23:06:57 2010 +0000 files: Include/pyerrors.h Lib/test/test_exceptions.py Misc/NEWS Objects/exceptions.c Python/errors.c description: Merged revisions 85896 via svnmerge from svn+ssh://python...@svn.python.org/python/branches/py3k ........ r85896 | antoine.pitrou | 2010-10-29 00:56:58 +0200 (ven., 29 oct. 2010) | 4 lines Issue #5437: A preallocated MemoryError instance should not hold traceback data (including local variables caught in the stack trace) alive infinitely. ........ -- Another option is maybe to clear frames of the traceback. Issue #17934 added a clear() method to frame objects for that. ---------- files: memerror_singleton.patch keywords: patch messages: 204742 nosy: haypo priority: normal severity: normal status: open title: Add a MemoryError singleton to fix an unlimited loop when the memory is exhausted versions: Python 3.4 Added file: http://bugs.python.org/file32892/memerror_singleton.patch _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue19835> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com