mirror of https://github.com/python/cpython
Issue #8195: Fix a crash in sqlite Connection.create_collation() if the
collation name contains a surrogate character.
This commit is contained in:
parent
0c2d8b8e51
commit
35466c5bce
|
@ -274,6 +274,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,))
|
||||||
|
|
|
@ -323,6 +323,9 @@ C-API
|
||||||
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".
|
||||||
|
|
|
@ -1374,7 +1374,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)) {
|
||||||
|
@ -1390,19 +1392,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;
|
||||||
|
@ -1417,7 +1424,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);
|
||||||
|
|
Loading…
Reference in New Issue