Skip to content

Commit 4df47d8

Browse files
authored
gh-159739: Keep SQLite list parameters alive while binding (#160192)
When a SQL parameter sequence is an exact list, sqlite3 retrieved an element as a borrowed reference before taking ownership. On free-threaded builds another thread can replace it in between, so binding can use a freed object and crash. Fetch a strong reference atomically. Backport to 3.15 and 3.14.
1 parent 5b55b50 commit 4df47d8

2 files changed

Lines changed: 2 additions & 2 deletions

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix a possible crash when a list of :mod:`sqlite3` parameters is modified concurrently on a free-threaded build.

‎Modules/_sqlite/cursor.c‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -701,8 +701,7 @@ bind_parameters(pysqlite_state *state, pysqlite_Statement *self,
701701
PyObject *item = PyTuple_GET_ITEM(parameters, i);
702702
current_param = Py_NewRef(item);
703703
} else if (PyList_CheckExact(parameters)) {
704-
PyObject *item = PyList_GetItem(parameters, i);
705-
current_param = Py_XNewRef(item);
704+
current_param = PyList_GetItemRef(parameters, i);
706705
} else {
707706
current_param = PySequence_GetItem(parameters, i);
708707
}

0 commit comments

Comments
 (0)