Index: Objects/typeobject.c =================================================================== --- Objects/typeobject.c (revision 69434) +++ Objects/typeobject.c (working copy) @@ -4618,7 +4618,12 @@ if (res == NULL) return -1; - len = PyLong_AsSsize_t(res); + if (!PyNumber_Check(res)) { + PyErr_SetString(PyExc_TypeError, + "__len__ returned non number value"); + return -1; + } + len = PyNumber_AsSsize_t(res, PyExc_OverflowError); Py_DECREF(res); if (len < 0) { if (!PyErr_Occurred()) Index: Lib/test/test_builtin.py =================================================================== --- Lib/test/test_builtin.py (revision 69434) +++ Lib/test/test_builtin.py (working copy) @@ -611,6 +611,18 @@ def __len__(self): raise ValueError self.assertRaises(ValueError, len, BadSeq()) + class InvalidLen: + def __len__(self): + return None + self.assertRaises(TypeError, len, InvalidLen()) + class FloatLen: + def __len__(self): + return 4.5 + self.assertRaises(TypeError, len, FloatLen()) + class HugeLen: + def __len__(self): + return sys.maxsize + 1 + self.assertRaises(OverflowError, len, HugeLen()) def test_map(self): self.assertEqual(