summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2008-07-10 14:03:19 +0000
committerRaymond Hettinger <python@rcn.com>2008-07-10 14:03:19 +0000
commit3cd1e42dca01308a9f5897ba2efc2aab0bebb661 (patch)
tree8950458b1bb3e598da4dc22edbbd610ad5e75bfc
parentd2cd86ddd5c3d90911a98a1440563118297e45db (diff)
downloadcpython-git-3cd1e42dca01308a9f5897ba2efc2aab0bebb661.tar.gz
Issue 3301: Bisect functions behaved badly when lo was negative.
-rw-r--r--Lib/bisect.py8
-rw-r--r--Lib/test/test_bisect.py8
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/_bisectmodule.c8
4 files changed, 27 insertions, 0 deletions
diff --git a/Lib/bisect.py b/Lib/bisect.py
index e4a21336f8..fe84255590 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 fb490b7962..7776cc8917 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 b9affe56ac..557af26f3e 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 f8d412aba8..4870e5d47b 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)