]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
FreeBSD: Fix auxv AT_EXECPATH
authorPaul Floyd <pjfloyd@wanadoo.fr>
Sat, 21 Jan 2023 19:46:24 +0000 (20:46 +0100)
committerPaul Floyd <pjfloyd@wanadoo.fr>
Sat, 21 Jan 2023 19:49:30 +0000 (20:49 +0100)
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).

12 files changed:
coregrind/m_initimg/initimg-freebsd.c
coregrind/m_libcfile.c
coregrind/m_syswrap/syswrap-freebsd.c
coregrind/pub_core_libcfile.h
none/tests/freebsd/Makefile.am
none/tests/freebsd/auxv.c
none/tests/freebsd/auxv.stderr.exp
none/tests/freebsd/auxv.stderr.exp-freebsd13
none/tests/freebsd/auxv.stderr.exp-freebsd131
none/tests/freebsd/auxv.stderr.exp-freebsd14
none/tests/freebsd/auxv.vgtest
none/tests/freebsd/filter_auxv [new file with mode: 0755]

index ad5452ed286d6aa0d54fae050c81d5fcc9f6bd46..22c210cdeb16d35759f94108b23555fe7cf0e313 100644 (file)
@@ -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) {
index 65ed4aa486055ab715f2594109ff6420c8ffa47b..84de11a5c877104932b97093323e0dbd272eda0a 100644 (file)
@@ -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
 
 
index b06dbe7e2b08921ad2a3b4920881584ffd18c0b6..129df533df8a7f44a82fbbbc8df42799b44d5c27 100644 (file)
@@ -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
index af1176ca92e3312eb6fbcd77ad98e50f0f1b5918..dc243bf7fe803b2e7577ad17bf86870d1cf38498 100644 (file)
@@ -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
 
index 030af12d2068d01de666c9b65e8e60027c328afb..5fe5de3627779588b3016c9bcb94e97bd26e4ad2 100644 (file)
@@ -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 \
index 49911deaed1018974d0df5f2310248b70f8bdd15..ae26d4b5de0348cb3237d9e5225dc0c706b25783 100644 (file)
@@ -1,5 +1,6 @@
 #include <stdio.h>
 #include <elf.h>
+#include <sys/exec.h>
 #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;
+        }
     }
 }
index 6c45cf0c4e2ec888d5ec59141f9f69367f4aeca1..e106f06af8a65d3c7f8e5c9f6d5991e6cc8e772f 100644 (file)
@@ -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........
index b4a0a686016f0339095eba21fb4b4dd165958429..1740ed9b4771e8a3d6aa899f68369fbce0d21d58 100644 (file)
@@ -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
index 2dd0b3c2dfeb3fae2bffc810cee739444e985792..7010bfa9c6e74100dde806a9b5c8ef554ce505b1 100644 (file)
@@ -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........
index 76c6db5759078ac58839cd2c2dbb81da17db88d6..dcca09f63cb7ae3855537bdc04f69d251673a9b6 100644 (file)
@@ -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........
index ccd7192b8a26fc99e4f75d056ab64b8fdac04682..098f301342ea42064d3dd59a9a9f608041fff84f 100644 (file)
@@ -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 (executable)
index 0000000..6938bf8
--- /dev/null
@@ -0,0 +1,6 @@
+#! /bin/sh
+
+./filter_stderr |
+
+sed 's#EXECPATH: .*/valgrind/none/tests/freebsd/auxv#EXECPATH: BASEDIR/valgrind/none/tests/freebsd/auxv#'
+