From 11ce27763587afd9efdb5cfa47c58c3eb3dbeaff Mon Sep 17 00:00:00 2001 From: Isaku Yamahata Date: Wed, 16 Jan 2019 12:33:28 -0800 Subject: [PATCH] [LibOS] Fix vma leak in shim_do_mmap when pal mapping fails vma leaks when pal mapping (DkVirtualMemoryAlloc or fs_ops->mmap) fails. Free vma correctly in such case. Signed-off-by: Isaku Yamahata --- LibOS/shim/src/sys/shim_mmap.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/LibOS/shim/src/sys/shim_mmap.c b/LibOS/shim/src/sys/shim_mmap.c index e7d78651..3cbeb8e7 100644 --- a/LibOS/shim/src/sys/shim_mmap.c +++ b/LibOS/shim/src/sys/shim_mmap.c @@ -110,19 +110,21 @@ void * shim_do_mmap (void * addr, size_t length, int prot, int flags, int fd, void * cur_stack = current_stack(); assert(cur_stack < addr || cur_stack > addr + length); + /* addr needs to be kept for bkeep_munmap() below */ + void * ret_addr = addr; if (!hdl) { - addr = (void *) DkVirtualMemoryAlloc(addr, length, pal_alloc_type, - PAL_PROT(prot, 0)); + ret_addr = (void *) DkVirtualMemoryAlloc( + ret_addr, length, pal_alloc_type, PAL_PROT(prot, 0)); - if (!addr) { + if (!ret_addr) { if (PAL_NATIVE_ERRNO == PAL_ERROR_DENIED) ret = -EPERM; else ret = -PAL_ERRNO; } } else { - ret = hdl->fs->fs_ops->mmap(hdl, &addr, length, PAL_PROT(prot, flags), - flags, offset); + ret = hdl->fs->fs_ops->mmap( + hdl, &ret_addr, length, PAL_PROT(prot, flags), flags, offset); } if (hdl) @@ -134,7 +136,7 @@ void * shim_do_mmap (void * addr, size_t length, int prot, int flags, int fd, } ADD_PROFILE_OCCURENCE(mmap, length); - return addr; + return ret_addr; } int shim_do_mprotect (void * addr, size_t length, int prot)