From: Paul Floyd Date: Wed, 7 Jun 2023 20:27:08 +0000 (+0200) Subject: Bug 470713 - Failure on the Yosys project: valgrind: m_libcfile.c:1802 (Bool vgPlain... X-Git-Tag: VALGRIND_3_22_0~144 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=840ccb9915c675fd7db527107e6b38343fafdf86;p=thirdparty%2Fvalgrind.git Bug 470713 - Failure on the Yosys project: valgrind: m_libcfile.c:1802 (Bool vgPlain_realpath(const HChar *, HChar *)): Assertion 'resolved' failed 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. --- diff --git a/.gitignore b/.gitignore index 6d73324cea..9e16ac126d 100644 --- a/.gitignore +++ b/.gitignore @@ -1341,6 +1341,7 @@ /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 09f8c71370..4c5635dde1 100644 --- 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 diff --git a/coregrind/m_syswrap/syswrap-freebsd.c b/coregrind/m_syswrap/syswrap-freebsd.c index fd4dff4da4..6b9f3d2109 100644 --- a/coregrind/m_syswrap/syswrap-freebsd.c +++ b/coregrind/m_syswrap/syswrap-freebsd.c @@ -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; } diff --git a/memcheck/tests/freebsd/Makefile.am b/memcheck/tests/freebsd/Makefile.am index 2259e1efb8..f515a684ec 100644 --- a/memcheck/tests/freebsd/Makefile.am +++ b/memcheck/tests/freebsd/Makefile.am @@ -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 index 0000000000..67a544926a --- /dev/null +++ b/memcheck/tests/freebsd/bug470713.cpp @@ -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 +#include +#include +#include +#include +#include + +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 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 index 0000000000..e69de29bb2 diff --git a/memcheck/tests/freebsd/bug470713.stdout.exp b/memcheck/tests/freebsd/bug470713.stdout.exp new file mode 100644 index 0000000000..2ba70ed13d --- /dev/null +++ b/memcheck/tests/freebsd/bug470713.stdout.exp @@ -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 index 0000000000..b85043a5ab --- /dev/null +++ b/memcheck/tests/freebsd/bug470713.vgtest @@ -0,0 +1,3 @@ +prog: bug470713 +vgopts: -q +args: `pwd`/bug470713