aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Modules/_sqlite
diff options
context:
space:
mode:
authorErlend E. Aasland <erlend@python.org>2025-02-10 00:27:28 +0100
committerGitHub <noreply@github.com>2025-02-10 00:27:28 +0100
commit7e6ee50b6b8c760bcefb92ab4ddbc3d85d37a834 (patch)
tree0c8e76b2be3fffb4cd03a9b018e7869a1ebaab49 /Modules/_sqlite
parentd05053a203d922c8056f12ef3c9338229fdce043 (diff)
downloadcpython-7e6ee50b6b8c760bcefb92ab4ddbc3d85d37a834.tar.gz
cpython-7e6ee50b6b8c760bcefb92ab4ddbc3d85d37a834.zip
gh-129603: Don't segfault if sqlite3.Row description is None (#129604)
Diffstat (limited to 'Modules/_sqlite')
-rw-r--r--Modules/_sqlite/row.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/Modules/_sqlite/row.c b/Modules/_sqlite/row.c
index 79660008b18..94565a01d18 100644
--- a/Modules/_sqlite/row.c
+++ b/Modules/_sqlite/row.c
@@ -138,7 +138,6 @@ static PyObject *
pysqlite_row_subscript(PyObject *op, PyObject *idx)
{
Py_ssize_t _idx;
- Py_ssize_t nitems, i;
pysqlite_Row *self = _pysqlite_Row_CAST(op);
if (PyLong_Check(idx)) {
@@ -151,9 +150,13 @@ pysqlite_row_subscript(PyObject *op, PyObject *idx)
PyObject *item = PyTuple_GetItem(self->data, _idx);
return Py_XNewRef(item);
} else if (PyUnicode_Check(idx)) {
- nitems = PyTuple_Size(self->description);
+ if (Py_IsNone(self->description)) {
+ PyErr_Format(PyExc_IndexError, "No item with key %R", idx);
+ return NULL;
+ }
+ Py_ssize_t nitems = PyTuple_GET_SIZE(self->description);
- for (i = 0; i < nitems; i++) {
+ for (Py_ssize_t i = 0; i < nitems; i++) {
PyObject *obj;
obj = PyTuple_GET_ITEM(self->description, i);
obj = PyTuple_GET_ITEM(obj, 0);
@@ -197,17 +200,19 @@ static PyObject *
pysqlite_row_keys_impl(pysqlite_Row *self)
/*[clinic end generated code: output=efe3dfb3af6edc07 input=7549a122827c5563]*/
{
- PyObject* list;
- Py_ssize_t nitems, i;
-
- list = PyList_New(0);
+ PyObject *list = PyList_New(0);
if (!list) {
return NULL;
}
- nitems = PyTuple_Size(self->description);
+ if (Py_IsNone(self->description)) {
+ return list;
+ }
- for (i = 0; i < nitems; i++) {
- if (PyList_Append(list, PyTuple_GET_ITEM(PyTuple_GET_ITEM(self->description, i), 0)) != 0) {
+ Py_ssize_t nitems = PyTuple_GET_SIZE(self->description);
+ for (Py_ssize_t i = 0; i < nitems; i++) {
+ PyObject *descr = PyTuple_GET_ITEM(self->description, i);
+ PyObject *name = PyTuple_GET_ITEM(descr, 0);
+ if (PyList_Append(list, name) < 0) {
Py_DECREF(list);
return NULL;
}