bytearray.strip() reads freed memory if the argument's __release_buffer__ resizes the bytearray

Ouverte
#161,688 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

Personne n'a encore pris cette issue.

Évaluation

Difficulté
4/5
Temps estimé
3-5 jours
Accessibilité débutants
25/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
À l'abandon
Stack technique
c, python
Domaine
backend

Piste de recherche

Read the strip implementation at Objects/bytearrayobject.c:2460-2462 and inspect the existing bytearray strip tests. Check how buffer release can run Python code and resize the bytearray before the result is copied. Done when strip(), lstrip(), and rstrip() avoid the reported crash and return bytes consistent with the bounds they computed.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

interpreter-core type-crash
Crash report

bytearray.strip(chars) (and lstrip/rstrip) takes a pointer into the bytearray, finds the bounds, then releases the argument's buffer, and only then copies the bytes. If the argument's class defines __release_buffer__ (PEP 688), that release runs Python code, which can resize the bytearray and free the storage the pointer refers to.

ba = bytearray(b"x" * (1 << 22))

class S:
    def __buffer__(self, flags):
        return memoryview(b" ")
    def __release_buffer__(self, view):
        ba.clear()

ba.strip(S())   # segfault

Output: Segmentation fault, the same for lstrip and rstrip. With a small bytearray and an in-place write instead of clear(), the result is built from the modified bytes, not the ones the bounds were computed on.

Cause: Objects/bytearrayobject.c:2460-2462 calls PyBuffer_Release(&vbytes) before PyByteArray_FromStringAndSize(myptr + left, right - left). Copying first and releasing after would fix it.

CPython versions tested on:

3.15, CPython main branch

Operating systems tested on:

Linux

Output from running 'python -VV' on the command line:

Python 3.15.2 (tags/v3.15.2:5e58eaa, Nov 5 2026, 20:20:36) [GCC 11.4.0]


Found while building a Lean 4 model of CPython (https://broyojo.com/python-formalization/). AI tools (Claude and Codex) helped investigate the findings and prepare this report. The examples were rerun on CPython 3.15.2 and main, and the report received technical review. Record: bytesobj-bytearray-strip-release-uaf

Linked PRs
  • gh-161701
Langage dominant
Python
Étoiles
78.2k
Forks
36.6k
Merge moyen
19 h 57 min
PR mergées (30 j)
630

Préparer son environnement

Ouvrir dans Codespaces

Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.

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.

Autres issues de python/cpython

Toutes les issues de python/cpython

Issues similaires

Plus d'issues Python

Recevez les nouvelles issues par e-mail

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