compile: double free of pc->fail_pop in codegen_pattern_or on allocation failure with nested or-pattern
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 1-2 jours
- Accessibilité débutants
- 55/100
Piste de recherche
Start in Python/codegen.c at codegen_pattern_or and codegen_match, using the reported lines 6573 and 6775 to trace ownership of fail_pop through the allocation failure path. Reproduce with the provided _testcapi.call_with_nomemory script on an ASan build; done when injected failures raise MemoryError, the pointer is freed once, and the script prints “survived.”
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
When an allocation fails while compiling a match statement whose or-pattern contains another or-pattern, codegen_pattern_or frees pc->fail_pop and codegen_match then frees it again, so compile() crashes instead of raising MemoryError.
The failure is injected with the test-only _testcapi.call_with_nomemory:
import ast, _testcapi
tree = ast.parse('def f(x):\n match x:\n case [1|2] | 3: pass\n')
for off in range(1500):
held = None
held = [[] for _ in range(128)] # refill/empty the list freelist so PyList_New in codegen really allocates
try:
_testcapi.call_with_nomemory(off, off + 1, compile, tree, 'a.py', 'exec')
except (MemoryError, SyntaxError):
pass
print('survived')
Saved as input.py and run on an ASan build that includes _testcapi:
python input.py
Output:
ERROR: AddressSanitizer: heap-use-after-free on address 0x503000002988
READ of size 1 at 0x503000002988 thread T0
#0 in _PyMem_DebugCheckAddress Objects/obmalloc.c:3351
#4 in PyMem_Free Objects/obmalloc.c:1292
#5 in codegen_match Python/codegen.c:6775
...
freed by thread T0 here:
#5 in PyMem_Free Objects/obmalloc.c:1292
#6 in codegen_pattern_or Python/codegen.c:6573
Every injected failure should surface as MemoryError from compile(), with the pointer freed once, and the script should print survived.
Found at commit 3646ea571f3d8290806a3029d555b179f8be1539. It still reproduces at 3acc941f2b72 (latest upstream checked): ASan heap-use-after-free in the checking build, and the release build segfaults (exit code 139). case (1|2) | 3, where the inner or-pattern is not inside a sequence pattern, survives.
Looks like in the inner codegen_pattern_or, old_pc = *pc copies the outer fail_pop array, and if the first PyList_New(0) in the loop fails, goto error runs before pc->fail_pop = NULL. The error block then frees old_pc.fail_pop while pc->fail_pop still points to it, and codegen_match frees it again.
Found with an LLM-based testing tool; I used Claude to reduce it and look for the cause.
Linked PRs
- gh-160875
- Langage dominant
- Python
- Étoiles
- 77.8k
- Forks
- 37.7k
- Merge moyen
- 17 h 2 min
- PR mergées (30 j)
- 699
Préparer son environnement
Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de python/cpython
-
build OS-unsupported OS-windows type-bug
Difficulté 2/5 1-3 heures Accessibilité débutants 60/100
Les mainteneurs répondent en général sous 1 jour
-
What's New in 3.12 credits the unstable C API tier to PEP 697 instead of PEP 689Peut-être pris @TheLouisMahdi l’a pris il y a 1 jour. Ouvertedocs
Difficulté 1/5 Moins d'une heure Accessibilité débutants 82/100
python/cpython#161078 · 3 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
OS-windows type-bug
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
Les mainteneurs répondent en général sous 1 jour
-
docs
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
python/cpython#161007 · 4 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
Null dereferencing of a pointer in initconfig.cPeut-être pris @lazerg l’a pris il y a 4 jours. Ouverteinterpreter-core topic-C-API type-bug
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
python/cpython#160962 · 4 commentaires ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de python/cpython
Issues similaires
-
HandyModRTransform.deriv3 is wrong for m > 2Peut-être pris @SajalDevX l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
-
read_messages: the first read after subscribe/psubscribe returns no messages even when some are waitingPeut-être pris @matheussilvano l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 80/100
The-Swarm-Corporation/swarms-framework-docs#399 ·
Les mainteneurs répondent en général sous 2 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
Les mainteneurs répondent en général sous 1 jour
-
bump patch
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
autowarefoundation/autoware_carla_scenario#1321 ·
Les mainteneurs répondent en général sous 1 jour