Commit a22975fb authored by Neal Norwitz's avatar Neal Norwitz

Fix SF bug #1546288, crash in dict_equal.

parent c4a70fbb
...@@ -91,12 +91,17 @@ class Horrid: ...@@ -91,12 +91,17 @@ class Horrid:
self.hashcode = random.randrange(1000000000) self.hashcode = random.randrange(1000000000)
def __hash__(self): def __hash__(self):
return 42
return self.hashcode return self.hashcode
def __cmp__(self, other): def __cmp__(self, other):
maybe_mutate() # The point of the test. maybe_mutate() # The point of the test.
return cmp(self.i, other.i) 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): def __repr__(self):
return "Horrid(%d)" % self.i return "Horrid(%d)" % self.i
...@@ -132,7 +137,10 @@ def test_one(n): ...@@ -132,7 +137,10 @@ def test_one(n):
while dict1 and len(dict1) == len(dict2): while dict1 and len(dict1) == len(dict2):
if verbose: if verbose:
print ".", print ".",
c = cmp(dict1, dict2) if random.random() < 0.5:
c = cmp(dict1, dict2)
else:
c = dict1 == dict2
if verbose: if verbose:
print print
......
...@@ -17,12 +17,14 @@ Core and builtins ...@@ -17,12 +17,14 @@ Core and builtins
- Patch #1542451: disallow continue anywhere under a finally. - Patch #1542451: disallow continue anywhere under a finally.
- Patch #1546288: fix seg fault in dict_equal due to ref counting bug.
Library Library
------- -------
- Patch #1550886: Fix decimal module context management implementation - 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 - Bug #1541863: uuid.uuid1 failed to generate unique identifiers
on systems with low clock resolution. on systems with low clock resolution.
......
...@@ -1585,7 +1585,10 @@ dict_equal(dictobject *a, dictobject *b) ...@@ -1585,7 +1585,10 @@ dict_equal(dictobject *a, dictobject *b)
/* temporarily bump aval's refcount to ensure it stays /* temporarily bump aval's refcount to ensure it stays
alive until we're done with it */ alive until we're done with it */
Py_INCREF(aval); Py_INCREF(aval);
/* ditto for key */
Py_INCREF(key);
bval = PyDict_GetItem((PyObject *)b, key); bval = PyDict_GetItem((PyObject *)b, key);
Py_DECREF(key);
if (bval == NULL) { if (bval == NULL) {
Py_DECREF(aval); Py_DECREF(aval);
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment