diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2012-03-09 23:21:44 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2012-03-09 23:21:44 (GMT) |
commit | ba108823b62a2eb3d5f6f067140ccebf6fee84bb (patch) | |
tree | 70d7db43e33427b9589c7b24e47a9012eec1ef4b /Objects | |
parent | 28393828e21fb47672a060cdb4e704be8bc21505 (diff) | |
download | cpython-ba108823b62a2eb3d5f6f067140ccebf6fee84bb.zip cpython-ba108823b62a2eb3d5f6f067140ccebf6fee84bb.tar.gz cpython-ba108823b62a2eb3d5f6f067140ccebf6fee84bb.tar.bz2 |
Close #14232: catch mmap() failure in new_arena() of obmalloc
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/obmalloc.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index 3d782a2..9cd6a50 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -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, + 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 |