Skip to content

Segfault if pysqlite_Row->description == PyNone #129603

Closed
@erlend-aasland

Description

@erlend-aasland

Crash report

What happened?

Most of the code in Modules/_sqlite/row.c assumes ->description is a tuple. However, it may be None. Since it is possible to craft a sqlite3.Row object "by hand", it is easy to provoke segfauls for paths that involve the PyTuple API and description == Py_None. Any real code would never directly instantiate a row object; it would be implicitly created by the cursor (via the .fetch*() APIs or by iterating on the cursor). However, I don't think we should let a possible segfault hang around.

import sqlite3
cx = sqlite3.connect(":memory:")
cu = cx.cursor()
row = sqlite3.Row(cu, (1,2))
row.keys()  # <= boom

CPython versions tested on:

3.14, 3.13, 3.12, CPython main branch

Operating systems tested on:

macOS

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

No response

Linked PRs

Metadata

Metadata

Labels

extension-modulesC modules in the Modules dirtopic-sqlite3type-crashA hard crash of the interpreter, possibly with a core dump

Projects

Status

Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions