]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-113841: fix possible undefined division by 0 in _Py_c_pow() (GH-127211)
authorSergey B Kirpichev <skirpichev@gmail.com>
Sun, 24 Nov 2024 07:37:37 +0000 (10:37 +0300)
committerGitHub <noreply@github.com>
Sun, 24 Nov 2024 07:37:37 +0000 (23:37 -0800)
`x**y == 1/x**-y ` thus changing `/=` to `*=` by negating the exponent.

Lib/test/test_complex.py
Misc/NEWS.d/next/Core_and_Builtins/2024-11-24-07-01-28.gh-issue-113841.WFg-Bu.rst [new file with mode: 0644]
Objects/complexobject.c

index ecc97315e50d31b2e484dd38feddd9eea86ea83c..c51327c7f33a0a20cffd9de465574ceb93e9a1f8 100644 (file)
@@ -338,6 +338,11 @@ class ComplexTest(ComplexesAreIdenticalMixin, unittest.TestCase):
                     except OverflowError:
                         pass
 
+        # gh-113841: possible undefined division by 0 in _Py_c_pow()
+        x, y = 9j, 33j**3
+        with self.assertRaises(OverflowError):
+            x**y
+
     def test_pow_with_small_integer_exponents(self):
         # Check that small integer exponents are handled identically
         # regardless of their type.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2024-11-24-07-01-28.gh-issue-113841.WFg-Bu.rst b/Misc/NEWS.d/next/Core_and_Builtins/2024-11-24-07-01-28.gh-issue-113841.WFg-Bu.rst
new file mode 100644 (file)
index 0000000..2b07fdf
--- /dev/null
@@ -0,0 +1,2 @@
+Fix possible undefined behavior division by zero in :class:`complex`'s
+:c:func:`_Py_c_pow`.
index 7b4948fc8ebe3da58f53214cf66a72a7153e1961..9faa57519a424b129b40f79ecb825833fe431763 100644 (file)
@@ -168,7 +168,7 @@ _Py_c_pow(Py_complex a, Py_complex b)
         at = atan2(a.imag, a.real);
         phase = at*b.real;
         if (b.imag != 0.0) {
-            len /= exp(at*b.imag);
+            len *= exp(-at*b.imag);
             phase += b.imag*log(vabs);
         }
         r.real = len*cos(phase);