mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
fix integer overflow in unicode case operations (closes #22643)
This commit is contained in:
parent
77a75b3db1
commit
e1bd38c03c
3 changed files with 13 additions and 0 deletions
|
@ -661,6 +661,11 @@ class UnicodeTest(string_tests.CommonTest,
|
||||||
self.assertEqual('x'.center(4, '\U0010FFFF'),
|
self.assertEqual('x'.center(4, '\U0010FFFF'),
|
||||||
'\U0010FFFFx\U0010FFFF\U0010FFFF')
|
'\U0010FFFFx\U0010FFFF\U0010FFFF')
|
||||||
|
|
||||||
|
@unittest.skipUnless(sys.maxsize == 2**31 - 1, "requires 32-bit system")
|
||||||
|
def test_case_operation_overflow(self):
|
||||||
|
# Issue #22643
|
||||||
|
self.assertRaises(OverflowError, ("ü"*(2**32//12 + 1)).upper)
|
||||||
|
|
||||||
def test_contains(self):
|
def test_contains(self):
|
||||||
# Testing Unicode contains method
|
# Testing Unicode contains method
|
||||||
self.assertIn('a', 'abdb')
|
self.assertIn('a', 'abdb')
|
||||||
|
|
|
@ -10,6 +10,9 @@ What's New in Python 3.3.6?
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #22643: Fix integer overflow in Unicode case operations (upper, lower,
|
||||||
|
title, swapcase, casefold).
|
||||||
|
|
||||||
- Issue #22518: Fixed integer overflow issues in "backslashreplace",
|
- Issue #22518: Fixed integer overflow issues in "backslashreplace",
|
||||||
"xmlcharrefreplace", and "surrogatepass" error handlers.
|
"xmlcharrefreplace", and "surrogatepass" error handlers.
|
||||||
|
|
||||||
|
|
|
@ -9484,6 +9484,11 @@ case_operation(PyObject *self,
|
||||||
kind = PyUnicode_KIND(self);
|
kind = PyUnicode_KIND(self);
|
||||||
data = PyUnicode_DATA(self);
|
data = PyUnicode_DATA(self);
|
||||||
length = PyUnicode_GET_LENGTH(self);
|
length = PyUnicode_GET_LENGTH(self);
|
||||||
|
if (length > PY_SSIZE_T_MAX / 3 ||
|
||||||
|
length > PY_SIZE_MAX / (3 * sizeof(Py_UCS4))) {
|
||||||
|
PyErr_SetString(PyExc_OverflowError, "string is too long");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
tmp = PyMem_MALLOC(sizeof(Py_UCS4) * 3 * length);
|
tmp = PyMem_MALLOC(sizeof(Py_UCS4) * 3 * length);
|
||||||
if (tmp == NULL)
|
if (tmp == NULL)
|
||||||
return PyErr_NoMemory();
|
return PyErr_NoMemory();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue