Author dhanavaths
Recipients dhanavaths
Date 2017-01-23.03:23:59
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1485141841.25.0.0993319189306.issue29347@psf.upfronthosting.co.za>
In-reply-to
Content
We are using python 2.7.8 on Ubuntu 14.04 to host our services. In one of the crashes python interpreter got segmentation fault while initializing weakref for a given object. Please find snip of backtraces as given below.

#0  0x00007f62aa86951a in clear_weakref (self=0x7f5a1ed17520) at Objects/weakrefobject.c:65
#1  proxy_dealloc (self=0x7f5a1ed17520) at Objects/weakrefobject.c:540
#2  0x00007f62aa869b8b in PyWeakref_NewProxy (ob=<optimized out>, callback=<optimized out>) at Objects/weakrefobject.c:855
#3  0x00007f62aa901e56 in weakref_proxy (self=<optimized out>, args=<optimized out>) at ./Modules/_weakref.c:73
#4  0x00007f62aa8a929b in call_function (oparg=<optimized out>, pp_stack=0x7f5d36661c90) at Python/ceval.c:4033
.
.
.


Have tried to root cause the issue and found that PyWeakref_NewProxy@Objects/weakrefobject.c creates new isntance of PyWeakReference struct and does not intialize wr_prev and wr_next of new isntance. These pointers can have garbage and point to random memory locations. 

As per comment in the code there could be a race while creating new instance and some other thread could have created weakref by the time current thread returns from new_weakref function. If it finds weakref created, current thread destroys instance created by itself and uses the one created by some other thread.


Python should not crash while destroying the isntance created in the same interpreter function. As per my understanding, both wr_prev and wr_next of PyWeakReference instance should be initialized to NULL to avoid segfault.
History
Date User Action Args
2017-01-23 03:24:01dhanavathssetrecipients: + dhanavaths
2017-01-23 03:24:01dhanavathssetmessageid: <1485141841.25.0.0993319189306.issue29347@psf.upfronthosting.co.za>
2017-01-23 03:24:01dhanavathslinkissue29347 messages
2017-01-23 03:23:59dhanavathscreate