]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Bug 470713 - Failure on the Yosys project: valgrind: m_libcfile.c:1802 (Bool vgPlain...
authorPaul Floyd <pjfloyd@wanadoo.fr>
Wed, 7 Jun 2023 20:27:08 +0000 (22:27 +0200)
committerPaul Floyd <pjfloyd@wanadoo.fr>
Wed, 7 Jun 2023 20:27:08 +0000 (22:27 +0200)
    When using sysctl kern proc pathname with the pid of the guest or -1
    we need to intercept the call otherwise the syscall will return the path
    of the memcheck tool and not the path of the guest.

    This uses VG_(realpath), which asserts if it doesn't get valid
    input pointers.

    sysctl kern proc pathname can use a NULL pointer in order to
    determine the length of the path (so users can allocate the minumum
    necessary). The NULL pointer was being passed on to VG_(realpath)
    without being checked, resulting in an assert.

.gitignore
NEWS
coregrind/m_syswrap/syswrap-freebsd.c
memcheck/tests/freebsd/Makefile.am
memcheck/tests/freebsd/bug470713.cpp [new file with mode: 0644]
memcheck/tests/freebsd/bug470713.stderr.exp [new file with mode: 0644]
memcheck/tests/freebsd/bug470713.stdout.exp [new file with mode: 0644]
memcheck/tests/freebsd/bug470713.vgtest [new file with mode: 0644]

index 6d73324cea4f03ee956bdf8da7bb9301dcd166e0..9e16ac126dca14c852e9baa67d9492b3163eb30a 100644 (file)
 /memcheck/tests/freebsd/452275
 /memcheck/tests/freebsd/access
 /memcheck/tests/freebsd/bug464476
+/memcheck/tests/freebsd/bug470713
 /memcheck/tests/freebsd/capsicum
 /memcheck/tests/freebsd/chflags
 /memcheck/tests/freebsd/chmod_chown
diff --git a/NEWS b/NEWS
index 09f8c713704afecd164b316363abac8c11002b94..4c5635dde11f8d3cf38a0b355cec5491f0f867f1 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -38,6 +38,8 @@ are not entered into bugzilla tend to get forgotten about or ignored.
 469146  massif --ignore-fn does not ignore inlined functions
 469768  Make it possible to install gdb scripts in a different location
 470520  Multiple realloc zero errors crash in MC_(eq_Error)
+470713  Failure on the Yosys project: valgrind: m_libcfile.c:1802
+        (Bool vgPlain_realpath(const HChar *, HChar *)): Assertion 'resolved' failed
 
 To see details of a given bug, visit
   https://bugs.kde.org/show_bug.cgi?id=XXXXXX
index fd4dff4da40fa71696ef76f1ac359662923d4958..6b9f3d2109816e57465fcfcc742bd2b9a6630029 100644 (file)
@@ -1987,6 +1987,19 @@ static Bool sysctl_kern_proc_pathname(HChar *out, SizeT *len)
 {
    const HChar *exe_name = VG_(resolved_exename);
 
+   if (!len) {
+      return False;
+   }
+
+   if (!out) {
+      HChar tmp[VKI_PATH_MAX];
+      if (!VG_(realpath)(exe_name, tmp)) {
+         return False;
+      }
+      *len = VG_(strlen)(tmp)+1;
+      return True;
+   }
+
    if (!VG_(realpath)(exe_name, out)) {
       return False;
    }
index 2259e1efb8cf98fce59089183e7c252a17c90740..f515a684ec8e1d82c2a6f1100a80c7fc532cdfc7 100644 (file)
@@ -101,6 +101,8 @@ EXTRA_DIST = \
        bug464476_rel_symlink.stderr.exp \
        bug464476_rel_symlink.stdout.exp \
         memalign.vgtest memalign.stderr.exp
+       bug470713.vgtest bug470713.stderr.exp \
+               bug470713.stdout.exp
 
 check_PROGRAMS = \
        statfs pdfork_pdkill getfsstat inlinfo inlinfo_nested.so extattr \
@@ -108,7 +110,7 @@ check_PROGRAMS = \
        linkat scalar_fork scalar_thr_exit scalar_abort2 scalar_pdfork \
        scalar_vfork stat file_locking_wait6 utimens access chmod_chown \
        misc get_set_context utimes static_allocs fexecve errno_aligned_allocs \
-       setproctitle sctp sctp2 bug464476 memalign
+       setproctitle sctp sctp2 bug464476 memalign bug470713
 
 AM_CFLAGS   += $(AM_FLAG_M3264_PRI)
 AM_CXXFLAGS += $(AM_FLAG_M3264_PRI)
@@ -122,6 +124,7 @@ inlinfo_nested_so_CFLAGS = $(AM_CFLAGS) -fPIC @FLAG_W_NO_UNINITIALIZED@
 inlinfo_nested_so_LDFLAGS = -Wl,-rpath,$(top_builddir)/memcheck/tests/freebsd -shared -fPIC
 
 bug464476_SOURCES = bug464476.cpp
+bug470713_SOURCES = bug470713.cpp
 
 if FREEBSD_VERS_13_PLUS
 check_PROGRAMS += realpathat scalar_13_plus eventfd1 eventfd2
diff --git a/memcheck/tests/freebsd/bug470713.cpp b/memcheck/tests/freebsd/bug470713.cpp
new file mode 100644 (file)
index 0000000..67a5449
--- /dev/null
@@ -0,0 +1,44 @@
+// roughly based on the code for Firefox class BinaryPath
+// https://searchfox.org/mozilla-central/source/xpcom/build/BinaryPath.h#185
+
+#include <iostream>
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#include <limits.h>
+#include <string>
+#include <memory>
+
+using std::cerr;
+using std::cout;
+using std::string;
+
+int main(int argc, char **argv)
+{
+   int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1};
+   size_t len;
+
+   if (sysctl(mib, 4, NULL, &len, NULL, 0) != 0) {
+      cout << "sysctl failed to get path length: " << strerror(errno) << '\n';
+      return -1;
+   }
+
+   std::unique_ptr<char[]> aResult(new char[len]);
+
+   if (sysctl(mib, 4, aResult.get(), &len, NULL, 0) != 0)  {
+      cout << "sysctl failed to get path: " << strerror(errno) << '\n';
+      return -1;
+   }
+
+   if (string(aResult.get()) == argv[1]) {
+      cout << "OK\n";
+   } else {
+      cout << "Not OK aResult " << aResult << " argv[1] " << argv[1] << '\n';
+   }
+
+   if (sysctl(mib, 4, NULL, NULL, NULL, 0) != -1) {
+      cout << "OK syscall failed\n";
+      return -1;
+   } else {
+      cout << "sysctl succeeded when it should have failed\n";
+   }
+}
diff --git a/memcheck/tests/freebsd/bug470713.stderr.exp b/memcheck/tests/freebsd/bug470713.stderr.exp
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/memcheck/tests/freebsd/bug470713.stdout.exp b/memcheck/tests/freebsd/bug470713.stdout.exp
new file mode 100644 (file)
index 0000000..2ba70ed
--- /dev/null
@@ -0,0 +1,2 @@
+OK
+OK syscall failed
diff --git a/memcheck/tests/freebsd/bug470713.vgtest b/memcheck/tests/freebsd/bug470713.vgtest
new file mode 100644 (file)
index 0000000..b85043a
--- /dev/null
@@ -0,0 +1,3 @@
+prog: bug470713
+vgopts: -q
+args: `pwd`/bug470713