Skip to content

iter __reduce__ can segfault if accessing __builtins__.__dict__['iter'] mutates the iter object #101765

Description

@ionite34

Crash report

Example from @chilaxan

corrupt=iter(lambda:0, 0)
classCstr:
def__hash__(self):
returnhash('iter')
def__eq__(self, other):
[*corrupt]
returnother=='iter'builtins=__builtins__.__dict__ifhasattr(__builtins__, '__dict__') else__builtins__oiter=builtins['iter']
delbuiltins['iter']
builtins[Cstr()] =oiterprint(corrupt.__reduce__())

Expected result

This should return a valid __reduce__ tuple of the exhausted iterator. Instead behavior is inconsistent between segmentation faults, SystemErrors, and sometimes returning the iterator without being exhausted.

Error messages

  • 3.11, windows, PYTHONMALLOC=debug
  • 3.12.0a4, windows, PYTHONMALLOC=debug
Windowsfatalexception: accessviolation>exitcode-1073741819 (0xC0000005)
  • 3.12.04a4, windows, compiled with debug mode
print(corrupt.__reduce__())
^^^^^^^^^^^^^^^^^^^^SystemError: NULLobjectpassedtoPy_BuildValue
  • 3.11, ubuntu
(<built-infunctioniter>, (<functionat0x7fb772c3c4a0>, 0))
>terminatedbysignalSIGSEGV (Addressboundaryerror)
  • 3.12.0a4, ubuntu
(<built-infunctioniter>, (<functionat0x7f3480d71f80>, 0))
  • 3.12.0a4, ubuntu, PYTHONMALLOC=debug
FatalPythonerror: Segmentationfault

Linked PRs

Metadata

Metadata

Assignees

No one assigned

    Labels

    interpreter-core(Objects, Python, Grammar, and Parser dirs)type-crashA hard crash of the interpreter, possibly with a core dump

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions