sqlite3 Cursor NULL-deref via reentrant execute() inside a text_factory/converter during fetch
Aberta
Ninguém assumiu esta issue ainda.
extension-modules
topic-sqlite3
type-bug
- Linguagem predominante
- Python
- Estrelas
- 77.2k
- Forks
- 36k
- Métricas de merge de PRs
- Métricas de PR pendentes
Descrição
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
Guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Direção de pesquisa
Comece por Modules/_sqlite/cursor.c, especialmente _pysqlite_fetch_one_row por volta da linha 402, e reproduza o relatório sob um sanitizer usando o callback text_factory mostrado. Rastreie como o cur.execute() reentrante afeta a instrução durante o fetch; considera-se concluído quando o reprodutor não alcança mais a desreferência nula e uma cobertura apropriada é adicionada junto ao trabalho vinculado existente.
Escrita pelo modelo de indexação a partir do texto da issue.
Avaliação
- Stack de tecnologia
- python, sqlite
- Domínio
- databases
- Tipo de issue
- Bug
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Status de atividade
- Estagnada
- Clareza
- Claramente especificada
- Facilidade para iniciantes
- 30/100