leak-segv-jmp.c revision e27c8cd24643d09ef7857a567771a95e888b6b5f
121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#define _GNU_SOURCE 221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#include <stdio.h> 321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#include <stdlib.h> 421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#include <unistd.h> 521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#include "../memcheck.h" 621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#include "leak.h" 721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#include <sys/mman.h> 821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#include <sys/syscall.h> 921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe 10e37c4bce28e78b9288458907357989bfacd265e7philippetypedef unsigned long UWord; 11e37c4bce28e78b9288458907357989bfacd265e7philippetypedef unsigned long long int ULong; 12e37c4bce28e78b9288458907357989bfacd265e7philippe// Below code is copied from m_syscall.c 13e37c4bce28e78b9288458907357989bfacd265e7philippe// Refer to this file for syscall convention. 14e37c4bce28e78b9288458907357989bfacd265e7philippe#if defined(VGP_x86_linux) 1521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippeextern UWord do_syscall_WRK (UWord syscall_no, 1621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe UWord a1, UWord a2, UWord a3, 1721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe UWord a4, UWord a5, UWord a6 1821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe ); 1921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippeasm( 2021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe".text\n" 2121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe".globl do_syscall_WRK\n" 2221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"do_syscall_WRK:\n" 2321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" push %esi\n" 2421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" push %edi\n" 2521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" push %ebx\n" 2621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" push %ebp\n" 2721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" movl 16+ 4(%esp),%eax\n" 2821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" movl 16+ 8(%esp),%ebx\n" 2921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" movl 16+12(%esp),%ecx\n" 3021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" movl 16+16(%esp),%edx\n" 3121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" movl 16+20(%esp),%esi\n" 3221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" movl 16+24(%esp),%edi\n" 3321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" movl 16+28(%esp),%ebp\n" 3421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" int $0x80\n" 3521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" popl %ebp\n" 3621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" popl %ebx\n" 3721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" popl %edi\n" 3821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" popl %esi\n" 3921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" ret\n" 4021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe".previous\n" 4121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe); 4221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#elif defined(VGP_amd64_linux) 4321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippeextern UWord do_syscall_WRK ( 4421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe UWord syscall_no, 4521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe UWord a1, UWord a2, UWord a3, 4621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe UWord a4, UWord a5, UWord a6 4721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe ); 4821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippeasm( 4921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe".text\n" 5021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe".globl do_syscall_WRK\n" 5121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"do_syscall_WRK:\n" 5221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" movq %rdi, %rax\n" 5321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" movq %rsi, %rdi\n" 5421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" movq %rdx, %rsi\n" 5521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" movq %rcx, %rdx\n" 5621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" movq %r8, %r10\n" 5721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" movq %r9, %r8\n" 5821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" movq 8(%rsp), %r9\n" /* last arg from stack */ 5921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" syscall\n" 6021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" ret\n" 6121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe".previous\n" 6221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe); 6321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe 6421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#elif defined(VGP_ppc32_linux) 6521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippeextern ULong do_syscall_WRK ( 6621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe UWord syscall_no, 6721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe UWord a1, UWord a2, UWord a3, 6821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe UWord a4, UWord a5, UWord a6 6921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe ); 7021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippeasm( 7121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe".text\n" 7221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe".globl do_syscall_WRK\n" 7321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"do_syscall_WRK:\n" 7421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" mr 0,3\n" 7521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" mr 3,4\n" 7621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" mr 4,5\n" 7721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" mr 5,6\n" 7821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" mr 6,7\n" 7921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" mr 7,8\n" 8021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" mr 8,9\n" 8121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" sc\n" /* syscall: sets %cr0.so on error */ 8221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" mfcr 4\n" /* %cr -> low word of return var */ 8321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" rlwinm 4,4,4,31,31\n" /* rotate flag bit so to lsb, and mask it */ 8421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" blr\n" /* and return */ 8521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe".previous\n" 8621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe); 8721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe 8821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#elif defined(VGP_arm_linux) 8921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippeextern UWord do_syscall_WRK ( 9021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe UWord a1, UWord a2, UWord a3, 9121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe UWord a4, UWord a5, UWord a6, 9221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe UWord syscall_no 9321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe ); 9421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippeasm( 9521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe".text\n" 9621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe".globl do_syscall_WRK\n" 9721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe"do_syscall_WRK:\n" 9821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" push {r4, r5, r7}\n" 9921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" ldr r4, [sp, #12]\n" 10021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" ldr r5, [sp, #16]\n" 10121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" ldr r7, [sp, #20]\n" 10221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" svc 0x0\n" 10321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" pop {r4, r5, r7}\n" 10421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe" bx lr\n" 10521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe".previous\n" 10621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe); 10721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#elif defined(VGP_s390x_linux) 10821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippeUWord do_syscall_WRK ( 10921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe UWord syscall_no, 11021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe UWord arg1, UWord arg2, UWord arg3, 11121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe UWord arg4, UWord arg5, UWord arg6 11221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe ) 11321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe{ 11421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe register UWord __arg1 asm("2") = arg1; 11521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe register UWord __arg2 asm("3") = arg2; 11621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe register UWord __arg3 asm("4") = arg3; 11721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe register UWord __arg4 asm("5") = arg4; 11821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe register UWord __arg5 asm("6") = arg5; 11921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe register UWord __arg6 asm("7") = arg6; 12021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe register ULong __svcres asm("2"); 12121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe 12221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe __asm__ __volatile__ ( 12321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe "lgr %%r1,%1\n\t" 12421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe "svc 0\n\t" 12521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe : "=d" (__svcres) 12621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe : "a" (syscall_no), 12721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe "0" (__arg1), 12821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe "d" (__arg2), 12921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe "d" (__arg3), 13021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe "d" (__arg4), 13121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe "d" (__arg5), 13221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe "d" (__arg6) 13321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe : "1", "cc", "memory"); 13421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe 13521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe return (UWord) (__svcres); 13621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe} 13721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe 138ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj#elif defined(VGP_mips64_linux) 139ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanjextern UWord do_syscall_WRK ( 140ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj UWord syscall_no, 141ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj UWord a1, UWord a2, UWord a3, 142ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj UWord a4, UWord a5, UWord a6 143ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj ) 144ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj{ 145ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj UWord out; 146ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj __asm__ __volatile__ ( 147ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj "move $v0, %1\n\t" 148ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj "move $a0, %2\n\t" 149ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj "move $a1, %3\n\t" 150ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj "move $a2, %4\n\t" 151ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj "move $a3, %5\n\t" 152ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj "move $8, %6\n\t" /* We use numbers because some compilers */ 153ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj "move $9, %7\n\t" /* don't recognize $a4 and $a5 */ 154ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj "syscall\n" 155ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj "move %0, $v0\n\t" 156ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj : /*out*/ "=r" (out) 157ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj : "r"(syscall_no), "r"(a1), "r"(a2), "r"(a3), 158ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj "r"(a4), "r"(a5), "r"(a6) 159ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj : "v0", "v1", "a0", "a1", "a2", "a3", "$8", "$9"); 160ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj return out; 161ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj} 162112711afefcfcd43680c7c4aa8d38ef180e8811esewardj#elif defined(VGP_tilegx_linux) 163112711afefcfcd43680c7c4aa8d38ef180e8811esewardjextern UWord do_syscall_WRK ( 164112711afefcfcd43680c7c4aa8d38ef180e8811esewardj UWord syscall_no, 165112711afefcfcd43680c7c4aa8d38ef180e8811esewardj UWord a1, UWord a2, UWord a3, 166112711afefcfcd43680c7c4aa8d38ef180e8811esewardj UWord a4, UWord a5, UWord a6 167112711afefcfcd43680c7c4aa8d38ef180e8811esewardj ) 168112711afefcfcd43680c7c4aa8d38ef180e8811esewardj{ 169112711afefcfcd43680c7c4aa8d38ef180e8811esewardj UWord out; 170112711afefcfcd43680c7c4aa8d38ef180e8811esewardj __asm__ __volatile__ ( 171e27c8cd24643d09ef7857a567771a95e888b6b5fzliu "move r10, %1\n\t" 172e27c8cd24643d09ef7857a567771a95e888b6b5fzliu "move r0, %2\n\t" 173e27c8cd24643d09ef7857a567771a95e888b6b5fzliu "move r1, %3\n\t" 174e27c8cd24643d09ef7857a567771a95e888b6b5fzliu "move r2, %4\n\t" 175e27c8cd24643d09ef7857a567771a95e888b6b5fzliu "move r3, %5\n\t" 176e27c8cd24643d09ef7857a567771a95e888b6b5fzliu "move r4, %6\n\t" 177e27c8cd24643d09ef7857a567771a95e888b6b5fzliu "move r5, %7\n\t" 178112711afefcfcd43680c7c4aa8d38ef180e8811esewardj "swint1 \n\t" 179112711afefcfcd43680c7c4aa8d38ef180e8811esewardj "move %0, r0\n\t" 180112711afefcfcd43680c7c4aa8d38ef180e8811esewardj : /*out*/ "=r" (out) 181112711afefcfcd43680c7c4aa8d38ef180e8811esewardj : "r"(syscall_no), "r"(a1), "r"(a2), "r"(a3), 182112711afefcfcd43680c7c4aa8d38ef180e8811esewardj "r"(a4), "r"(a5), "r"(a6) 183112711afefcfcd43680c7c4aa8d38ef180e8811esewardj : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r10"); 184112711afefcfcd43680c7c4aa8d38ef180e8811esewardj return out; 185112711afefcfcd43680c7c4aa8d38ef180e8811esewardj} 186ec587b07a0d13a6dc6fab184dfb98f0dec841f18dejanj 18721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#else 1882082b3436bd570f764945258654bd2152ec1a7dephilippe// Ensure the file compiles even if the syscall nr is not defined. 1892082b3436bd570f764945258654bd2152ec1a7dephilippe#ifndef __NR_mprotect 1902082b3436bd570f764945258654bd2152ec1a7dephilippe#define __NR_mprotect 0 1912082b3436bd570f764945258654bd2152ec1a7dephilippe#endif 19221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippeUWord do_syscall_WRK (UWord syscall_no, 19321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe UWord a1, UWord a2, UWord a3, 19421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe UWord a4, UWord a5, UWord a6 19521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe ) 19621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe{ 19721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe // not implemented. vgtest prereq should avoid this to be called. 19821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe return -1; 19921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe} 20021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#endif 20121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe 20221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe 20321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe 20421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippechar **b10; 20521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippeint mprotect_result = 0; 20621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippestatic void non_simd_mprotect (long tid, void* addr, long len) 20721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe{ 20821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe mprotect_result = do_syscall_WRK(__NR_mprotect, 20921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe (UWord) addr, len, PROT_NONE, 21021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe 0, 0, 0); 21121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe} 21221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe 21321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippevoid f(void) 21421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe{ 21521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe long pagesize; 21621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe#define RNDPAGEDOWN(a) ((long)a & ~(pagesize-1)) 2177a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe int i; 2187a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe const int nr_ptr = (10000 * 4)/sizeof(char*); 21921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe 2207a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe b10 = calloc (nr_ptr * sizeof(char*), 1); 2217a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe for (i = 0; i < nr_ptr; i++) 2227a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe b10[i] = (char*)b10; 22321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe b10[4000] = malloc (1000); 22421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe 22521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe fprintf(stderr, "expecting no leaks\n"); 22621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe fflush(stderr); 22721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe VALGRIND_DO_LEAK_CHECK; 22821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe 22921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe // make b10[4000] undefined. This should create a leak. 23006bc722457ffe12e056d2f40d0d2f5c8711b541fflorian (void) VALGRIND_MAKE_MEM_UNDEFINED (&b10[4000], sizeof(char*)); 23121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe fprintf(stderr, "expecting a leak\n"); 23221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe fflush(stderr); 23321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe VALGRIND_DO_LEAK_CHECK; 23421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe 23521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe // make b10[4000] defined again. 23606bc722457ffe12e056d2f40d0d2f5c8711b541fflorian (void) VALGRIND_MAKE_MEM_DEFINED (&b10[4000], sizeof(char*)); 23721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe 23821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe // now make some bricolage to have some pages around b10[4000] 23921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe // unreadable. The leak check should recover from that 24021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe // thanks to a SEGV handler and a setjmp/longjmp. 24121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe // This setjmp/longjmp is useful if there is a desync between 24221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe // the aspacemgr and the real pages mapping. 24321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe // To have such a discrepancy, we resort on a non SIMD call 24421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe // to mprotect the pages : as this syscall will not be seen 24521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe // by Valgrind core, the aspacemgr will not get a chance 24621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe // to stay synchronised. 24721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe pagesize = sysconf(_SC_PAGE_SIZE); 24821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe if (pagesize == -1) 24921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe perror ("sysconf failed"); 25021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe 25121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe if (RUNNING_ON_VALGRIND) 25206bc722457ffe12e056d2f40d0d2f5c8711b541fflorian (void) VALGRIND_NON_SIMD_CALL2(non_simd_mprotect, RNDPAGEDOWN(&b10[4000]), 2 * pagesize); 25321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe else 25421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe mprotect_result = mprotect((void*) RNDPAGEDOWN(&b10[4000]), 2 * pagesize, PROT_NONE); 25521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe fprintf(stderr, "mprotect result %d\n", mprotect_result); 25621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe 25721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe fprintf(stderr, "expecting a leak again\n"); 25821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe fflush(stderr); 25921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe VALGRIND_DO_LEAK_CHECK; 26021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe 2617a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe if (RUNNING_ON_VALGRIND) 2627a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe (void) VALGRIND_NON_SIMD_CALL2(non_simd_mprotect, 2637a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe RNDPAGEDOWN(&b10[0]), 2647a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe RNDPAGEDOWN(&(b10[nr_ptr-1])) 2657a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe - RNDPAGEDOWN(&(b10[0]))); 2667a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe else 2677a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe mprotect_result = mprotect((void*) RNDPAGEDOWN(&b10[0]), 2687a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe RNDPAGEDOWN(&(b10[nr_ptr-1])) 2697a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe - RNDPAGEDOWN(&(b10[0])), 2707a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe PROT_NONE); 2717a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe fprintf(stderr, "full mprotect result %d\n", mprotect_result); 2727a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe 2737a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe fprintf(stderr, "expecting a leak again after full mprotect\n"); 2747a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe fflush(stderr); 2757a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe VALGRIND_DO_LEAK_CHECK; 2767a76f4b27db3ec7a0130a5fd7120aeb5060c89c2philippe 27721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe fprintf(stderr, "finished\n"); 27821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe} 27921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe 28021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippeint main(void) 28121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe{ 28221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe DECLARE_LEAK_COUNTERS; 28321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe 28421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe GET_INITIAL_LEAK_COUNTS; 28521fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe 28621fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe f(); // see leak-cases.c 28721fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe 28821fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe 28921fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe GET_FINAL_LEAK_COUNTS; 29021fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe 29121fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe PRINT_LEAK_COUNTS(stderr); 29221fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe 29321fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe return 0; 29421fcbb73c60e6eabbccf877439c095cf3b7c66cfphilippe} 295