sqlite3 Cursor NULL-deref via reentrant execute() inside a text_factory/converter during fetch
Abierto
Nadie ha tomado este issue todavía.
extension-modules
topic-sqlite3
type-bug
- Lenguaje dominante
- Python
- Estrellas
- 77.2k
- Forks
- 35.9k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
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
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Empieza por Modules/_sqlite/cursor.c, especialmente por _pysqlite_fetch_one_row alrededor de la línea 402, y reproduce el informe con un sanitizer usando el callback text_factory mostrado. Rastrea cómo el cur.execute() reentrante afecta a la sentencia durante la obtención; se considera terminado cuando el reproductor ya no alcanza la desreferencia nula y se añade la cobertura adecuada junto con el trabajo vinculado existente.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python, sqlite
- Área
- databases
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bien especificado
- Aptitud para principiantes
- 30/100