Validate that __length_hint__ returns a usable result.
diff --git a/Lib/test/test_iterlen.py b/Lib/test/test_iterlen.py
index 2123501..cd92801 100644
--- a/Lib/test/test_iterlen.py
+++ b/Lib/test/test_iterlen.py
@@ -208,6 +208,11 @@
     def __length_hint__(self):
         raise RuntimeError('hello')
 
+class NoneLengthHint(object):
+    def __iter__(self): return iter(range(10))
+    def __length_hint__(self):
+        return None
+
 class TestLengthHintExceptions(unittest.TestCase):
 
     def test_issue1242657(self):
@@ -219,6 +224,11 @@
         self.assertRaises(RuntimeError, b.extend, BadLen())
         self.assertRaises(RuntimeError, b.extend, BadLengthHint())
 
+    def test_invalid_hint(self):
+        # Make sure an invalid result doesn't muck-up the works
+        self.assertEqual(list(NoneLengthHint()), list(range(10)))
+
+
 def test_main():
     unittests = [
         TestRepeat,
diff --git a/Objects/abstract.c b/Objects/abstract.c
index 86e2c39..7d0ed06 100644
--- a/Objects/abstract.c
+++ b/Objects/abstract.c
@@ -105,7 +105,7 @@
 		PyErr_Clear();
 		return defaultvalue;
 	}
-	rv = PyLong_AsSsize_t(ro);
+	rv = PyLong_Check(ro) ? PyLong_AsSsize_t(ro) : defaultvalue;
 	Py_DECREF(ro);
 	return rv;
 }