Amaury Forgeot d'Arc <amaur...@gmail.com> added the comment:

Thanks for the analysis!
This is quite similar to issue793822: gc.get_referrers() can access unfinished 
tuples.  The difference here is that what breaks is not the monitoring tool, 
but the "main" program!

Here is a simple script inspired from the original bug; PySequence_Tuple() uses 
PyTuple_SET_ITEM() which is a macro without the ob_refcnt check, but we can 
make it call _PyTuple_Resize() and fail there.  All versions of CPython are 
affected:


import gc
TAG = object()

def monitor():
    lst = [x for x in gc.get_referrers(TAG)
           if isinstance(x, tuple)]
    t = lst[0]   # this *is* the result tuple
    print(t)     # full of nulls !
    return t     # Keep it alive for some time

def my_iter():
    yield TAG    # 'tag' gets stored in the result tuple
    t = monitor()
    for x in range(10):
        yield x  # SystemError when the tuple needs to be resized

tuple(my_iter())

----------
nosy: +amaury.forgeotdarc, arigo

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue15108>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to