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
Crash report
What happened?
Most of the code in
Modules/_sqlite/row.cassumes->descriptionis a tuple. However, it may beNone. Since it is possible to craft asqlite3.Rowobject "by hand", it is easy to provoke segfauls for paths that involve thePyTupleAPI anddescription == 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.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