Issue #21810: Backport mmap-based arena allocation failure check.

This commit is contained in:
Charles-François Natali 2014-06-19 22:42:51 +01:00
parent 4ade2d25fc
commit cee4f03438
1 changed files with 9 additions and 4 deletions

View File

@ -540,6 +540,8 @@ new_arena(void)
{
struct arena_object* arenaobj;
uint excess; /* number of bytes above pool alignment */
void *address;
int err;
#ifdef PYMALLOC_DEBUG
if (Py_GETENV("PYTHONMALLOCSTATS"))
@ -593,12 +595,14 @@ new_arena(void)
unused_arena_objects = arenaobj->nextarena;
assert(arenaobj->address == 0);
#ifdef ARENAS_USE_MMAP
arenaobj->address = (uptr)mmap(NULL, ARENA_SIZE, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
address = mmap(NULL, ARENA_SIZE, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
err = (address == MAP_FAILED);
#else
arenaobj->address = (uptr)malloc(ARENA_SIZE);
address = malloc(ARENA_SIZE);
err = (address == 0);
#endif
if (arenaobj->address == 0) {
if (err) {
/* The allocation failed: return NULL after putting the
* arenaobj back.
*/
@ -606,6 +610,7 @@ new_arena(void)
unused_arena_objects = arenaobj;
return NULL;
}
arenaobj->address = (uptr)address;
++narenas_currently_allocated;
#ifdef PYMALLOC_DEBUG