Mercurial > cpython-lru_cache-weakref
diff Objects/listobject.c @ 23517:73c01b1cbdb2 legacy-trunk
Closes: #556025 seg fault when doing list(xrange(1e9))
A MemoryError is now raised when the list cannot be created.
There is a test, but as the comment says, it really only
works for 32 bit systems. I don't know how to improve
the test for other systems (ie, 64 bit or systems
where the data size != addressable size,
e.g. 64 bit data, but 48 bit addressable memory)
| author | Neal Norwitz <nnorwitz@gmail.com> |
|---|---|
| date | Wed, 22 May 2002 23:19:17 +0000 |
| parents | 29e6cb832497 |
| children | 5edea752a421 |
line wrap: on
line diff
--- a/Objects/listobject.c Wed May 22 20:44:03 2002 +0000 +++ b/Objects/listobject.c Wed May 22 23:19:17 2002 +0000 @@ -44,7 +44,14 @@ return ((n >> nbits) + 1) << nbits; } -#define NRESIZE(var, type, nitems) PyMem_RESIZE(var, type, roundupsize(nitems)) +#define NRESIZE(var, type, nitems) \ +do { \ + size_t _new_size = roundupsize(nitems); \ + if (_new_size <= ((~(size_t)0) / sizeof(type))) \ + PyMem_RESIZE(var, type, _new_size); \ + else \ + var = NULL; \ +} while (0) PyObject * PyList_New(int size) @@ -1565,8 +1572,10 @@ if (n < 0) n = 8; /* arbitrary */ NRESIZE(result->ob_item, PyObject*, n); - if (result->ob_item == NULL) + if (result->ob_item == NULL) { + PyErr_NoMemory(); goto error; + } for (i = 0; i < n; i++) result->ob_item[i] = NULL; result->ob_size = n;
