Skip to content

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

@ionite34

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