Skip to content

Commit d7146ff

Browse files
author
georg.brandl
committed
#3312: fix two sqlite3 crashes.
git-svn-id: http://svn.python.org/projects/python/trunk@65040 6015fed2-1504-0410-9fe1-9d1591cc4771
1 parent 7574a9a commit d7146ff

File tree

4 files changed

+29
-3
lines changed

4 files changed

+29
-3
lines changed

Lib/sqlite3/test/regression.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,20 @@ def CheckTypeMapUsage(self):
153153
con.execute("insert into foo(bar) values (5)")
154154
con.execute(SELECT)
155155

156+
def CheckRegisterAdapter(self):
157+
"""
158+
See issue 3312.
159+
"""
160+
self.assertRaises(TypeError, sqlite.register_adapter, {}, None)
161+
162+
def CheckSetIsolationLevel(self):
163+
"""
164+
See issue 3312.
165+
"""
166+
con = sqlite.connect(":memory:")
167+
self.assertRaises(UnicodeEncodeError, setattr, con,
168+
"isolation_level", u"\xe9")
169+
156170

157171
def suite():
158172
regression_suite = unittest.makeSuite(RegressionTests, "Check")

Misc/NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ Core and Builtins
6363
Library
6464
-------
6565

66+
- Issue #3312: Fix two crashes in sqlite3.
67+
6668
- Issue #1608818: Fix misbehavior in os.listdir() if readdir() fails.
6769

6870
- Issue #3125: Remove copy_reg in multiprocessing and replace it with

Modules/_sqlite/connection.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -940,6 +940,7 @@ static int pysqlite_connection_set_isolation_level(pysqlite_Connection* self, Py
940940
{
941941
PyObject* res;
942942
PyObject* begin_statement;
943+
char* begin_statement_str;
943944

944945
Py_XDECREF(self->isolation_level);
945946

@@ -972,12 +973,18 @@ static int pysqlite_connection_set_isolation_level(pysqlite_Connection* self, Py
972973
return -1;
973974
}
974975

975-
self->begin_statement = PyMem_Malloc(PyString_Size(begin_statement) + 2);
976+
begin_statement_str = PyString_AsString(begin_statement);
977+
if (!begin_statement_str) {
978+
Py_DECREF(begin_statement);
979+
return -1;
980+
}
981+
self->begin_statement = PyMem_Malloc(strlen(begin_statement_str) + 2);
976982
if (!self->begin_statement) {
983+
Py_DECREF(begin_statement);
977984
return -1;
978985
}
979986

980-
strcpy(self->begin_statement, PyString_AsString(begin_statement));
987+
strcpy(self->begin_statement, begin_statement_str);
981988
Py_DECREF(begin_statement);
982989
}
983990

Modules/_sqlite/module.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ static PyObject* module_register_adapter(PyObject* self, PyObject* args)
147147
{
148148
PyTypeObject* type;
149149
PyObject* caster;
150+
int rc;
150151

151152
if (!PyArg_ParseTuple(args, "OO", &type, &caster)) {
152153
return NULL;
@@ -159,7 +160,9 @@ static PyObject* module_register_adapter(PyObject* self, PyObject* args)
159160
pysqlite_BaseTypeAdapted = 1;
160161
}
161162

162-
microprotocols_add(type, (PyObject*)&pysqlite_PrepareProtocolType, caster);
163+
rc = microprotocols_add(type, (PyObject*)&pysqlite_PrepareProtocolType, caster);
164+
if (rc == -1)
165+
return NULL;
163166

164167
Py_INCREF(Py_None);
165168
return Py_None;

0 commit comments

Comments
 (0)