mirror of
https://github.com/python/cpython.git
synced 2025-12-31 04:23:37 +00:00
[3.14] gh-142554: avoid divmod crashes due to bad _pylong.int_divmod (GH-142673) (#142696)
gh-142554: avoid `divmod` crashes due to bad `_pylong.int_divmod` (GH-142673)
(cherry picked from commit 4e4163676a)
Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
This commit is contained in:
parent
7297d3a98d
commit
aef4552d04
3 changed files with 16 additions and 2 deletions
|
|
@ -778,6 +778,18 @@ def test_pylong_int_divmod(self):
|
|||
a, b = divmod(n*3 + 1, n)
|
||||
assert a == 3 and b == 1
|
||||
|
||||
@support.cpython_only # tests implementation details of CPython.
|
||||
@unittest.skipUnless(_pylong, "_pylong module required")
|
||||
def test_pylong_int_divmod_crash(self):
|
||||
# Regression test for https://github.com/python/cpython/issues/142554.
|
||||
bad_int_divmod = lambda a, b: (1,)
|
||||
# 'k' chosen such that divmod(2**(2*k), 2**k) uses _pylong.int_divmod()
|
||||
k = 10_000
|
||||
a, b = (1 << (2 * k)), (1 << k)
|
||||
with mock.patch.object(_pylong, "int_divmod", wraps=bad_int_divmod):
|
||||
msg = r"tuple of length 2 is required from int_divmod\(\)"
|
||||
self.assertRaisesRegex(ValueError, msg, divmod, a, b)
|
||||
|
||||
def test_pylong_str_to_int(self):
|
||||
v1 = 1 << 100_000
|
||||
s = str(v1)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,2 @@
|
|||
Fix a crash in :func:`divmod` when :func:`!_pylong.int_divmod` does not
|
||||
return a tuple of length two exactly. Patch by Bénédikt Tran.
|
||||
|
|
@ -4339,10 +4339,10 @@ pylong_int_divmod(PyLongObject *v, PyLongObject *w,
|
|||
if (result == NULL) {
|
||||
return -1;
|
||||
}
|
||||
if (!PyTuple_Check(result)) {
|
||||
if (!PyTuple_Check(result) || PyTuple_GET_SIZE(result) != 2) {
|
||||
Py_DECREF(result);
|
||||
PyErr_SetString(PyExc_ValueError,
|
||||
"tuple is required from int_divmod()");
|
||||
"tuple of length 2 is required from int_divmod()");
|
||||
return -1;
|
||||
}
|
||||
PyObject *q = PyTuple_GET_ITEM(result, 0);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue