summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2004-10-26 01:52:37 (GMT)
committerRaymond Hettinger <python@rcn.com>2004-10-26 01:52:37 (GMT)
commit561fbf138d30896af3e7afe33f9bc602dda5f2b7 (patch)
tree58e1d9ea5979c53cb547c7a5fd3b925ef75fb18c
parent3ed238503d7f9764f670794be20c4a4a0011487a (diff)
downloadcpython-561fbf138d30896af3e7afe33f9bc602dda5f2b7.zip
cpython-561fbf138d30896af3e7afe33f9bc602dda5f2b7.tar.gz
cpython-561fbf138d30896af3e7afe33f9bc602dda5f2b7.tar.bz2
SF bug #1054139: serious string hashing error in 2.4b1
_PyString_Resize() readied strings for mutation but did not invalidate the cached hash value.
-rw-r--r--Lib/test/string_tests.py9
-rw-r--r--Misc/NEWS2
-rw-r--r--Objects/stringobject.c1
3 files changed, 11 insertions, 1 deletions
diff --git a/Lib/test/string_tests.py b/Lib/test/string_tests.py
index 4335965..c8ed07c 100644
--- a/Lib/test/string_tests.py
+++ b/Lib/test/string_tests.py
@@ -80,6 +80,15 @@ class CommonTest(unittest.TestCase):
args = self.fixtype(args)
getattr(object, methodname)(*args)
+ def test_hash(self):
+ # SF bug 1054139: += optimization was not invalidating cached hash value
+ a = self.type2test('DNSSEC')
+ b = self.type2test('')
+ for c in a:
+ b += c
+ hash(b)
+ self.assertEqual(hash(a), hash(b))
+
def test_capitalize(self):
self.checkequal(' hello ', ' hello ', 'capitalize')
self.checkequal('Hello ', 'Hello ','capitalize')
diff --git a/Misc/NEWS b/Misc/NEWS
index e5437e1..6c0935e 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -32,7 +32,7 @@ License Version 2.
Core and builtins
-----------------
-...
+- Bug #1054139 _PyString_Resize() now invalidates its cached hash value.
Extension Modules
-----------------
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index c87b688..b8e5f41 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -3530,6 +3530,7 @@ _PyString_Resize(PyObject **pv, int newsize)
sv = (PyStringObject *) *pv;
sv->ob_size = newsize;
sv->ob_sval[newsize] = '\0';
+ sv->ob_shash = -1; /* invalidate cached hash value */
return 0;
}