From: Paul Floyd Date: Sat, 21 Jan 2023 19:46:24 +0000 (+0100) Subject: FreeBSD: Fix auxv AT_EXECPATH X-Git-Tag: VALGRIND_3_21_0~212 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a526bbd05119b84e493856a27812412a20e77499;p=thirdparty%2Fvalgrind.git FreeBSD: Fix auxv AT_EXECPATH This was being copied from the host. Now it's synthesized for the guest. Also improve the none/freebsd/auxv test to print a few of the strings in auxv (but not the envp ones). --- diff --git a/coregrind/m_initimg/initimg-freebsd.c b/coregrind/m_initimg/initimg-freebsd.c index ad5452ed28..22c210cdeb 100644 --- a/coregrind/m_initimg/initimg-freebsd.c +++ b/coregrind/m_initimg/initimg-freebsd.c @@ -410,6 +410,10 @@ Addr setup_client_stack( void* init_sp, vg_assert(VG_IS_PAGE_ALIGNED(clstack_end+1)); vg_assert( VG_(args_for_client) ); + const HChar *exe_name = VG_(find_executable)(VG_(args_the_exename)); + HChar resolved_name[VKI_PATH_MAX]; + VG_(realpath)(exe_name, resolved_name); + /* use our own auxv as a prototype */ orig_auxv = find_auxv(init_sp); @@ -459,8 +463,7 @@ Addr setup_client_stack( void* init_sp, auxsize += sizeof(*cauxv); switch(cauxv->a_type) { case VKI_AT_EXECPATH: - // @todo PJF this is wrong this will be the name of the execed tool - stringsize += VG_(strlen)(cauxv->u.a_ptr) + 1; + stringsize += VG_(strlen)(resolved_name) + 1; break; case VKI_AT_CANARYLEN: canarylen = cauxv->u.a_val; @@ -686,8 +689,7 @@ Addr setup_client_stack( void* init_sp, break; case VKI_AT_EXECPATH: - // @todo PJF this is wrong this will be the name of the execed tool - auxv->u.a_ptr = copy_str(&strtab, orig_auxv->u.a_ptr); + auxv->u.a_ptr = copy_str(&strtab, resolved_name); break; case VKI_AT_CANARY: if (canarylen >= 1) { diff --git a/coregrind/m_libcfile.c b/coregrind/m_libcfile.c index 65ed4aa486..84de11a5c8 100644 --- a/coregrind/m_libcfile.c +++ b/coregrind/m_libcfile.c @@ -1761,7 +1761,6 @@ const HChar *VG_(dirname)(const HChar *path) } #if defined(VGO_freebsd) -#if (FREEBSD_VERS >= FREEBSD_13_0) /* * I did look at nicking this from FreeBSD, it's fairly easy to port * but I was put off by the copyright and 3-clause licence @@ -1777,9 +1776,38 @@ Bool VG_(realpath)(const HChar *path, HChar *resolved) { vg_assert(path); vg_assert(resolved); +#if (FREEBSD_VERS >= FREEBSD_13_0) return !sr_isError(VG_(do_syscall5)(__NR___realpathat, VKI_AT_FDCWD, (RegWord)path, (RegWord)resolved, VKI_PATH_MAX, 0)); -} +#else + // poor man's realpath + const HChar *resolved_name; + HChar tmp[VKI_PATH_MAX]; + + struct vg_stat statbuf; + SysRes res = VG_(lstat)(exe_name, &statbuf); + + if (sr_isError(res)) { + return False; + } else if (VKI_S_ISLNK(statbuf.mode)) { + SizeT link_len = VG_(readlink)(exe_name, tmp, VKI_PATH_MAX); + tmp[link_len] = '\0'; + resolved_name = tmp; + } else { + // not a link + resolved_name = exe_name; + } + + if (resolved_name[0] != '/') { + // relative path + if (resolved_name[0] == '.' && resolved_name[1] == '/') { + resolved_name += 2; + } + VG_(snprintf)(out, *len, "%s/%s", VG_(get_startup_wd)(), resolved_name); + } else { + VG_(snprintf)(out, *len, "%s", resolved_name); + } #endif +} #endif diff --git a/coregrind/m_syswrap/syswrap-freebsd.c b/coregrind/m_syswrap/syswrap-freebsd.c index b06dbe7e2b..129df533df 100644 --- a/coregrind/m_syswrap/syswrap-freebsd.c +++ b/coregrind/m_syswrap/syswrap-freebsd.c @@ -1944,39 +1944,12 @@ static Bool sysctl_kern_proc_pathname(HChar *out, SizeT *len) // is this stashed somewhere? const HChar *exe_name = VG_(find_executable)(VG_(args_the_exename)); -#if (FREEBSD_VERS >= FREEBSD_13_0) - return VG_(realpath)(exe_name, out); -#else - // poor man's realpath - const HChar *resolved_name; - HChar tmp[VKI_PATH_MAX]; - - struct vg_stat statbuf; - SysRes res = VG_(lstat)(exe_name, &statbuf); - - if (sr_isError(res)) { + if (!VG_(realpath)(exe_name, out)) { return False; - } else if (VKI_S_ISLNK(statbuf.mode)) { - SizeT link_len = VG_(readlink)(exe_name, tmp, VKI_PATH_MAX); - tmp[link_len] = '\0'; - resolved_name = tmp; - } else { - // not a link - resolved_name = exe_name; } - if (resolved_name[0] != '/') { - // relative path - if (resolved_name[0] == '.' && resolved_name[1] == '/') { - resolved_name += 2; - } - VG_(snprintf)(out, *len, "%s/%s", VG_(get_startup_wd)(), resolved_name); - } else { - VG_(snprintf)(out, *len, "%s", resolved_name); - } *len = VG_(strlen)(out)+1; return True; -#endif } // SYS___sysctl 202 diff --git a/coregrind/pub_core_libcfile.h b/coregrind/pub_core_libcfile.h index af1176ca92..dc243bf7fe 100644 --- a/coregrind/pub_core_libcfile.h +++ b/coregrind/pub_core_libcfile.h @@ -111,10 +111,8 @@ extern Int VG_(mkstemp) ( const HChar* part_of_name, /*OUT*/HChar* fullname ); extern void VG_(record_startup_wd) ( void ); #if defined(VGO_freebsd) -#if (FREEBSD_VERS >= FREEBSD_13_0) extern Bool VG_(realpath)(const HChar *path, HChar *resolved); #endif -#endif #endif // __PUB_CORE_LIBCFILE_H diff --git a/none/tests/freebsd/Makefile.am b/none/tests/freebsd/Makefile.am index 030af12d20..5fe5de3627 100644 --- a/none/tests/freebsd/Makefile.am +++ b/none/tests/freebsd/Makefile.am @@ -1,7 +1,8 @@ include $(top_srcdir)/Makefile.tool-tests.am -dist_noinst_SCRIPTS = filter_stderr test.sh filter_452275 +dist_noinst_SCRIPTS = filter_stderr test.sh filter_452275 filter_auxv + EXTRA_DIST = \ auxv.vgtest \ auxv.stderr.exp \ diff --git a/none/tests/freebsd/auxv.c b/none/tests/freebsd/auxv.c index 49911deaed..ae26d4b5de 100644 --- a/none/tests/freebsd/auxv.c +++ b/none/tests/freebsd/auxv.c @@ -1,5 +1,6 @@ #include #include +#include #include "../../../config.h" /* /usr/include/x86/elf.h AT_* defs */ @@ -71,5 +72,38 @@ int main(int argc, char* argv[], char* envp[]) { aux_str = &aux_map[auxp->a_type]; fprintf(stderr, "val: %s int: %02d ptr: 0x%lx\n", aux_str->str_val, aux_str->type, auxp->a_un.a_val); + switch ( aux_str->type) + { + case AT_EXECPATH: + if (auxp->a_un.a_val != 0) + { + fprintf(stderr, "EXECPATH: %s\n", (char*)auxp->a_un.a_val); + } + break; + case AT_ARGV: + if (auxp->a_un.a_val != 0) + { + fprintf(stderr, "ARGV: %s\n", *(char**)auxp->a_un.a_val); + } + break; + case AT_ENVV: + if (auxp->a_un.a_val != 0) + { + /* can't leave this in regtest don't know what it + * will be */ + /*fprintf(stderr, "ENVV: %s\n", *(char**)auxp->a_un.a_val);*/ + } + break; + case AT_PS_STRINGS: + if (auxp->a_un.a_val != 0) + { + struct ps_strings *ppss = (struct ps_strings*)auxp->a_un.a_val; + fprintf(stderr, "PS_STRINGS ARGV: %s\n", *ppss->ps_argvstr); + /* can't leave this in regtest don't know what it + * will be */ + /*fprintf(stderr, "PS_STRINGS ENVV: %s\n", *ppss->ps_envstr);*/ + } + break; + } } } diff --git a/none/tests/freebsd/auxv.stderr.exp b/none/tests/freebsd/auxv.stderr.exp index 6c45cf0c4e..e106f06af8 100644 --- a/none/tests/freebsd/auxv.stderr.exp +++ b/none/tests/freebsd/auxv.stderr.exp @@ -7,6 +7,7 @@ val: AT_ENTRY int: 09 ptr: 0x........ val: AT_BASE int: 07 ptr: 0x........ val: AT_EHDRFLAGS int: 24 ptr: 0x........ val: AT_EXECPATH int: 15 ptr: 0x........ +EXECPATH: BASEDIR/valgrind/none/tests/freebsd/auxv val: AT_OSRELDATE int: 18 ptr: 0x........ val: AT_CANARY int: 16 ptr: 0x........ val: AT_CANARYLEN int: 17 ptr: 0x........ diff --git a/none/tests/freebsd/auxv.stderr.exp-freebsd13 b/none/tests/freebsd/auxv.stderr.exp-freebsd13 index b4a0a68601..1740ed9b47 100644 --- a/none/tests/freebsd/auxv.stderr.exp-freebsd13 +++ b/none/tests/freebsd/auxv.stderr.exp-freebsd13 @@ -7,6 +7,7 @@ val: AT_ENTRY int: 09 ptr: 0x........ val: AT_BASE int: 07 ptr: 0x........ val: AT_EHDRFLAGS int: 24 ptr: 0x........ val: AT_EXECPATH int: 15 ptr: 0x........ +EXECPATH: BASEDIR/valgrind/none/tests/freebsd/auxv val: AT_OSRELDATE int: 18 ptr: 0x........ val: AT_CANARY int: 16 ptr: 0x........ val: AT_CANARYLEN int: 17 ptr: 0x........ @@ -18,6 +19,8 @@ val: AT_STACKPROT int: 23 ptr: 0x........ val: AT_IGNORE int: 01 ptr: 0x........ val: AT_ARGC int: 28 ptr: 0x........ val: AT_ARGV int: 29 ptr: 0x........ +ARGV: ./auxv val: AT_ENVC int: 30 ptr: 0x........ val: AT_ENVV int: 31 ptr: 0x........ val: AT_PS_STRINGS int: 32 ptr: 0x........ +PS_STRINGS ARGV: ./auxv diff --git a/none/tests/freebsd/auxv.stderr.exp-freebsd131 b/none/tests/freebsd/auxv.stderr.exp-freebsd131 index 2dd0b3c2df..7010bfa9c6 100644 --- a/none/tests/freebsd/auxv.stderr.exp-freebsd131 +++ b/none/tests/freebsd/auxv.stderr.exp-freebsd131 @@ -7,6 +7,7 @@ val: AT_ENTRY int: 09 ptr: 0x........ val: AT_BASE int: 07 ptr: 0x........ val: AT_EHDRFLAGS int: 24 ptr: 0x........ val: AT_EXECPATH int: 15 ptr: 0x........ +EXECPATH: BASEDIR/valgrind/none/tests/freebsd/auxv val: AT_OSRELDATE int: 18 ptr: 0x........ val: AT_CANARY int: 16 ptr: 0x........ val: AT_CANARYLEN int: 17 ptr: 0x........ @@ -18,7 +19,9 @@ val: AT_STACKPROT int: 23 ptr: 0x........ val: AT_IGNORE int: 01 ptr: 0x........ val: AT_ARGC int: 28 ptr: 0x........ val: AT_ARGV int: 29 ptr: 0x........ +ARGV: ./auxv val: AT_ENVC int: 30 ptr: 0x........ val: AT_ENVV int: 31 ptr: 0x........ val: AT_PS_STRINGS int: 32 ptr: 0x........ +PS_STRINGS ARGV: ./auxv val: AT_IGNORE int: 01 ptr: 0x........ diff --git a/none/tests/freebsd/auxv.stderr.exp-freebsd14 b/none/tests/freebsd/auxv.stderr.exp-freebsd14 index 76c6db5759..dcca09f63c 100644 --- a/none/tests/freebsd/auxv.stderr.exp-freebsd14 +++ b/none/tests/freebsd/auxv.stderr.exp-freebsd14 @@ -7,6 +7,7 @@ val: AT_ENTRY int: 09 ptr: 0x........ val: AT_BASE int: 07 ptr: 0x........ val: AT_EHDRFLAGS int: 24 ptr: 0x........ val: AT_EXECPATH int: 15 ptr: 0x........ +EXECPATH: BASEDIR/valgrind/none/tests/freebsd/auxv val: AT_OSRELDATE int: 18 ptr: 0x........ val: AT_CANARY int: 16 ptr: 0x........ val: AT_CANARYLEN int: 17 ptr: 0x........ @@ -18,9 +19,11 @@ val: AT_STACKPROT int: 23 ptr: 0x........ val: AT_IGNORE int: 01 ptr: 0x........ val: AT_ARGC int: 28 ptr: 0x........ val: AT_ARGV int: 29 ptr: 0x........ +ARGV: ./auxv val: AT_ENVC int: 30 ptr: 0x........ val: AT_ENVV int: 31 ptr: 0x........ val: AT_PS_STRINGS int: 32 ptr: 0x........ +PS_STRINGS ARGV: ./auxv val: AT_IGNORE int: 01 ptr: 0x........ val: AT_USRSTACKBASE int: 35 ptr: 0x........ val: AT_USRSTACKLIM int: 36 ptr: 0x........ diff --git a/none/tests/freebsd/auxv.vgtest b/none/tests/freebsd/auxv.vgtest index ccd7192b8a..098f301342 100644 --- a/none/tests/freebsd/auxv.vgtest +++ b/none/tests/freebsd/auxv.vgtest @@ -1,3 +1,4 @@ prog: auxv vgopts: -q +stderr_filter: filter_auxv diff --git a/none/tests/freebsd/filter_auxv b/none/tests/freebsd/filter_auxv new file mode 100755 index 0000000000..6938bf8b83 --- /dev/null +++ b/none/tests/freebsd/filter_auxv @@ -0,0 +1,6 @@ +#! /bin/sh + +./filter_stderr | + +sed 's#EXECPATH: .*/valgrind/none/tests/freebsd/auxv#EXECPATH: BASEDIR/valgrind/none/tests/freebsd/auxv#' +