summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIrit Katriel <1055913+iritkatriel@users.noreply.github.com>2023-09-01 09:16:09 (GMT)
committerGitHub <noreply@github.com>2023-09-01 09:16:09 (GMT)
commit844f4c2e12a7c637d1de93dbbb0718be06553510 (patch)
tree8985afdbf9c614ca006d4a7c44578ff6586a727d
parent044b8b3b6a65e6651b161e3badfa5d57c666db19 (diff)
downloadcpython-844f4c2e12a7c637d1de93dbbb0718be06553510.zip
cpython-844f4c2e12a7c637d1de93dbbb0718be06553510.tar.gz
cpython-844f4c2e12a7c637d1de93dbbb0718be06553510.tar.bz2
gh-108727: Fix segfault due to missing tp_dealloc definition for CounterOptimizer_Type (GH-108734)
-rw-r--r--Lib/test/test_capi/test_misc.py7
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2023-08-31-21-29-28.gh-issue-108727.blNRGM.rst2
-rw-r--r--Python/optimizer.c1
3 files changed, 10 insertions, 0 deletions
diff --git a/Lib/test/test_capi/test_misc.py b/Lib/test/test_capi/test_misc.py
index 4148f15..004ce39 100644
--- a/Lib/test/test_capi/test_misc.py
+++ b/Lib/test/test_capi/test_misc.py
@@ -2284,6 +2284,13 @@ def clear_executors(func):
class TestOptimizerAPI(unittest.TestCase):
+ def test_get_counter_optimizer_dealloc(self):
+ # See gh-108727
+ def f():
+ _testinternalcapi.get_counter_optimizer()
+
+ f()
+
def test_get_set_optimizer(self):
old = _testinternalcapi.get_optimizer()
opt = _testinternalcapi.get_counter_optimizer()
diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-08-31-21-29-28.gh-issue-108727.blNRGM.rst b/Misc/NEWS.d/next/Core and Builtins/2023-08-31-21-29-28.gh-issue-108727.blNRGM.rst
new file mode 100644
index 0000000..34959ae
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2023-08-31-21-29-28.gh-issue-108727.blNRGM.rst
@@ -0,0 +1,2 @@
+Define ``tp_dealloc`` for ``CounterOptimizer_Type``. This fixes a segfault
+on deallocation.
diff --git a/Python/optimizer.c b/Python/optimizer.c
index c311a03..7472f52 100644
--- a/Python/optimizer.c
+++ b/Python/optimizer.c
@@ -289,6 +289,7 @@ static PyTypeObject CounterOptimizer_Type = {
.tp_itemsize = 0,
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
.tp_methods = counter_methods,
+ .tp_dealloc = (destructor)PyObject_Del,
};
PyObject *