summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorINADA Naoki <methane@users.noreply.github.com>2017-09-26 21:24:16 (GMT)
committerlarryhastings <larry@hastings.org>2017-09-26 21:24:16 (GMT)
commit0fcc03367b31f44c1e1b8d3d2dd940ef1e744326 (patch)
treee889a3b7de22ace9191e6b9ffd45093e897a3384 /Objects
parent44c1b62939a6192776dc9d093546154044cb2ecb (diff)
downloadcpython-0fcc03367b31f44c1e1b8d3d2dd940ef1e744326.zip
cpython-0fcc03367b31f44c1e1b8d3d2dd940ef1e744326.tar.gz
cpython-0fcc03367b31f44c1e1b8d3d2dd940ef1e744326.tar.bz2
bpo-31095: fix potential crash during GC (GH-2974) (#3196)
(cherry picked from commit a6296d34a478b4f697ea9db798146195075d496c)
Diffstat (limited to 'Objects')
-rw-r--r--Objects/dictobject.c6
-rw-r--r--Objects/setobject.c3
2 files changed, 9 insertions, 0 deletions
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index ff77bee..a8b26d2 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -1636,6 +1636,8 @@ dict_dealloc(PyDictObject *mp)
PyObject **values = mp->ma_values;
PyDictKeysObject *keys = mp->ma_keys;
Py_ssize_t i, n;
+
+ /* bpo-31095: UnTrack is needed before calling any callbacks */
PyObject_GC_UnTrack(mp);
Py_TRASHCAN_SAFE_BEGIN(mp)
if (values != NULL) {
@@ -2961,6 +2963,8 @@ dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
static void
dictiter_dealloc(dictiterobject *di)
{
+ /* bpo-31095: UnTrack is needed before calling any callbacks */
+ _PyObject_GC_UNTRACK(di);
Py_XDECREF(di->di_dict);
Py_XDECREF(di->di_result);
PyObject_GC_Del(di);
@@ -3319,6 +3323,8 @@ dictiter_reduce(dictiterobject *di)
static void
dictview_dealloc(_PyDictViewObject *dv)
{
+ /* bpo-31095: UnTrack is needed before calling any callbacks */
+ _PyObject_GC_UNTRACK(dv);
Py_XDECREF(dv->dv_dict);
PyObject_GC_Del(dv);
}
diff --git a/Objects/setobject.c b/Objects/setobject.c
index 3dbdb4e..1f532bc 100644
--- a/Objects/setobject.c
+++ b/Objects/setobject.c
@@ -472,6 +472,7 @@ set_dealloc(PySetObject *so)
setentry *entry;
Py_ssize_t used = so->used;
+ /* bpo-31095: UnTrack is needed before calling any callbacks */
PyObject_GC_UnTrack(so);
Py_TRASHCAN_SAFE_BEGIN(so)
if (so->weakreflist != NULL)
@@ -736,6 +737,8 @@ typedef struct {
static void
setiter_dealloc(setiterobject *si)
{
+ /* bpo-31095: UnTrack is needed before calling any callbacks */
+ _PyObject_GC_UNTRACK(si);
Py_XDECREF(si->si_set);
PyObject_GC_Del(si);
}