INADA Naoki added the comment:

4385             int was_shared = cached == ((PyDictObject *)dict)->ma_keys;    
     
4386             res = PyDict_SetItem(dict, key, value);                        
     
4387             if (was_shared && cached != ((PyDictObject *)dict)->ma_keys) { 
     
4388                 /* PyDict_SetItem() may call dictresize and convert split 
table 
...
4401                  */                                                        
     
4402                 if (cached->dk_refcnt == 1) {                              
     
4403                     CACHED_KEYS(tp) = make_keys_shared(dict);              
     
4404                 }                                                          
     
4405                 else {                                                     
     
4406                     CACHED_KEYS(tp) = NULL;                                
     
4407                 }

L4402 accessed free `cached` object.
At PyDict_SetItem() in L4386, some callback is called through weakref callback,
and the callback inserts something into this dict.  shared key object (cached) 
is freed.

So right way to fix it may be DK_INCREF() before PyDict_SetItem().

----------

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

Reply via email to