summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZackery Spytz <zspytz@gmail.com>2018-07-03 19:47:22 (GMT)
committerAntoine Pitrou <pitrou@free.fr>2018-07-03 19:47:22 (GMT)
commitd8cba5d16f1333fd625726fc72e66afbd45b8d00 (patch)
tree6aa57f4d44036535b4cdf7895e92cd235a5b8f4f
parent831c29721dcb1b768c6315a4b8a4059c4c97ee8b (diff)
downloadcpython-d8cba5d16f1333fd625726fc72e66afbd45b8d00.zip
cpython-d8cba5d16f1333fd625726fc72e66afbd45b8d00.tar.gz
cpython-d8cba5d16f1333fd625726fc72e66afbd45b8d00.tar.bz2
bpo-24596: Decref module in PyRun_SimpleFileExFlags() on SystemExit (GH-7918)
PyErr_Print() will not return when the exception is a SystemExit, so decref the __main__ module object in that case.
-rw-r--r--Lib/test/test_gc.py17
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2018-06-25-16-54-05.bpo-24596.Rkwova.rst2
-rw-r--r--Python/pythonrun.c3
3 files changed, 20 insertions, 2 deletions
diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py
index 904fc7d..8d806db 100644
--- a/Lib/test/test_gc.py
+++ b/Lib/test/test_gc.py
@@ -1,7 +1,7 @@
import unittest
from test.support import (verbose, refcount_test, run_unittest,
strip_python_stderr, cpython_only, start_threads,
- temp_dir, requires_type_collecting)
+ temp_dir, requires_type_collecting, TESTFN, unlink)
from test.support.script_helper import assert_python_ok, make_script
import sys
@@ -708,6 +708,21 @@ class GCTests(unittest.TestCase):
rc, out, err = assert_python_ok('-c', code)
self.assertEqual(out.strip(), b'__del__ called')
+ @requires_type_collecting
+ def test_global_del_SystemExit(self):
+ code = """if 1:
+ class ClassWithDel:
+ def __del__(self):
+ print('__del__ called')
+ a = ClassWithDel()
+ a.link = a
+ raise SystemExit(0)"""
+ self.addCleanup(unlink, TESTFN)
+ with open(TESTFN, 'w') as script:
+ script.write(code)
+ rc, out, err = assert_python_ok(TESTFN)
+ self.assertEqual(out.strip(), b'__del__ called')
+
def test_get_stats(self):
stats = gc.get_stats()
self.assertEqual(len(stats), 3)
diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-06-25-16-54-05.bpo-24596.Rkwova.rst b/Misc/NEWS.d/next/Core and Builtins/2018-06-25-16-54-05.bpo-24596.Rkwova.rst
new file mode 100644
index 0000000..1b33fd4
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2018-06-25-16-54-05.bpo-24596.Rkwova.rst
@@ -0,0 +1,2 @@
+Decref the module object in :c:func:`PyRun_SimpleFileExFlags` before calling
+:c:func:`PyErr_Print()`. Patch by Zackery Spytz.
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index 5cf7c33..bcd1ca9 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -431,6 +431,7 @@ PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit,
}
flush_io();
if (v == NULL) {
+ Py_CLEAR(m);
PyErr_Print();
goto done;
}
@@ -439,7 +440,7 @@ PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit,
done:
if (set_file_name && PyDict_DelItemString(d, "__file__"))
PyErr_Clear();
- Py_DECREF(m);
+ Py_XDECREF(m);
return ret;
}