From: Tim Peters Date: Wed, 20 Jun 2001 06:57:32 +0000 (+0000) Subject: gen_iternext(): repair subtle refcount problem. X-Git-Tag: v2.2a3~1503 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6302ec63fc40dd6ae1ad3003003b6b264422e8e0;p=thirdparty%2FPython%2Fcpython.git gen_iternext(): repair subtle refcount problem. NeilS, please check! This came from staring at your genbug.py, but I'm not sure it plugs all possible holes. Without this, I caught a frameobject refcount going negative, and it was also the cause (in debug build) of _Py_ForgetReference's attempt to forget an object with already- NULL _ob_prev and _ob_next pointers -- although I'm still not entirely sure how! Part of the difficulty is that frameobjects are stored on a free list that gets recycled very quickly, so if there's a stray pointer to one of them it never looks like an insane frameobject (never goes trough the free() mangling MS debug forces, etc). --- diff --git a/Python/ceval.c b/Python/ceval.c index cf917dbcb564..ea5c5378995a 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -152,6 +152,11 @@ gen_iternext(genobject *gen) gen->running = 1; result = eval_frame(f); gen->running = 0; + /* The connection between this frame and its parent is over now, so + must NULL out f_back lest it get decref'ed when gen dies (note + that eval_frame sets f->f_back without bumping its refcount: we + never had a fully legit reference to it). */ + f->f_back = NULL; return result; }