python / python/cpython

sqlite3 Cursor NULL-deref via reentrant execute() inside a text_factory/converter during fetch

Abierto
#157,564 1 comentario 0 reacciones 0 asignados Ver en GitHub

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

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. 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

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.