Hello,

I made patch for print symbold of ld.so, if error was occured as
below:


Before apply this patch:
$ valgrind ./a.out
==62211== Memcheck, a memory error detector
==62211== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et
al.
==62211== Using Valgrind-3.10.1 and LibVEX; rerun with -h for
copyright info
==62211== Command: ./a.out
==62211== 
==62211== Invalid write of size 1
==62211==    at 0x4108E72: ???
==62211==    by 0x4108374: ???
==62211==    by 0x41096FA: ???
==62211==    by 0x4102D4E: ???
==62211==    by 0x4103986: ???
==62211==    by 0x4104535: ???
==62211==  Address 0x40052a0 is not stack'd, malloc'd or (recently) free'd
==62211== 

</snip>


After apply this patch:
$ valgrind ./a.out
==81691== Memcheck, a memory error detector
==81691== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et
al.
==81691== Using Valgrind-3.10.1 and LibVEX; rerun with -h for
copyright info
==81691== Command: ./a.out
==81691== 
==81691== Invalid write of size 1
==81691==    at 0x4108E72: chacha_encrypt_bytes (chacha_private.h:191)
==81691==    by 0x4108374: _dl_arc4randombuf (util.c:98)
==81691==    by 0x41096FA: rbytes_init (malloc.c:187)
==81691==    by 0x4102D4E: _dl_malloc_init (in /usr/libexec/ld.so)
==81691==    by 0x4103986: _dl_boot (in /usr/libexec/ld.so)
==81691==    by 0x4104535: _dl_start (in /usr/libexec/ld.so)
==81691==  Address 0x40053e0 is not stack'd, malloc'd or (recently) free'd
==81691== 

</snip>

Regards

Index: Makefile
===================================================================
RCS file: /cvs/ports/devel/valgrind/Makefile,v
retrieving revision 1.23
diff -u -p -r1.23 Makefile
--- Makefile    23 Dec 2019 23:26:32 -0000      1.23
+++ Makefile    3 Apr 2020 03:12:38 -0000
@@ -7,7 +7,7 @@ CATEGORIES =            devel
 
 V =                    3.10.1
 PV =                   20160331
-REVISION =             16
+REVISION =             17
 DISTNAME =             valgrind-${V}
 EXTRACT_SUFX =         .tar.bz2
 
Index: patches/patch-coregrind_m_libcfile_c
===================================================================
RCS file: patches/patch-coregrind_m_libcfile_c
diff -N patches/patch-coregrind_m_libcfile_c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-coregrind_m_libcfile_c        3 Apr 2020 03:12:38 -0000
@@ -0,0 +1,129 @@
+--- coregrind/m_libcfile.c
++++ coregrind/m_libcfile.c
+@@ -40,6 +40,9 @@
+ #include "pub_core_xarray.h"
+ #include "pub_core_clientstate.h"   // VG_(fd_hard_limit)
+ #include "pub_core_syscall.h"
++#if defined(VGO_openbsd)
++#include "pub_core_mallocfree.h"
++#endif
+ 
+ /* IMPORTANT: on Darwin it is essential to use the _nocancel versions
+    of syscalls rather than the vanilla version, if a _nocancel version
+@@ -165,6 +168,90 @@
+ }
+ #endif
+ 
++#if defined(VGO_openbsd)
++/* ---------------------------------------------------------------------
++   File-descriptor tracking
++   ------------------------------------------------------------------ */
++
++/* One of these is allocated for each open file descriptor.  */
++typedef struct OpenFd
++{
++   Int fd;                        /* The file descriptor */
++   HChar *pathname;               /* NULL if not a regular file or unknown */
++   struct OpenFd *next, *prev;
++} OpenFd;
++
++/* List of allocated file descriptors. */
++static OpenFd *opened_fds = NULL;
++
++/* Note the fact that a file descriptor was just closed. */
++static
++void delete_fd(Int fd)
++{
++   OpenFd *i = opened_fds;
++
++   while(i) {
++      if(i->fd == fd) {
++         if(i->prev)
++            i->prev->next = i->next;
++         else
++            opened_fds = i->next;
++         if(i->next)
++            i->next->prev = i->prev;
++         if(i->pathname)
++            VG_(arena_free) (VG_AR_CORE, i->pathname);
++         VG_(arena_free) (VG_AR_CORE, i);
++         break;
++      }
++      i = i->next;
++   }
++}
++
++/* Note the fact that a file descriptor was just opened. */
++static
++void register_fd(Int fd, const HChar *pathname)
++{
++   OpenFd *i;
++
++   /* Check to see if this fd is already open. */
++   i = opened_fds;
++   while (i) {
++      if (i->fd == fd) {
++         if (i->pathname) VG_(arena_free)(VG_AR_CORE, i->pathname);
++         break;
++      }
++      i = i->next;
++   }
++
++   /* Not already one: allocate an OpenFd */
++   if (i == NULL) {
++      i = VG_(arena_malloc)(VG_AR_CORE, "libcfile.regfd.1", sizeof(OpenFd));
++
++      i->prev = NULL;
++      i->next = opened_fds;
++      if(opened_fds) opened_fds->prev = i;
++      opened_fds = i;
++   }
++
++   i->fd = fd;
++   i->pathname = VG_(arena_strdup)(VG_AR_CORE, "libcfile.regfd.2", pathname);
++}
++
++extern char *VG_(pathname_by_fd)(Int);
++
++char *
++VG_(pathname_by_fd)(Int fd)
++{
++   OpenFd *a;
++
++   for (a = opened_fds; a; a = a->next) {
++      if (a->fd == fd && a->pathname)
++         return a->pathname;
++   }
++   return NULL;
++}
++#endif
++
+ SysRes VG_(open) ( const HChar* pathname, Int flags, Int mode )
+ {
+ #  if defined(VGP_arm64_linux)
+@@ -174,6 +261,15 @@
+ #  elif defined(VGO_linux) || defined(VGO_freebsd) || defined(VGO_openbsd)
+    SysRes res = VG_(do_syscall3)(__NR_open,
+                                  (UWord)pathname, flags, mode);
++#    if defined(VGO_openbsd)
++   if ( !sr_isError(res) ) {
++      // Track opened files by Valgrind so that we can look up filenames for
++      // mapped vnodes via the recorded table, instead of relying on procfs
++      // or kvm.  This is possible as all executables and related files
++      // (dynamic linkder etc.) are all opened by host (Valgrind).
++      register_fd(sr_Res(res), pathname);
++   }
++#    endif
+ #  elif defined(VGO_darwin)
+    SysRes res = VG_(do_syscall3)(__NR_open_nocancel,
+                                  (UWord)pathname, flags, mode);
+@@ -198,6 +294,9 @@
+    /* Hmm.  Return value is not checked.  That's uncool. */
+ #  if defined(VGO_linux) || defined(VGO_freebsd) || defined(VGO_openbsd)
+    (void)VG_(do_syscall1)(__NR_close, fd);
++#    if defined(VGO_openbsd)
++   delete_fd(fd);
++#    endif
+ #  elif defined(VGO_darwin)
+    (void)VG_(do_syscall1)(__NR_close_nocancel, fd);
+ #  else
Index: patches/patch-coregrind_m_syswrap_priv_syswrap_generic_h
===================================================================
RCS file: patches/patch-coregrind_m_syswrap_priv_syswrap_generic_h
diff -N patches/patch-coregrind_m_syswrap_priv_syswrap_generic_h
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-coregrind_m_syswrap_priv_syswrap_generic_h    3 Apr 2020 
03:12:38 -0000
@@ -0,0 +1,11 @@
+--- coregrind/m_syswrap/priv_syswrap-generic.h
++++ coregrind/m_syswrap/priv_syswrap-generic.h
+@@ -95,8 +95,6 @@ void ML_(PRE_unknown_ioctl)(ThreadId tid, UWord request, 
UWord arg);
+ extern 
+ void ML_(POST_unknown_ioctl)(ThreadId tid, UInt res, UWord request, UWord 
arg);
+ 
+-char *VG_(pathname_by_fd)(Int fd);
+-
+ 
+ DECL_TEMPLATE(generic, sys_ni_syscall);            // * P -- unimplemented
+ DECL_TEMPLATE(generic, sys_exit);
Index: patches/patch-coregrind_m_syswrap_syswrap_generic_c
===================================================================
RCS file: 
/cvs/ports/devel/valgrind/patches/patch-coregrind_m_syswrap_syswrap_generic_c,v
retrieving revision 1.1
diff -u -p -r1.1 patch-coregrind_m_syswrap_syswrap_generic_c
--- patches/patch-coregrind_m_syswrap_syswrap_generic_c 23 Dec 2019 23:26:32 
-0000      1.1
+++ patches/patch-coregrind_m_syswrap_syswrap_generic_c 3 Apr 2020 03:12:38 
-0000
@@ -14,3 +14,25 @@
                                      arg5, arg6);
  
     /* A refinement: it may be that the kernel refused aspacem's choice
+@@ -4480,21 +4480,6 @@ PRE(sys_sethostname)
+ #undef PRE
+ #undef POST
+ 
+-#if defined(VGO_openbsd)
+-
+-char *
+-VG_(pathname_by_fd)(Int fd)
+-{
+-   OpenFd *a;
+-
+-   for (a = allocated_fds; a; a = a->next) {
+-      if (a->fd == fd && a->pathname)
+-         return a->pathname;
+-   }
+-   return NULL;
+-}
+-#endif
+-
+ #endif // defined(VGO_linux) || defined(VGO_darwin) || defined(VGO_freebsd) 
|| defined(VGO_openbsd)
+ 
+ /*--------------------------------------------------------------------*/
Index: patches/patch-coregrind_m_ume_main_c
===================================================================
RCS file: patches/patch-coregrind_m_ume_main_c
diff -N patches/patch-coregrind_m_ume_main_c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-coregrind_m_ume_main_c        3 Apr 2020 03:12:38 -0000
@@ -0,0 +1,23 @@
+--- coregrind/m_ume/main.c
++++ coregrind/m_ume/main.c
+@@ -80,20 +80,6 @@ VG_(pre_exec_check)(const HChar* exe_name, Int* out_fd, 
Bool allow_setuid)
+    }
+    fd = sr_Res(res);
+ 
+-#if defined(VGO_openbsd)
+-   extern Int VG_(fd_hard_limit);
+-   void ML_(record_fd_open_with_given_name)(ThreadId tid, Int fd, char 
*pathname);
+-
+-   // Track opened files by Valgrind so that we can look up filenames for 
mapped
+-   // vnodes via the recorded table, instead of relying on procfs or kvm.  
This is
+-   // possible as all executables and related files (dynamic linkder etc.) 
are all
+-   // opened by host (Valgrind).
+-   VG_(fd_hard_limit) = 10;
+-   ML_(record_fd_open_with_given_name)(-1, fd, exe_name);
+-   ML_(mark_fd_as_internal)(-1, fd);
+-   VG_(fd_hard_limit) = -1;
+-#endif
+-
+    // Check we have execute permissions
+    ret = VG_(check_executable)(&is_setuid, exe_name, allow_setuid);
+    if (0 != ret) {
--
ASOU Masato

Reply via email to