python / python/cpython

`mmap.mmap.__setitem__` crashes when concurrently resized

Open
#157,335 3 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

extension-modules type-bug
Dominant language
Python
Stars
77.2k
Forks
35.9k
PR merge metrics
PR metrics pending

Description

Bug report

Bug description:
import mmap
mm = mmap.mmap(-1, 100000)         
class mid:
    def __index__(self):
        mm.resize(8)           
        return 0
mm[90000] = mid()          

AddressSanitizer:DEADLYSIGNAL

==1==ERROR: AddressSanitizer: SEGV on unknown address 0xffffa1a0cf90 (pc 0xffffa1a2aff0 bp 0xffffd2152970 sp 0xffffd2152830 T0)
==1==The signal is caused by a WRITE memory access.
#0 0xffffa1a2aff0 in safe_byte_copy Modules/mmapmodule.c:406
#1 0xffffa1a2aff0 in mmap_ass_subscript_lock_held Modules/mmapmodule.c:1692
#2 0xffffa1a2aff0 in mmap_ass_subscript Modules/mmapmodule.c:1750
#3 0xaaaadf0a9860 in _PyEval_EvalFrameDefault Python/generated_cases.c.h:12634
#4 0xaaaadf970b1c in _PyEval_EvalFrame Include/internal/pycore_ceval.h:122
#5 0xaaaadf970b1c in _PyEval_Vector Python/ceval.c:2174
#6 0xaaaadf970b1c in PyEval_EvalCode Python/ceval.c:679
#7 0xaaaadfb6feb4 in run_mod Python/pythonrun.c:1509
#8 0xaaaadfb70d38 in _PyRun_File Python/pythonrun.c:1332
#9 0xaaaadfb74ffc in _PyRun_SimpleFile Python/pythonrun.c:544
#10 0xaaaadfb78dd0 in _PyRun_AnyFile Python/pythonrun.c:92
#11 0xaaaadfc4390c in pymain_run_file_obj Modules/main.c:478
#12 0xaaaadfc4390c in pymain_run_file Modules/main.c:494
#13 0xaaaadfc4390c in pymain_run_python Modules/main.c:804
#14 0xaaaadfc4390c in Py_RunMain Modules/main.c:891
#15 0xaaaadfc45c38 in pymain_main Modules/main.c:921
#16 0xaaaadfc45c38 in Py_BytesMain Modules/main.c:945
#17 0xffffa46f84c0 (/lib/aarch64-linux-gnu/libc.so.6+0x284c0) (BuildId: 27027b96e5b8c475fc327aa445bea1c71d37b4e2)
#18 0xffffa46f8594 in __libc_start_main (/lib/aarch64-linux-gnu/libc.so.6+0x28594) (BuildId: 27027b96e5b8c475fc327aa445bea1c71d37b4e2)
#19 0xaaaadf0ebeec in _start (/src/cpython/python+0x183beec) (BuildId: eba909a3db0adabacf151d7dc3081dda7999191a)

AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV Modules/mmapmodule.c:406 in safe_byte_copy
==1==ABORTING

CPython versions tested on:

CPython main branch

Operating systems tested on:

Linux

Linked PRs
  • gh-157438

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the reproducer and the stack trace locations in Modules/mmapmodule.c, especially safe_byte_copy at line 406 and mmap_ass_subscript_lock_held around line 1692. Run the example under AddressSanitizer and verify that resizing during setitem no longer crashes; gh-157438 is already linked to this issue.

Written by the indexing model from the issue text.

Assessment

Tech stack
c, python
Domain
operating-systems
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.