From: Raymond Hettinger Date: Thu, 10 Jul 2008 14:03:19 +0000 (+0000) Subject: Issue 3301: Bisect functions behaved badly when lo was negative. X-Git-Tag: v2.6b2~83 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3cd1e42dca01308a9f5897ba2efc2aab0bebb661;p=thirdparty%2FPython%2Fcpython.git Issue 3301: Bisect functions behaved badly when lo was negative. --- diff --git a/Lib/bisect.py b/Lib/bisect.py index e4a21336f817..fe84255590a7 100644 --- a/Lib/bisect.py +++ b/Lib/bisect.py @@ -9,6 +9,8 @@ def insort_right(a, x, lo=0, hi=None): slice of a to be searched. """ + if lo < 0: + raise ValueError('lo must be non-negative') if hi is None: hi = len(a) while lo < hi: @@ -30,6 +32,8 @@ def bisect_right(a, x, lo=0, hi=None): slice of a to be searched. """ + if lo < 0: + raise ValueError('lo must be non-negative') if hi is None: hi = len(a) while lo < hi: @@ -49,6 +53,8 @@ def insort_left(a, x, lo=0, hi=None): slice of a to be searched. """ + if lo < 0: + raise ValueError('lo must be non-negative') if hi is None: hi = len(a) while lo < hi: @@ -69,6 +75,8 @@ def bisect_left(a, x, lo=0, hi=None): slice of a to be searched. """ + if lo < 0: + raise ValueError('lo must be non-negative') if hi is None: hi = len(a) while lo < hi: diff --git a/Lib/test/test_bisect.py b/Lib/test/test_bisect.py index fb490b7962b7..7776cc89177e 100644 --- a/Lib/test/test_bisect.py +++ b/Lib/test/test_bisect.py @@ -114,6 +114,14 @@ class TestBisect(unittest.TestCase): self.assertEqual(func(data, elem), expected) self.assertEqual(func(UserList(data), elem), expected) + def test_negative_lo(self): + # Issue 3301 + mod = self.module + self.assertRaises(ValueError, mod.bisect_left, [1, 2, 3], 5, -1, 3), + self.assertRaises(ValueError, mod.bisect_right, [1, 2, 3], 5, -1, 3), + self.assertRaises(ValueError, mod.insort_left, [1, 2, 3], 5, -1, 3), + self.assertRaises(ValueError, mod.insort_right, [1, 2, 3], 5, -1, 3), + def test_random(self, n=25): from random import randrange for i in xrange(n): diff --git a/Misc/NEWS b/Misc/NEWS index b9affe56ac7d..557af26f3ebf 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,7 @@ What's New in Python 2.6 beta 2? Core and Builtins ----------------- + - Issue #2517: Allow unicode messages in Exceptions again by correctly bypassing the instance dictionary when looking up __unicode__ on new-style classes. @@ -40,6 +41,8 @@ Core and Builtins Library ------- +- Issue #3301: Bisect module modules behaved badly when lo was negative. + - Issue #839496: SimpleHTTPServer used to open text files in text mode. This is both unnecessary (HTTP allows text content to be sent in several forms) and wrong because the actual transmitted size could differ with the diff --git a/Modules/_bisectmodule.c b/Modules/_bisectmodule.c index f8d412aba8e0..4870e5d47b98 100644 --- a/Modules/_bisectmodule.c +++ b/Modules/_bisectmodule.c @@ -11,6 +11,10 @@ internal_bisect_right(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t PyObject *litem; Py_ssize_t mid, res; + if (lo < 0) { + PyErr_SetString(PyExc_ValueError, "lo must be non-negative"); + return -1; + } if (hi == -1) { hi = PySequence_Size(list); if (hi < 0) @@ -108,6 +112,10 @@ internal_bisect_left(PyObject *list, PyObject *item, int lo, int hi) PyObject *litem; int mid, res; + if (lo < 0) { + PyErr_SetString(PyExc_ValueError, "lo must be non-negative"); + return -1; + } if (hi == -1) { hi = PySequence_Size(list); if (hi < 0)