sqlite3 Cursor NULL-deref via reentrant execute() inside a text_factory/converter during fetch
Ouverte
Personne n'a encore pris cette issue.
extension-modules
topic-sqlite3
type-bug
- Langage dominant
- Python
- Étoiles
- 77.2k
- Forks
- 35.9k
- Métriques de merge des PR
- Métriques de PR en attente
Description
Bug report
Bug description:
import sqlite3
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE t(a TEXT, b TEXT)")
con.execute("INSERT INTO t VALUES ('first', 'second')")
cur = con.cursor()
def btf(data):
try:
cur.execute("SELECT 1")
except sqlite3.ProgrammingError:
pass
return bytes(data).decode()
con.text_factory = btf
cur.execute("SELECT a, b FROM t")
print(cur.fetchone())
Modules/_sqlite/cursor.c:402:23: runtime error: member access within null pointer of type 'struct pysqlite_Statement'
#0 _pysqlite_fetch_one_row Modules/_sqlite/cursor.c:402
#1 pysqlite_cursor_iternext Modules/_sqlite/cursor.c:1155
#2 pysqlite_cursor_fetchone_impl Modules/_sqlite/cursor.c:1206
#3 pysqlite_cursor_fetchone Modules/_sqlite/clinic/cursor.c.h:169
CPython versions tested on:
CPython main branch
Operating systems tested on:
Linux
Linked PRs
- gh-157578
Guide de contribution
Ouvrir 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.
Piste de recherche
Commencez par Modules/_sqlite/cursor.c, en particulier _pysqlite_fetch_one_row autour de la ligne 402, et reproduisez le rapport sous un sanitizer en utilisant le callback text_factory indiqué. Suivez l’effet de l’appel réentrant à cur.execute() sur l’instruction pendant la récupération ; le travail est terminé lorsque le reproducteur n’atteint plus le déréférencement nul et qu’une couverture appropriée est ajoutée parallèlement au travail lié existant.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python, sqlite
- Domaine
- databases
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Clairement spécifiée
- Accessibilité débutants
- 30/100