From a24869ada70ab30f4e08d71cdefda644cc40c6b0 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Wed, 16 Jul 2008 22:33:18 +0000 Subject: #3312: fix two sqlite3 crashes. --- Lib/sqlite3/test/regression.py | 14 ++++++++++++++ Misc/NEWS | 2 ++ Modules/_sqlite/connection.c | 11 +++++++++-- Modules/_sqlite/module.c | 5 ++++- 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/Lib/sqlite3/test/regression.py b/Lib/sqlite3/test/regression.py index 2cc8f30..d07c237 100644 --- a/Lib/sqlite3/test/regression.py +++ b/Lib/sqlite3/test/regression.py @@ -153,6 +153,20 @@ class RegressionTests(unittest.TestCase): con.execute("insert into foo(bar) values (5)") con.execute(SELECT) + def CheckRegisterAdapter(self): + """ + See issue 3312. + """ + self.assertRaises(TypeError, sqlite.register_adapter, {}, None) + + def CheckSetIsolationLevel(self): + """ + See issue 3312. + """ + con = sqlite.connect(":memory:") + self.assertRaises(UnicodeEncodeError, setattr, con, + "isolation_level", u"\xe9") + def suite(): regression_suite = unittest.makeSuite(RegressionTests, "Check") diff --git a/Misc/NEWS b/Misc/NEWS index 357ea50..1ee2b42 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -63,6 +63,8 @@ Core and Builtins Library ------- +- Issue #3312: Fix two crashes in sqlite3. + - Issue #1608818: Fix misbehavior in os.listdir() if readdir() fails. - Issue #3125: Remove copy_reg in multiprocessing and replace it with diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index 2071c33..46774c1 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -940,6 +940,7 @@ static int pysqlite_connection_set_isolation_level(pysqlite_Connection* self, Py { PyObject* res; PyObject* begin_statement; + char* begin_statement_str; Py_XDECREF(self->isolation_level); @@ -972,12 +973,18 @@ static int pysqlite_connection_set_isolation_level(pysqlite_Connection* self, Py return -1; } - self->begin_statement = PyMem_Malloc(PyString_Size(begin_statement) + 2); + begin_statement_str = PyString_AsString(begin_statement); + if (!begin_statement_str) { + Py_DECREF(begin_statement); + return -1; + } + self->begin_statement = PyMem_Malloc(strlen(begin_statement_str) + 2); if (!self->begin_statement) { + Py_DECREF(begin_statement); return -1; } - strcpy(self->begin_statement, PyString_AsString(begin_statement)); + strcpy(self->begin_statement, begin_statement_str); Py_DECREF(begin_statement); } diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index ceec418..7640e92 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -147,6 +147,7 @@ static PyObject* module_register_adapter(PyObject* self, PyObject* args) { PyTypeObject* type; PyObject* caster; + int rc; if (!PyArg_ParseTuple(args, "OO", &type, &caster)) { return NULL; @@ -159,7 +160,9 @@ static PyObject* module_register_adapter(PyObject* self, PyObject* args) pysqlite_BaseTypeAdapted = 1; } - microprotocols_add(type, (PyObject*)&pysqlite_PrepareProtocolType, caster); + rc = microprotocols_add(type, (PyObject*)&pysqlite_PrepareProtocolType, caster); + if (rc == -1) + return NULL; Py_INCREF(Py_None); return Py_None; -- cgit v0.12