Sorry, I was committed below. I lost OK rsadowski@. -- ASOU Masato
> CVSROOT: /cvs > Module name: ports > Changes by: a...@cvs.openbsd.org 2019/11/05 22:25:13 > > Modified files: > devel/valgrind : Makefile > devel/valgrind/patches: > patch-coregrind_link_tool_exe_openbsd_in > patch-coregrind_m_aspacemgr_aspacemgr-linux_c > patch-coregrind_m_initimg_initimg-openbsd_c > patch-coregrind_m_transtab_c > Added files: > devel/valgrind/patches: patch-coregrind_m_mallocfree_c > Removed files: > devel/valgrind/patches: > patch-coregrind_m_scheduler_scheduler_c > patch-coregrind_pub_core_transtab_h > > Log message: > Delete mmap(PROT_WRITE) from the memory area of the execution code of the > target program. From: Rafael Sadowski <raf...@sizeofvoid.org> Subject: Re: Valgrind: Delete 'USE_WXNEEDED = Yes' from Makefile Date: Tue, 5 Nov 2019 16:19:54 +0100 > On Mon Oct 28, 2019 at 11:36:47AM +0900, Masato Asou wrote: >> From: Masato Asou <a...@soum.co.jp> >> Subject: Valgrind: Delete 'USE_WXNEEDED = Yes' from Makefile >> Date: Fri, 25 Oct 2019 16:40:43 +0900 (JST) >> >> > Hi ports, >> > >> > The Valgrind specifies 'READ | WRITE | EXEC' when allocating memory >> > for target program as follows: >> > >> > int fd = open("a.out", O_RDONLY); >> > void *addr = mmap(..., prot = PROT_READ | PROT_WRITE | PROT_EXEC, ...); >> > read(fd, addr, LENGTH); >> > /* Execute target program */ >> > >> > I modified to specify 'READ | EXEC' after readind the target >> > program as folloes: >> > >> > int fd = open("a.out", O_RDONLY); >> > void *addr = mmap(..., prot = PROT_READ | PROT_WRITE, ...); >> > read(fd, addr, LENGTH); >> > mmap(addr, LENGTH, prot = PROT_READ | PROT_EXEC, ...); >> > /* Execute target program */ >> > >> > Therefor, the target program area can not be rewritten. >> > >> > How about it? >> >> Sorry, I lost increment RESISION. > > Compiles and runs fine on amd64. OK rsadowski@ > >> -- >> ASOU Masato >> >> Index: Makefile >> =================================================================== >> RCS file: /cvs/ports/devel/valgrind/Makefile,v >> retrieving revision 1.21 >> diff -u -p -r1.21 Makefile >> --- Makefile 23 Oct 2019 02:35:05 -0000 1.21 >> +++ Makefile 28 Oct 2019 02:10:39 -0000 >> @@ -1,7 +1,5 @@ >> # $OpenBSD: Makefile,v 1.21 2019/10/23 02:35:05 asou Exp $ >> >> -USE_WXNEEDED = Yes >> - >> ONLY_FOR_ARCHS = amd64 >> >> COMMENT = instrumentation framework for dynamic analysis tools >> @@ -9,7 +7,7 @@ CATEGORIES = devel >> >> V = 3.10.1 >> PV = 20160331 >> -REVISION = 14 >> +REVISION = 15 >> DISTNAME = valgrind-${V} >> EXTRACT_SUFX = .tar.bz2 >> >> Index: patches/patch-coregrind_link_tool_exe_openbsd_in >> =================================================================== >> RCS file: >> /cvs/ports/devel/valgrind/patches/patch-coregrind_link_tool_exe_openbsd_in,v >> retrieving revision 1.3 >> diff -u -p -r1.3 patch-coregrind_link_tool_exe_openbsd_in >> --- patches/patch-coregrind_link_tool_exe_openbsd_in 2 Oct 2019 17:19:29 >> -0000 1.3 >> +++ patches/patch-coregrind_link_tool_exe_openbsd_in 28 Oct 2019 02:10:39 >> -0000 >> @@ -5,12 +5,12 @@ >> system(sprintf "sed -e 's|%x|%x|g' < $ldscript > $temp", $origbase, >> $notebase); >> >> -my $cmd = sprintf "$cc -static -nopie -Wl,-Ttext=0x%x -Wl,-T,$temp", >> $textbase; >> -+my $cmd = sprintf "$cc -static -nopie -Wl,--strip-all -Wl,-zwxneeded >> -Wl,-Ttext=0x%x -Wl,-T,$temp", $textbase; >> +# XXX The '-s' option was not specified when executing the install command. >> +# Instead '--strip-all' is now executed at link time. >> +# strip command rewrite offset and align in ELF file. Therefor, when >> valgrind >> +# launch memcheck-amd64-openbsd, an Abort trap occurs in the execvp() >> system >> +# call. >> ++my $cmd = sprintf "$cc -static -nopie -Wl,--strip-all -Wl,-Ttext=0x%x >> -Wl,-T,$temp", $textbase; >> >> # Add the rest of the parameters >> foreach my $n (2 .. $#ARGV) { >> Index: patches/patch-coregrind_m_aspacemgr_aspacemgr-linux_c >> =================================================================== >> RCS file: >> /cvs/ports/devel/valgrind/patches/patch-coregrind_m_aspacemgr_aspacemgr-linux_c,v >> retrieving revision 1.1 >> diff -u -p -r1.1 patch-coregrind_m_aspacemgr_aspacemgr-linux_c >> --- patches/patch-coregrind_m_aspacemgr_aspacemgr-linux_c 2 Oct 2019 >> 17:19:29 -0000 1.1 >> +++ patches/patch-coregrind_m_aspacemgr_aspacemgr-linux_c 28 Oct 2019 >> 02:10:39 -0000 >> @@ -1,5 +1,17 @@ >> --- coregrind/m_aspacemgr/aspacemgr-linux.c.orig >> +++ coregrind/m_aspacemgr/aspacemgr-linux.c >> +@@ -2498,7 +2498,11 @@ >> + a client request to call the outer VG_(am_get_advisory). */ >> + sres = VG_(am_do_mmap_NO_NOTIFY)( >> + advised, length, >> ++#if defined(__OpenBSD__) >> ++ VKI_PROT_READ|VKI_PROT_WRITE, >> ++#else >> + VKI_PROT_READ|VKI_PROT_WRITE|VKI_PROT_EXEC, >> ++#endif >> + VKI_MAP_FIXED|VKI_MAP_PRIVATE|VKI_MAP_ANONYMOUS, >> + VM_TAG_VALGRIND, 0 >> + ); >> @@ -2543,6 +2543,54 @@ SysRes VG_(am_mmap_anon_float_valgrind)( SizeT >> length ) >> return sres; >> } >> @@ -30,7 +42,7 @@ >> + any resulting failure immediately. */ >> + sres = VG_(am_do_mmap_NO_NOTIFY)( >> + advised, length, >> -+ VKI_PROT_READ|VKI_PROT_WRITE|VKI_PROT_EXEC, >> ++ VKI_PROT_READ|VKI_PROT_WRITE, >> + VKI_MAP_PRIVATE|VKI_MAP_ANONYMOUS|VKI_MAP_STACK, >> + VM_TAG_VALGRIND, 0 >> + ); >> Index: patches/patch-coregrind_m_initimg_initimg-openbsd_c >> =================================================================== >> RCS file: >> /cvs/ports/devel/valgrind/patches/patch-coregrind_m_initimg_initimg-openbsd_c,v >> retrieving revision 1.1 >> diff -u -p -r1.1 patch-coregrind_m_initimg_initimg-openbsd_c >> --- patches/patch-coregrind_m_initimg_initimg-openbsd_c 4 Feb 2019 >> 23:34:10 -0000 1.1 >> +++ patches/patch-coregrind_m_initimg_initimg-openbsd_c 28 Oct 2019 >> 02:10:39 -0000 >> @@ -12,3 +12,21 @@ Index: coregrind/m_initimg/initimg-openb >> /* --- !!! --- EXTERNAL HEADERS end --- !!! --- */ >> >> >> +@@ -575,7 +575,7 @@ >> + res = VG_(am_mmap_anon_fixed_client)( >> + anon_start -inner_HACK, >> + anon_size +inner_HACK, >> +- VKI_PROT_READ|VKI_PROT_WRITE|VKI_PROT_EXEC >> ++ VKI_PROT_READ|VKI_PROT_WRITE >> + ); >> + } >> + if ((!ok) || sr_isError(res)) { >> +@@ -758,7 +758,7 @@ >> + sres = VG_(am_mmap_anon_fixed_client)( >> + anon_start, >> + anon_size, >> +- VKI_PROT_READ|VKI_PROT_WRITE|VKI_PROT_EXEC >> ++ VKI_PROT_READ|VKI_PROT_WRITE >> + ); >> + vg_assert(!sr_isError(sres)); >> + vg_assert(sr_Res(sres) == anon_start); >> Index: patches/patch-coregrind_m_mallocfree_c >> =================================================================== >> RCS file: patches/patch-coregrind_m_mallocfree_c >> diff -N patches/patch-coregrind_m_mallocfree_c >> --- /dev/null 1 Jan 1970 00:00:00 -0000 >> +++ patches/patch-coregrind_m_mallocfree_c 28 Oct 2019 02:10:39 -0000 >> @@ -0,0 +1,14 @@ >> +--- coregrind/m_mallocfree.c.orig >> ++++ coregrind/m_mallocfree.c >> +@@ -854,7 +854,11 @@ >> + if (a->clientmem) { >> + // client allocation -- return 0 to client if it fails >> + sres = VG_(am_mmap_anon_float_client) >> ++#if defined(__OpenBSD__) >> ++ ( cszB, VKI_PROT_READ|VKI_PROT_WRITE ); >> ++#else >> + ( cszB, VKI_PROT_READ|VKI_PROT_WRITE|VKI_PROT_EXEC ); >> ++#endif >> + if (sr_isError(sres)) >> + return 0; >> + sb = (Superblock*)(AddrH)sr_Res(sres); >> Index: patches/patch-coregrind_m_scheduler_scheduler_c >> =================================================================== >> RCS file: >> /cvs/ports/devel/valgrind/patches/patch-coregrind_m_scheduler_scheduler_c,v >> retrieving revision 1.1 >> diff -u -p -r1.1 patch-coregrind_m_scheduler_scheduler_c >> --- patches/patch-coregrind_m_scheduler_scheduler_c 2 Oct 2019 17:19:29 >> -0000 1.1 >> +++ patches/patch-coregrind_m_scheduler_scheduler_c 28 Oct 2019 02:10:39 >> -0000 >> @@ -1,74 +0,0 @@ >> ---- coregrind/m_scheduler/scheduler.c.orig >> -+++ coregrind/m_scheduler/scheduler.c >> -@@ -854,6 +854,9 @@ void run_thread_for_a_while ( /*OUT*/HWord* two_words, >> - volatile ThreadState* tst = NULL; /* stop gcc complaining */ >> - volatile Int done_this_time = 0; >> - volatile HWord host_code_addr = 0; >> -+#if defined(__OpenBSD__) >> -+ volatile UInt host_code_len = 0; >> -+#endif >> - >> - /* Paranoia */ >> - vg_assert(VG_(is_valid_tid)(tid)); >> -@@ -879,8 +882,15 @@ void run_thread_for_a_while ( /*OUT*/HWord* two_words, >> - } else { >> - /* normal case -- redir translation */ >> - UInt cno = (UInt)VG_TT_FAST_HASH((Addr)tst->arch.vex.VG_INSTR_PTR); >> -+#if defined(__OpenBSD__) >> -+ if (LIKELY(VG_(tt_fast)[cno].guest == >> (Addr)tst->arch.vex.VG_INSTR_PTR)) { >> -+ host_code_addr = VG_(tt_fast)[cno].host; >> -+ host_code_len = VG_(tt_fast)[cno].len; >> -+ } >> -+#else >> - if (LIKELY(VG_(tt_fast)[cno].guest == >> (Addr)tst->arch.vex.VG_INSTR_PTR)) >> - host_code_addr = VG_(tt_fast)[cno].host; >> -+#endif >> - else { >> - AddrH res = 0; >> - /* not found in VG_(tt_fast). Searching here the transtab >> -@@ -932,6 +942,22 @@ void run_thread_for_a_while ( /*OUT*/HWord* two_words, >> - vg_assert(VG_(in_generated_code) == False); >> - VG_(in_generated_code) = True; >> - >> -+#if defined(__OpenBSD__) >> -+ if (host_code_len > 0) { >> -+ SysRes sres; >> -+ >> -+ /* Protect the guard areas. */ >> -+ sres = VG_(am_do_mprotect_NO_NOTIFY)( >> -+ host_code_addr, host_code_len, >> -+ VKI_PROT_READ | VKI_PROT_EXEC >> -+ ); >> -+ if (sr_isError(sres)) { >> -+ VG_(printf)("valgrind: m_ume.c: mprotect failed\n"); >> -+ vg_assert(0); >> -+ } >> -+ } >> -+#endif >> -+ >> - SCHEDSETJMP( >> - tid, >> - jumped, >> -@@ -942,6 +968,22 @@ void run_thread_for_a_while ( /*OUT*/HWord* two_words, >> - ) >> - ); >> - >> -+#if defined(__OpenBSD__) >> -+ if (host_code_len > 0) { >> -+ SysRes sres; >> -+ >> -+ /* Protect the guard areas. */ >> -+ sres = VG_(am_do_mprotect_NO_NOTIFY)( >> -+ host_code_addr, host_code_len, >> -+ VKI_PROT_READ | VKI_PROT_WRITE | VKI_PROT_EXEC >> -+ ); >> -+ if (sr_isError(sres)) { >> -+ VG_(printf)("valgrind: m_ume.c: mprotect failed\n"); >> -+ vg_assert(0); >> -+ } >> -+ } >> -+#endif >> -+ >> - vg_assert(VG_(in_generated_code) == True); >> - VG_(in_generated_code) = False; >> - >> Index: patches/patch-coregrind_m_transtab_c >> =================================================================== >> RCS file: /cvs/ports/devel/valgrind/patches/patch-coregrind_m_transtab_c,v >> retrieving revision 1.1 >> diff -u -p -r1.1 patch-coregrind_m_transtab_c >> --- patches/patch-coregrind_m_transtab_c 2 Oct 2019 17:19:29 -0000 >> 1.1 >> +++ patches/patch-coregrind_m_transtab_c 28 Oct 2019 02:10:39 -0000 >> @@ -1,60 +1,95 @@ >> --- coregrind/m_transtab.c.orig Wed Nov 26 04:41:21 2014 >> +++ coregrind/m_transtab.c Mon Dec 10 17:05:02 2018 >> -@@ -1322,11 +1321,18 @@ >> - return k32 % N_TTES_PER_SECTOR; >> - } >> +@@ -749,6 +749,10 @@ >> + /* Get the CPU info established at startup. */ >> + VexArch arch_host = VexArch_INVALID; >> + VexArchInfo archinfo_host; >> ++#if defined(__OpenBSD__) >> ++ UInt len; >> ++ SysRes sres; >> ++#endif >> + VG_(bzero_inline)(&archinfo_host, sizeof(archinfo_host)); >> + VG_(machine_get_VexArchInfo)( &arch_host, &archinfo_host ); >> + VexEndness endness_host = archinfo_host.endness; >> +@@ -789,6 +793,18 @@ >> + >> + TTEntry* from_tte = index_tte(from_sNo, from_tteNo); >> >> +#if defined(__OpenBSD__) >> -+static void setFastCacheEntry ( Addr64 key, ULong* tcptr, UInt len ) >> -+#else >> - static void setFastCacheEntry ( Addr64 key, ULong* tcptr ) >> -+#endif >> - { >> - UInt cno = (UInt)VG_TT_FAST_HASH(key); >> - VG_(tt_fast)[cno].guest = (Addr)key; >> - VG_(tt_fast)[cno].host = (Addr)tcptr; >> -+#if defined(__OpenBSD__) >> -+ VG_(tt_fast)[cno].len = (Addr)len; >> -+#endif >> - n_fast_updates++; >> - /* This shouldn't fail. It should be assured by m_translate >> - which should reject any attempt to make translation of code >> -@@ -1670,7 +1676,11 @@ >> - } >> ++ /* Protect the host code areas. */ >> ++ len = (Long)sectors[to_sNo].tc_next - (Long)host_code; >> ++ sres = VG_(am_do_mprotect_NO_NOTIFY)( >> ++ (Addr)sectors[to_sNo].tc, 8 * tc_sector_szQ, VKI_PROT_READ | >> VKI_PROT_WRITE >> ++ ); >> ++ if (sr_isError(sres)) { >> ++ VG_(printf)("valgrind: m_ume.c: mprotect failed\n"); >> ++ vg_assert(0); >> ++ } >> ++#endif >> ++ >> + /* Get VEX to do the patching itself. We have to hand it off >> + since it is host-dependent. */ >> + VexInvalRange vir >> +@@ -802,6 +818,17 @@ >> + ); >> + VG_(invalidate_icache)( (void*)vir.start, vir.len ); >> >> - /* Update the fast-cache. */ >> +#if defined(__OpenBSD__) >> -+ setFastCacheEntry( entry, tcptr, code_len ); >> -+#else >> - setFastCacheEntry( entry, tcptr ); >> ++ /* Protect the host code areas. */ >> ++ sres = VG_(am_do_mprotect_NO_NOTIFY)( >> ++ (Addr)sectors[to_sNo].tc, 8 * tc_sector_szQ, VKI_PROT_READ | >> VKI_PROT_EXEC >> ++ ); >> ++ if (sr_isError(sres)) { >> ++ VG_(printf)("valgrind: m_ume.c: mprotect failed\n"); >> ++ vg_assert(0); >> ++ } >> ++#endif >> ++ >> + /* Now do the tricky bit -- update the ch_succs and ch_preds info >> + for the two translations involved, so we can undo the chaining >> + later, which we will have to do if the to_ block gets removed >> +@@ -1530,6 +1550,9 @@ >> + ULong *tcptr, *tcptr2; >> + UChar* srcP; >> + UChar* dstP; >> ++#if defined(__OpenBSD__) >> ++ SysRes sres; >> +#endif >> >> - /* Note the eclass numbers for this translation. */ >> - upd_eclasses_after_add( §ors[y], i ); >> -@@ -1712,8 +1722,13 @@ >> - && sectors[sno].tt[k].entry == guest_addr) { >> - /* found it */ >> - if (upd_cache) >> -+#if defined(__OpenBSD__) >> -+ setFastCacheEntry( >> -+ guest_addr, sectors[sno].tt[k].tcptr, 0 ); >> -+#else >> - setFastCacheEntry( >> - guest_addr, sectors[sno].tt[k].tcptr ); >> -+#endif >> - if (res_hcode) >> - *res_hcode = (AddrH)sectors[sno].tt[k].tcptr; >> - if (res_sNo) >> -@@ -2204,7 +2219,12 @@ >> - vg_assert(sizeof(Addr64) == 8); >> - /* check fast cache entries really are 2 words long */ >> - vg_assert(sizeof(Addr) == sizeof(void*)); >> -+#if defined(__OpenBSD__) >> -+ vg_assert(sizeof(FastCacheEntry) == >> -+ (2 * sizeof(Addr) + (2 * sizeof (UInt)))); >> -+#else >> - vg_assert(sizeof(FastCacheEntry) == 2 * sizeof(Addr)); >> -+#endif >> - /* check fast cache entries are packed back-to-back with no spaces */ >> - vg_assert(sizeof( VG_(tt_fast) ) == VG_TT_FAST_SIZE * >> sizeof(FastCacheEntry)); >> - /* check fast cache is aligned as we requested. Not fatal if it >> + vg_assert(init_done); >> + vg_assert(vge->n_used >= 1 && vge->n_used <= 3); >> +@@ -1629,12 +1629,34 @@ >> + tcptr = sectors[y].tc_next; >> + vg_assert(tcptr >= §ors[y].tc[0]); >> + vg_assert(tcptr <= §ors[y].tc[tc_sector_szQ]); >> ++ >> ++#if defined(__OpenBSD__) >> ++ /* Protect the host code areas. */ >> ++ sres = VG_(am_do_mprotect_NO_NOTIFY)( >> ++ (Addr)sectors[y].tc, 8 * tc_sector_szQ, VKI_PROT_READ | >> VKI_PROT_WRITE >> ++ ); >> ++ if (sr_isError(sres)) { >> ++ VG_(printf)("valgrind: m_ume.c: mprotect failed\n"); >> ++ vg_assert(0); >> ++ } >> ++#endif >> + >> + dstP = (UChar*)tcptr; >> + srcP = (UChar*)code; >> + VG_(memcpy)(dstP, srcP, code_len); >> + sectors[y].tc_next += reqdQ; >> + sectors[y].tt_n_inuse++; >> ++ >> ++#if defined(__OpenBSD__) >> ++ /* Protect the host code areas. */ >> ++ sres = VG_(am_do_mprotect_NO_NOTIFY)( >> ++ (Addr)sectors[y].tc, 8 * tc_sector_szQ, VKI_PROT_READ | VKI_PROT_EXEC >> ++ ); >> ++ if (sr_isError(sres)) { >> ++ VG_(printf)("valgrind: m_ume.c: mprotect failed\n"); >> ++ vg_assert(0); >> ++ } >> ++#endif >> + >> + /* more paranoia */ >> + tcptr2 = sectors[y].tc_next; >> Index: patches/patch-coregrind_pub_core_transtab_h >> =================================================================== >> RCS file: >> /cvs/ports/devel/valgrind/patches/patch-coregrind_pub_core_transtab_h,v >> retrieving revision 1.1 >> diff -u -p -r1.1 patch-coregrind_pub_core_transtab_h >> --- patches/patch-coregrind_pub_core_transtab_h 2 Oct 2019 17:19:29 >> -0000 1.1 >> +++ patches/patch-coregrind_pub_core_transtab_h 28 Oct 2019 02:10:39 >> -0000 >> @@ -1,12 +0,0 @@ >> ---- coregrind/pub_core_transtab.h.orig >> -+++ coregrind/pub_core_transtab.h >> -@@ -45,6 +45,9 @@ typedef >> - struct { >> - Addr guest; >> - Addr host; >> -+#if defined(__OpenBSD__) >> -+ UInt len; >> -+#endif >> - } >> - FastCacheEntry; >> - >>