diff options
| author | Erlend E. Aasland <erlend@python.org> | 2025-02-10 00:21:33 (GMT) |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-02-10 00:21:33 (GMT) |
| commit | d6daeeeb2fe4db94fc8aa2fd1bc4dc201a4d1541 (patch) | |
| tree | eca4e5006e5c691b4c834106e13a3fc235c16fb1 /Modules/_sqlite | |
| parent | d26c2fe7a2833606b3fb8d9789149d8696978d86 (diff) | |
| download | cpython-d6daeeeb2fe4db94fc8aa2fd1bc4dc201a4d1541.zip cpython-d6daeeeb2fe4db94fc8aa2fd1bc4dc201a4d1541.tar.gz cpython-d6daeeeb2fe4db94fc8aa2fd1bc4dc201a4d1541.tar.bz2 | |
[3.13] gh-129603: Don't segfault if sqlite3.Row description is None (#129604) (#129923)
(cherry picked from commit 7e6ee50b6b8c760bcefb92ab4ddbc3d85d37a834)
Diffstat (limited to 'Modules/_sqlite')
| -rw-r--r-- | Modules/_sqlite/row.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/Modules/_sqlite/row.c b/Modules/_sqlite/row.c index 1455507..3427fae 100644 --- a/Modules/_sqlite/row.c +++ b/Modules/_sqlite/row.c @@ -132,7 +132,6 @@ static PyObject * pysqlite_row_subscript(pysqlite_Row *self, PyObject *idx) { Py_ssize_t _idx; - Py_ssize_t nitems, i; if (PyLong_Check(idx)) { _idx = PyNumber_AsSsize_t(idx, PyExc_IndexError); @@ -144,9 +143,13 @@ pysqlite_row_subscript(pysqlite_Row *self, 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); @@ -189,17 +192,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; } |
