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( &sectors[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 >= &sectors[y].tc[0]);
>> +    vg_assert(tcptr <= &sectors[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;
>> -
>> 

Reply via email to