Issue 3301:  Bisect functions behaved badly when lo was negative.
diff --git a/Lib/bisect.py b/Lib/bisect.py
index e4a2133..fe84255 100644
--- a/Lib/bisect.py
+++ b/Lib/bisect.py
@@ -9,6 +9,8 @@
     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 @@
     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 @@
     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 @@
     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 fb490b7..7776cc8 100644
--- a/Lib/test/test_bisect.py
+++ b/Lib/test/test_bisect.py
@@ -114,6 +114,14 @@
             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 b9affe5..557af26 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,7 @@
 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 @@
 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 f8d412a..4870e5d 100644
--- a/Modules/_bisectmodule.c
+++ b/Modules/_bisectmodule.c
@@ -11,6 +11,10 @@
 	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 @@
 	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)