commit
c468b537cd
|
@ -426,6 +426,13 @@ class TestBasicOps(unittest.TestCase):
|
|||
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
|
||||
self.pickletest(proto, permutations(values, r)) # test pickling
|
||||
|
||||
@support.bigaddrspacetest
|
||||
def test_permutations_overflow(self):
|
||||
with self.assertRaises(OverflowError):
|
||||
permutations("A", 2**30)
|
||||
with self.assertRaises(OverflowError):
|
||||
permutations("A", 2, 2**30)
|
||||
|
||||
@support.impl_detail("tuple reuse is specific to CPython")
|
||||
def test_permutations_tuple_reuse(self):
|
||||
self.assertEqual(len(set(map(id, permutations('abcde', 3)))), 1)
|
||||
|
@ -955,6 +962,11 @@ class TestBasicOps(unittest.TestCase):
|
|||
args = map(iter, args)
|
||||
self.assertEqual(len(list(product(*args))), expected_len)
|
||||
|
||||
@support.bigaddrspacetest
|
||||
def test_product_overflow(self):
|
||||
with self.assertRaises(OverflowError):
|
||||
product(["a"]*(2**16), repeat=2**16)
|
||||
|
||||
@support.impl_detail("tuple reuse is specific to CPython")
|
||||
def test_product_tuple_reuse(self):
|
||||
self.assertEqual(len(set(map(id, product('abc', 'def')))), 1)
|
||||
|
|
|
@ -50,6 +50,10 @@ Core and Builtins
|
|||
Library
|
||||
-------
|
||||
|
||||
- Issue #23363: Fix possible overflow in itertools.permutations.
|
||||
|
||||
- Issue #23364: Fix possible overflow in itertools.product.
|
||||
|
||||
- Issue #23366: Fixed possible integer overflow in itertools.combinations.
|
||||
|
||||
- Issue #23366: Fixed possible integer overflow in itertools.combinations.
|
||||
|
|
|
@ -2017,8 +2017,17 @@ product_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
}
|
||||
}
|
||||
|
||||
assert(PyTuple_Check(args));
|
||||
nargs = (repeat == 0) ? 0 : PyTuple_GET_SIZE(args);
|
||||
assert(PyTuple_CheckExact(args));
|
||||
if (repeat == 0) {
|
||||
nargs = 0;
|
||||
} else {
|
||||
nargs = PyTuple_GET_SIZE(args);
|
||||
if (repeat > PY_SSIZE_T_MAX/sizeof(Py_ssize_t) ||
|
||||
nargs > PY_SSIZE_T_MAX/(repeat * sizeof(Py_ssize_t))) {
|
||||
PyErr_SetString(PyExc_OverflowError, "repeat argument too large");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
npools = nargs * repeat;
|
||||
|
||||
indices = PyMem_Malloc(npools * sizeof(Py_ssize_t));
|
||||
|
@ -3049,6 +3058,11 @@ permutations_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
goto error;
|
||||
}
|
||||
|
||||
if (n > PY_SSIZE_T_MAX/sizeof(Py_ssize_t) ||
|
||||
r > PY_SSIZE_T_MAX/sizeof(Py_ssize_t)) {
|
||||
PyErr_SetString(PyExc_OverflowError, "parameters too large");
|
||||
goto error;
|
||||
}
|
||||
indices = PyMem_Malloc(n * sizeof(Py_ssize_t));
|
||||
cycles = PyMem_Malloc(r * sizeof(Py_ssize_t));
|
||||
if (indices == NULL || cycles == NULL) {
|
||||
|
|
Loading…
Reference in New Issue