[Python-checkins] GH-98897: fix memory leak if `math.dist` raises exception (GH-98898)

miss-islington webhook-mailer at python.org
Mon Oct 31 22:47:35 EDT 2022


https://github.com/python/cpython/commit/078ce6891c2d663babaf81b1e89f1fef82c007bc
commit: 078ce6891c2d663babaf81b1e89f1fef82c007bc
branch: 3.10
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: miss-islington <31488909+miss-islington at users.noreply.github.com>
date: 2022-10-31T19:47:29-07:00
summary:

GH-98897: fix memory leak if `math.dist` raises exception (GH-98898)

(cherry picked from commit ab575050709e2b313ca9a9585f09b6f4b0560318)

Co-authored-by: Kumar Aditya <59607654+kumaraditya303 at users.noreply.github.com>

files:
A Misc/NEWS.d/next/Library/2022-10-31-12-34-03.gh-issue-98897.rgNn4x.rst
M Lib/test/test_math.py
M Modules/mathmodule.c

diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py
index e5f4e2bbadef..ada196a166b2 100644
--- a/Lib/test/test_math.py
+++ b/Lib/test/test_math.py
@@ -979,6 +979,11 @@ class T(tuple):
             self.assertEqual(math.dist(p, q), 5*scale)
             self.assertEqual(math.dist(q, p), 5*scale)
 
+    def test_math_dist_leak(self):
+        # gh-98897: Check for error handling does not leak memory
+        with self.assertRaises(ValueError):
+            math.dist([1, 2], [3, 4, 5])
+
     def testIsqrt(self):
         # Test a variety of inputs, large and small.
         test_values = (
diff --git a/Misc/NEWS.d/next/Library/2022-10-31-12-34-03.gh-issue-98897.rgNn4x.rst b/Misc/NEWS.d/next/Library/2022-10-31-12-34-03.gh-issue-98897.rgNn4x.rst
new file mode 100644
index 000000000000..f61af2543c7f
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-10-31-12-34-03.gh-issue-98897.rgNn4x.rst
@@ -0,0 +1 @@
+Fix memory leak in :func:`math.dist` when both points don't have the same dimension. Patch by Kumar Aditya.
diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c
index 4534176adce1..f31ca8327719 100644
--- a/Modules/mathmodule.c
+++ b/Modules/mathmodule.c
@@ -2658,13 +2658,13 @@ math_dist_impl(PyObject *module, PyObject *p, PyObject *q)
     if (m != n) {
         PyErr_SetString(PyExc_ValueError,
                         "both points must have the same number of dimensions");
-        return NULL;
-
+        goto error_exit;
     }
     if (n > NUM_STACK_ELEMS) {
         diffs = (double *) PyObject_Malloc(n * sizeof(double));
         if (diffs == NULL) {
-            return PyErr_NoMemory();
+            PyErr_NoMemory();
+            goto error_exit;
         }
     }
     for (i=0 ; i<n ; i++) {



More information about the Python-checkins mailing list