Merged revisions 80349 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r80349 | victor.stinner | 2010-04-22 13:23:23 +0200 (jeu., 22 avril 2010) | 3 lines

  Issue #8195: Fix a crash in sqlite Connection.create_collation() if the
  collation name contains a surrogate character.
........
This commit is contained in:
Victor Stinner 2010-04-22 11:24:50 +00:00
parent d0ab48f1c4
commit 9b05700ed3
3 changed files with 22 additions and 5 deletions

View File

@ -183,6 +183,13 @@ class RegressionTests(unittest.TestCase):
""" """
self.assertRaises(sqlite.Warning, self.con, 1) self.assertRaises(sqlite.Warning, self.con, 1)
def CheckCollation(self):
def collation_cb(a, b):
return 1
self.assertRaises(sqlite.ProgrammingError, self.con.create_collation,
# Lone surrogate cannot be encoded to the default encoding (utf8)
"\uDC80", collation_cb)
def suite(): def suite():
regression_suite = unittest.makeSuite(RegressionTests, "Check") regression_suite = unittest.makeSuite(RegressionTests, "Check")
return unittest.TestSuite((regression_suite,)) return unittest.TestSuite((regression_suite,))

View File

@ -33,6 +33,9 @@ Core and Builtins
Library Library
------- -------
- Issue #8195: Fix a crash in sqlite Connection.create_collation() if the
collation name contains a surrogate character.
- Issue #8484: Load all ciphers and digest algorithms when initializing - Issue #8484: Load all ciphers and digest algorithms when initializing
the _ssl extension, such that verification of some SSL certificates the _ssl extension, such that verification of some SSL certificates
doesn't fail because of an "unknown algorithm". doesn't fail because of an "unknown algorithm".

View File

@ -1228,7 +1228,9 @@ pysqlite_connection_create_collation(pysqlite_Connection* self, PyObject* args)
PyObject* uppercase_name = 0; PyObject* uppercase_name = 0;
PyObject* name; PyObject* name;
PyObject* retval; PyObject* retval;
char* chk; Py_UNICODE* chk;
Py_ssize_t i, len;
char *uppercase_name_str;
int rc; int rc;
if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
@ -1244,19 +1246,24 @@ pysqlite_connection_create_collation(pysqlite_Connection* self, PyObject* args)
goto finally; goto finally;
} }
chk = _PyUnicode_AsString(uppercase_name); len = PyUnicode_GET_SIZE(uppercase_name);
while (*chk) { chk = PyUnicode_AS_UNICODE(uppercase_name);
for (i=0; i<len; i++, chk++) {
if ((*chk >= '0' && *chk <= '9') if ((*chk >= '0' && *chk <= '9')
|| (*chk >= 'A' && *chk <= 'Z') || (*chk >= 'A' && *chk <= 'Z')
|| (*chk == '_')) || (*chk == '_'))
{ {
chk++; continue;
} else { } else {
PyErr_SetString(pysqlite_ProgrammingError, "invalid character in collation name"); PyErr_SetString(pysqlite_ProgrammingError, "invalid character in collation name");
goto finally; goto finally;
} }
} }
uppercase_name_str = _PyUnicode_AsString(uppercase_name);
if (!uppercase_name_str)
goto finally;
if (callable != Py_None && !PyCallable_Check(callable)) { if (callable != Py_None && !PyCallable_Check(callable)) {
PyErr_SetString(PyExc_TypeError, "parameter must be callable"); PyErr_SetString(PyExc_TypeError, "parameter must be callable");
goto finally; goto finally;
@ -1269,7 +1276,7 @@ pysqlite_connection_create_collation(pysqlite_Connection* self, PyObject* args)
} }
rc = sqlite3_create_collation(self->db, rc = sqlite3_create_collation(self->db,
_PyUnicode_AsString(uppercase_name), uppercase_name_str,
SQLITE_UTF8, SQLITE_UTF8,
(callable != Py_None) ? callable : NULL, (callable != Py_None) ? callable : NULL,
(callable != Py_None) ? pysqlite_collation_callback : NULL); (callable != Py_None) ? pysqlite_collation_callback : NULL);