diff -r 15bfb82194fa Lib/test/test_sys.py --- a/Lib/test/test_sys.py Fri Aug 15 01:23:15 2014 -0400 +++ b/Lib/test/test_sys.py Fri Aug 15 12:29:48 2014 +0300 @@ -769,6 +769,15 @@ # but lists are self.assertEqual(sys.getsizeof([]), vsize('Pn') + gc_header_size) + def test_overflow(self): + class Overflow(int): + def __sizeof__(self): + return int(self) + self.assertEqual(sys.getsizeof(Overflow(sys.maxsize)), + sys.maxsize + self.gc_headsize) + with self.assertRaises(OverflowError): + sys.getsizeof(Overflow(sys.maxsize + 1)) + def test_default(self): size = test.support.calcvobjsize self.assertEqual(sys.getsizeof(True), size('') + self.longdigit) diff -r 15bfb82194fa Python/sysmodule.c --- a/Python/sysmodule.c Fri Aug 15 01:23:15 2014 -0400 +++ b/Python/sysmodule.c Fri Aug 15 12:29:48 2014 +0300 @@ -894,6 +894,12 @@ if (size == (size_t)-1 && PyErr_Occurred()) return (size_t)-1; + if (size > (size_t)PY_SSIZE_T_MAX) { + PyErr_SetString(PyExc_OverflowError, + "Python int too large to convert to C ssize_t"); + return (size_t)-1; + } + /* add gc_head size */ if (PyObject_IS_GC(o)) size += sizeof(PyGC_Head);