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