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