From 4207907c2b8c0b3da62de2acdb8b22b5bbe7f7a2 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Sun, 10 Feb 2019 19:56:58 +0000 Subject: [PATCH] Fix division by 0 when checking for overflow in math.prod (GH-11808) --- Lib/test/test_math.py | 4 ++++ Modules/mathmodule.c | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index 083759ca75e..856b1e8ac11 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -1756,6 +1756,10 @@ class IsCloseTests(unittest.TestCase): with self.assertRaises(TypeError): prod([10, 20], [30, 40]) # start is a keyword-only argument + self.assertEqual(prod([0, 1, 2, 3]), 0) + self.assertEqual(prod([1, 0, 2, 3]), 0) + self.assertEqual(prod(range(10)), 0) + def test_main(): from doctest import DocFileSuite suite = unittest.TestSuite() diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index d2f8d533473..2272f622f0b 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -2561,8 +2561,8 @@ math_prod_impl(PyObject *module, PyObject *iterable, PyObject *start) long x = i_result * b; /* Continue if there is no overflow */ if (overflow == 0 - && x < INT_MAX && x > INT_MIN - && !(b != 0 && x / i_result != b)) { + && x < LONG_MAX && x > LONG_MIN + && !(b != 0 && x / b != i_result)) { i_result = x; Py_DECREF(item); continue;