From 6cacaa69d676dba8f807a644152c95da75f982f8 Mon Sep 17 00:00:00 2001 From: Dmitry Safonov Date: Wed, 18 Jan 2017 19:26:00 +0300 Subject: [PATCH] x86/compat: fix error-check for compat mmap() Raw sys_mmap() returns address or error like -ENOMEM. Don't check MAP_FAILED, check that result is aligned by page. travis-ci: success for x86/compat: fix error-check for compat mmap() Signed-off-by: Dmitry Safonov Signed-off-by: Pavel Emelyanov Signed-off-by: Andrei Vagin --- criu/arch/x86/include/asm/compat.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/criu/arch/x86/include/asm/compat.h b/criu/arch/x86/include/asm/compat.h index 8379af452..119768db3 100644 --- a/criu/arch/x86/include/asm/compat.h +++ b/criu/arch/x86/include/asm/compat.h @@ -16,8 +16,12 @@ static inline void *alloc_compat_syscall_stack(void) void *mem = (void*)sys_mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_32BIT | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); - if (mem == MAP_FAILED) + if ((uintptr_t)mem % PAGE_SIZE) { + int err = (~(uint32_t)(uintptr_t)mem) + 1; + + pr_err("mmap() of compat syscall stack failed with %d\n", err); return 0; + } return mem; } @@ -26,7 +30,7 @@ static inline void free_compat_syscall_stack(void *mem) long int ret = sys_munmap(mem, PAGE_SIZE); if (ret) - pr_err("munmap of compat addr %p failed with %ld", mem, ret); + pr_err("munmap() of compat addr %p failed with %ld", mem, ret); } #ifdef CONFIG_COMPAT