[Python-checkins] r60246 - in python/trunk: Lib/test/crashers/loosing_dict_ref.py Lib/test/test_descr.py Objects/object.c

guido.van.rossum python-checkins at python.org
Thu Jan 24 18:58:06 CET 2008


Author: guido.van.rossum
Date: Thu Jan 24 18:58:05 2008
New Revision: 60246

Removed:
   python/trunk/Lib/test/crashers/loosing_dict_ref.py
Modified:
   python/trunk/Lib/test/test_descr.py
   python/trunk/Objects/object.c
Log:
Fix test67.py from issue #1303614.


Deleted: /python/trunk/Lib/test/crashers/loosing_dict_ref.py
==============================================================================
--- /python/trunk/Lib/test/crashers/loosing_dict_ref.py	Thu Jan 24 18:58:05 2008
+++ (empty file)
@@ -1,21 +0,0 @@
-
-# http://python.org/sf/1303614
-
-class Strange(object):
-    def __hash__(self):
-        return hash('hello')
-
-    def __eq__(self, other):
-        x.__dict__ = {}   # the old x.__dict__ is deallocated
-        return False
-
-
-class X(object):
-    pass
-
-if __name__ == '__main__':
-    v = 123
-    x = X()
-    x.__dict__ = {Strange(): 42,
-                  'hello': v+456}
-    x.hello  # segfault: the above dict is accessed after it's deallocated

Modified: python/trunk/Lib/test/test_descr.py
==============================================================================
--- python/trunk/Lib/test/test_descr.py	(original)
+++ python/trunk/Lib/test/test_descr.py	Thu Jan 24 18:58:05 2008
@@ -4504,6 +4504,29 @@
     finally:
         __builtin__.__import__ = orig_import
 
+def test_losing_dict_ref_segfault():
+    # This used to segfault;
+    # derived from issue #1303614, test67.py
+    if verbose:
+        print "Testing losing dict ref segfault..."
+
+    class Strange(object):
+        def __hash__(self):
+            return hash('hello')
+
+        def __eq__(self, other):
+            x.__dict__ = {}   # the old x.__dict__ is deallocated
+            return False
+
+    class X(object):
+        pass
+
+    v = 123
+    x = X()
+    x.__dict__ = {Strange(): 42, 'hello': v+456}
+    x.hello
+
+
 def test_main():
     weakref_segfault() # Must be first, somehow
     wrapper_segfault()
@@ -4606,6 +4629,7 @@
     test_weakref_in_del_segfault()
     test_borrowed_ref_3_segfault()
     test_borrowed_ref_4_segfault()
+    test_losing_dict_ref_segfault()
 
     if verbose: print "All OK"
 

Modified: python/trunk/Objects/object.c
==============================================================================
--- python/trunk/Objects/object.c	(original)
+++ python/trunk/Objects/object.c	Thu Jan 24 18:58:05 2008
@@ -1349,12 +1349,15 @@
 		dictptr = (PyObject **) ((char *)obj + dictoffset);
 		dict = *dictptr;
 		if (dict != NULL) {
+			Py_INCREF(dict);
 			res = PyDict_GetItem(dict, name);
 			if (res != NULL) {
 				Py_INCREF(res);
 				Py_XDECREF(descr);
+                                Py_DECREF(dict);
 				goto done;
 			}
+                        Py_DECREF(dict);
 		}
 	}
 
@@ -1435,12 +1438,14 @@
 			*dictptr = dict;
 		}
 		if (dict != NULL) {
+			Py_INCREF(dict);
 			if (value == NULL)
 				res = PyDict_DelItem(dict, name);
 			else
 				res = PyDict_SetItem(dict, name, value);
 			if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError))
 				PyErr_SetObject(PyExc_AttributeError, name);
+			Py_DECREF(dict);
 			goto done;
 		}
 	}


More information about the Python-checkins mailing list