From: Neal Norwitz Date: Tue, 5 Sep 2006 02:24:03 +0000 (+0000) Subject: Fix SF bug #1546288, crash in dict_equal. X-Git-Tag: v2.6a1~2711 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a22975fb35e1bae0f85fc6ede1572264a7bcd1e6;p=thirdparty%2FPython%2Fcpython.git Fix SF bug #1546288, crash in dict_equal. --- diff --git a/Lib/test/test_mutants.py b/Lib/test/test_mutants.py index df58944d884f..a219450b2556 100644 --- a/Lib/test/test_mutants.py +++ b/Lib/test/test_mutants.py @@ -91,12 +91,17 @@ class Horrid: self.hashcode = random.randrange(1000000000) def __hash__(self): + return 42 return self.hashcode def __cmp__(self, other): maybe_mutate() # The point of the test. return cmp(self.i, other.i) + def __eq__(self, other): + maybe_mutate() # The point of the test. + return self.i == other.i + def __repr__(self): return "Horrid(%d)" % self.i @@ -132,7 +137,10 @@ def test_one(n): while dict1 and len(dict1) == len(dict2): if verbose: print ".", - c = cmp(dict1, dict2) + if random.random() < 0.5: + c = cmp(dict1, dict2) + else: + c = dict1 == dict2 if verbose: print diff --git a/Misc/NEWS b/Misc/NEWS index 04c78c0dc21b..c7bd4d648de6 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -17,12 +17,14 @@ Core and builtins - Patch #1542451: disallow continue anywhere under a finally. +- Patch #1546288: fix seg fault in dict_equal due to ref counting bug. + Library ------- - Patch #1550886: Fix decimal module context management implementation - to match the localcontext() example from PEP 343 + to match the localcontext() example from PEP 343. - Bug #1541863: uuid.uuid1 failed to generate unique identifiers on systems with low clock resolution. diff --git a/Objects/dictobject.c b/Objects/dictobject.c index f3b6b7fda6a2..4e827980b57f 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -1585,7 +1585,10 @@ dict_equal(dictobject *a, dictobject *b) /* temporarily bump aval's refcount to ensure it stays alive until we're done with it */ Py_INCREF(aval); + /* ditto for key */ + Py_INCREF(key); bval = PyDict_GetItem((PyObject *)b, key); + Py_DECREF(key); if (bval == NULL) { Py_DECREF(aval); return 0;