python / python/cpython

Crash in `DistributionFinder.context` because it is using `vars(self).update(kwargs)` under memory preasure

Ouverte
#152,083 4 commentaires 0 réactions 1 personne assignée Voir sur GitHub

@deadlovelll y travaille déjà.

Depuis le 29/6/2026.

stdlib topic-importlib type-crash
Langage dominant
Python
Étoiles
77.2k
Forks
35.9k
Métriques de merge des PR
Métriques de PR en attente

Description

Crash report

Original report: https://gist.github.com/devdanzin/bf9fec4554c58c2a279b05b7ff8e6d9b (it produces the correct repro, but everything else is not correct, since it is AI generated and can be fuzzy).

Here's the real picture.

This class raises an error:

https://github.com/python/cpython/blob/1785f4b35f899704df0be54cba3776906186b2b1/Lib/importlib/metadata/__init__.py#L742-L750

Repro:

import faulthandler, importlib.metadata
faulthandler.enable()
from _testcapi import set_nomemory
for start in range(40):
    set_nomemory(start)
    try:
        importlib.metadata.metadata("f")
    except BaseException:
        pass
print("done, no crash")

Error:

Fatal Python error: _Py_Dealloc: Deallocator of type 'Context' cleared the current exception
Python runtime state: initialized

Stack (most recent call first):
  File "/Users/sobolev/Desktop/cpython/Lib/importlib/metadata/__init__.py", line 465 in from_name
  File "/Users/sobolev/Desktop/cpython/Lib/importlib/metadata/__init__.py", line 1091 in metadata
  File "/Users/sobolev/Desktop/cpython/ex.py", line 7 in <module>

Extension modules: _testcapi (total: 1)
[1]    14108 abort      ./python.exe ex.py

I tested this hack, no crash:

diff --git Lib/importlib/metadata/__init__.py Lib/importlib/metadata/__init__.py
index 32f4b7d2d6e..43ec93db749 100644
--- Lib/importlib/metadata/__init__.py
+++ Lib/importlib/metadata/__init__.py
@@ -777,7 +777,8 @@ class Context:
         """
 
         def __init__(self, **kwargs):
-            vars(self).update(kwargs)
+            for k, v in kwargs.items():
+                setattr(self, k, v)
 
         @property
         def path(self) -> list[str]:

But, this is clearly not a proper fix. Because for some reason the exception is cleared somewhere.

After:

» ./python.exe ex.py
object address  : 0x20002128190
object refcount : 3
object type     : 0x101267e70
object type name: MemoryError
object repr     : 
lost sys.stderr
object address  : 0x20002128110
object refcount : 3
object type     : 0x101267e70
object type name: MemoryError
object repr     : 
lost sys.stderr
Linked PRs
  • gh-152981

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Évaluation

Cette issue n'a pas encore été évaluée.

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.