diff -r 20c9290a5de4 Lib/test/test_bytes.py --- a/Lib/test/test_bytes.py Sun Jun 21 13:57:30 2015 -0700 +++ b/Lib/test/test_bytes.py Mon Jun 22 17:18:38 2015 +0200 @@ -310,6 +310,14 @@ self.assertEqual(b.find(b'w'), -1) self.assertEqual(b.find(b'mississippian'), -1) + # Regression test for http://bugs.python.org/issue24462 + def test_fastsearch_issue24462(self): + b = self.type2test(b'mississippi') + self.assertEqual(b.find(b'mississippi'), 0) + self.assertEqual(b.find(b'missimissis'), -1) + self.assertEqual(b.count(b'mississippi'), 1) + self.assertEqual(b.count(b'missimissis'), 0) + def test_rfind(self): b = self.type2test(b'mississippi') self.assertEqual(b.rfind(b'ss'), 5) diff -r 20c9290a5de4 Objects/stringlib/fastsearch.h --- a/Objects/stringlib/fastsearch.h Sun Jun 21 13:57:30 2015 -0700 +++ b/Objects/stringlib/fastsearch.h Mon Jun 22 17:18:38 2015 +0200 @@ -46,6 +46,16 @@ if (w < 0 || (mode == FAST_COUNT && maxcount == 0)) return -1; + /* issue24462: in case lengths are equal, fall back to memcmp */ + if (w == 0) { + int cmp_result; + + cmp_result = memcmp(s, p, n * sizeof(STRINGLIB_CHAR)); + if (mode == FAST_COUNT) + return cmp_result ? 0 : 1; + else + return cmp_result ? -1 : 0; + } /* look for special cases */ if (m <= 1) {