summaryrefslogtreecommitdiffstats
path: root/Modules/_sqlite
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2016-08-29 12:11:52 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2016-08-29 12:11:52 (GMT)
commit8631da64bb1f163026b7be82884f8e5b506e0e66 (patch)
tree8e038d5acc352dfa2d74fa8f476e3017d0c98c97 /Modules/_sqlite
parentd0f5bab21b9828f4764bd45e4afe24f23c1a55b0 (diff)
parentef113cd4cc2c16fa0ce59e325ee587698d62e1ae (diff)
downloadcpython-8631da64bb1f163026b7be82884f8e5b506e0e66.zip
cpython-8631da64bb1f163026b7be82884f8e5b506e0e66.tar.gz
cpython-8631da64bb1f163026b7be82884f8e5b506e0e66.tar.bz2
Issue #27861: Fixed a crash in sqlite3.Connection.cursor() when a factory
creates not a cursor. Patch by Xiang Zhang.
Diffstat (limited to 'Modules/_sqlite')
-rw-r--r--Modules/_sqlite/connection.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c
index 1841c768..1889dcd 100644
--- a/Modules/_sqlite/connection.c
+++ b/Modules/_sqlite/connection.c
@@ -300,7 +300,7 @@ error:
PyObject* pysqlite_connection_cursor(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
{
- static char *kwlist[] = {"factory", NULL, NULL};
+ static char *kwlist[] = {"factory", NULL};
PyObject* factory = NULL;
PyObject* cursor;
@@ -317,7 +317,16 @@ PyObject* pysqlite_connection_cursor(pysqlite_Connection* self, PyObject* args,
factory = (PyObject*)&pysqlite_CursorType;
}
- cursor = PyObject_CallFunction(factory, "O", self);
+ cursor = PyObject_CallFunctionObjArgs(factory, (PyObject *)self, NULL);
+ if (cursor == NULL)
+ return NULL;
+ if (!PyObject_TypeCheck(cursor, &pysqlite_CursorType)) {
+ PyErr_Format(PyExc_TypeError,
+ "factory must return a cursor, not %.100s",
+ Py_TYPE(cursor)->tp_name);
+ Py_DECREF(cursor);
+ return NULL;
+ }
_pysqlite_drop_unused_cursor_references(self);