From: Neal Norwitz Date: Tue, 5 Sep 2006 01:54:06 +0000 (+0000) Subject: Fix SF bug #1546288, crash in dict_equal X-Git-Tag: v2.5c2~38 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d3da7d394a64f3894b625842da4e5cc2f13bac08;p=python Fix SF bug #1546288, crash in dict_equal --- diff --git a/Lib/test/test_mutants.py b/Lib/test/test_mutants.py index df58944d88..a219450b25 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 3b9dba0f00..3275c7af27 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -9,6 +9,13 @@ What's New in Python 2.5? *Release date: XX-SEP-2006* +(Hopefully nothing.) + +What's New in Python 2.5 release candidate 2? +============================================= + +*Release date: XX-SEP-2006* + Core and builtins ----------------- @@ -18,12 +25,14 @@ Core and builtins - Patch #1541585: fix buffer overrun when performing repr() on a unicode string in a build with wide unicode (UCS-4) support. +- 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 f3b6b7fda6..4e827980b5 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;