diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2016-08-29 12:11:52 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2016-08-29 12:11:52 (GMT) |
commit | 8631da64bb1f163026b7be82884f8e5b506e0e66 (patch) | |
tree | 8e038d5acc352dfa2d74fa8f476e3017d0c98c97 /Modules | |
parent | d0f5bab21b9828f4764bd45e4afe24f23c1a55b0 (diff) | |
parent | ef113cd4cc2c16fa0ce59e325ee587698d62e1ae (diff) | |
download | cpython-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')
-rw-r--r-- | Modules/_sqlite/connection.c | 13 |
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); |