diff -r f44f5daff665 Lib/test/test_sys.py --- a/Lib/test/test_sys.py Sun Aug 17 15:32:42 2014 +0300 +++ b/Lib/test/test_sys.py Sun Aug 17 16:43:39 2014 +0300 @@ -770,6 +770,19 @@ # 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)) + with self.assertRaises(ValueError): + sys.getsizeof(Overflow(-1)) + with self.assertRaises((ValueError, 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 f44f5daff665 Python/sysmodule.c --- a/Python/sysmodule.c Sun Aug 17 15:32:42 2014 +0300 +++ b/Python/sysmodule.c Sun Aug 17 16:43:39 2014 +0300 @@ -868,7 +868,7 @@ { PyObject *res = NULL; PyObject *method; - size_t size; + Py_ssize_t size; /* Make sure the type is initialized. float gets initialized late */ if (PyType_Ready(Py_TYPE(o)) < 0) @@ -889,15 +889,20 @@ if (res == NULL) return (size_t)-1; - size = PyLong_AsSize_t(res); + size = PyLong_AsSsize_t(res); Py_DECREF(res); - if (size == (size_t)-1 && PyErr_Occurred()) + if (size == -1 && PyErr_Occurred()) return (size_t)-1; + if (size < 0) { + PyErr_SetString(PyExc_ValueError, "negative size"); + return (size_t)-1; + } + /* add gc_head size */ if (PyObject_IS_GC(o)) - size += sizeof(PyGC_Head); - return size; + return ((size_t)size) + sizeof(PyGC_Head); + return (size_t)size; } static PyObject *