]> granicus.if.org Git - python/commitdiff
Issue 3301: Bisect functions behaved badly when lo was negative.
authorRaymond Hettinger <python@rcn.com>
Thu, 10 Jul 2008 14:03:19 +0000 (14:03 +0000)
committerRaymond Hettinger <python@rcn.com>
Thu, 10 Jul 2008 14:03:19 +0000 (14:03 +0000)
Lib/bisect.py
Lib/test/test_bisect.py
Misc/NEWS
Modules/_bisectmodule.c

index e4a21336f8173689b9e3bc5f0aebca988afaca5b..fe84255590a7b4c6f901749639d7ffd49a85a8e3 100644 (file)
@@ -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:
index fb490b7962b717d3e039aff21a2327e52797e74c..7776cc89177e6559e72e10b164f9fcb6472d1cce 100644 (file)
@@ -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):
index b9affe56ac7d0e168daa8c217c2fdc3fc87a1c0b..557af26f3ebfa812691072bff9c9c0bbc3d356ff 100644 (file)
--- 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
index f8d412aba8e0101d3eb944ba98baa2e04424130d..4870e5d47b98c4d6f94618c80ed134ff3f617c4a 100644 (file)
@@ -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)