From: Mark Wielaard Date: Sun, 22 Sep 2024 21:24:34 +0000 (+0200) Subject: Implement /proc/self/exe readlink[at] fallback in POST handler X-Git-Tag: VALGRIND_3_24_0~49 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0690dc39644d15fc89813419ffcdf9754b098260;p=thirdparty%2Fvalgrind.git Implement /proc/self/exe readlink[at] fallback in POST handler Calling the readlink[at] syscall directly from the PRE handler defeats the FUSE_COMPATIBLE_MAY_BLOCK (SfMayBlock) flag. Add a POST handler that only explicitly calls the readlink[at] handler for the /proc/self/exe fallback (this should be fine unless /proc is also implemented as fuse in this process). Adjust readlink[at] GENX_ and LINX_ syswrap macros to GENXY and LINXY. https://bugs.kde.org/show_bug.cgi?id=493507 --- diff --git a/NEWS b/NEWS index c76791aae..cbb138ac6 100644 --- a/NEWS +++ b/NEWS @@ -68,6 +68,8 @@ are not entered into bugzilla tend to get forgotten about or ignored. but not supported in valgrind 492663 Valgrind ignores debug info for some binaries 493454 Missing FUSE_COMPATIBLE_MAY_BLOCK markers +493507 direct readlink syscall from PRE handler is incompatible with + FUSE_COMPATIBLE_MAY_BLOCK To see details of a given bug, visit https://bugs.kde.org/show_bug.cgi?id=XXXXXX diff --git a/coregrind/m_syswrap/syswrap-amd64-linux.c b/coregrind/m_syswrap/syswrap-amd64-linux.c index 86a47d9c2..2230baf77 100644 --- a/coregrind/m_syswrap/syswrap-amd64-linux.c +++ b/coregrind/m_syswrap/syswrap-amd64-linux.c @@ -576,7 +576,7 @@ static SyscallTableEntry syscall_table[] = { GENX_(__NR_link, sys_link), // 86 GENX_(__NR_unlink, sys_unlink), // 87 GENX_(__NR_symlink, sys_symlink), // 88 - GENX_(__NR_readlink, sys_readlink), // 89 + GENXY(__NR_readlink, sys_readlink), // 89 GENX_(__NR_chmod, sys_chmod), // 90 GENX_(__NR_fchmod, sys_fchmod), // 91 @@ -790,7 +790,7 @@ static SyscallTableEntry syscall_table[] = { LINX_(__NR_linkat, sys_linkat), // 265 LINX_(__NR_symlinkat, sys_symlinkat), // 266 - LINX_(__NR_readlinkat, sys_readlinkat), // 267 + LINXY(__NR_readlinkat, sys_readlinkat), // 267 LINX_(__NR_fchmodat, sys_fchmodat), // 268 LINX_(__NR_faccessat, sys_faccessat), // 269 diff --git a/coregrind/m_syswrap/syswrap-arm-linux.c b/coregrind/m_syswrap/syswrap-arm-linux.c index 7b536e52c..d326fdb9e 100644 --- a/coregrind/m_syswrap/syswrap-arm-linux.c +++ b/coregrind/m_syswrap/syswrap-arm-linux.c @@ -649,7 +649,7 @@ static SyscallTableEntry syscall_main_table[] = { GENX_(__NR_symlink, sys_symlink), // 83 //zz // (__NR_oldlstat, sys_lstat), // 84 -- obsolete //zz - GENX_(__NR_readlink, sys_readlink), // 85 + GENXY(__NR_readlink, sys_readlink), // 85 //zz // (__NR_uselib, sys_uselib), // 86 */Linux //zz // (__NR_swapon, sys_swapon), // 87 */Linux //zz // (__NR_reboot, sys_reboot), // 88 */Linux @@ -939,7 +939,7 @@ static SyscallTableEntry syscall_main_table[] = { LINX_(__NR_linkat, sys_linkat), // 303 LINX_(__NR_symlinkat, sys_symlinkat), // 304 - LINX_(__NR_readlinkat, sys_readlinkat), // + LINXY(__NR_readlinkat, sys_readlinkat), // LINX_(__NR_fchmodat, sys_fchmodat), // LINX_(__NR_faccessat, sys_faccessat), // LINXY(__NR_shmat, sys_shmat), //305 diff --git a/coregrind/m_syswrap/syswrap-arm64-linux.c b/coregrind/m_syswrap/syswrap-arm64-linux.c index ccc548484..05e0e421f 100644 --- a/coregrind/m_syswrap/syswrap-arm64-linux.c +++ b/coregrind/m_syswrap/syswrap-arm64-linux.c @@ -626,7 +626,7 @@ static SyscallTableEntry syscall_main_table[] = { LINX_(__NR_vmsplice, sys_vmsplice), // 75 LINX_(__NR_splice, sys_splice), // 76 LINX_(__NR_tee, sys_tee), // 77 - LINX_(__NR_readlinkat, sys_readlinkat), // 78 + LINXY(__NR_readlinkat, sys_readlinkat), // 78 LINXY(__NR_newfstatat, sys_newfstatat), // 79 GENXY(__NR_fstat, sys_newfstat), // 80 GENX_(__NR_sync, sys_sync), // 81 diff --git a/coregrind/m_syswrap/syswrap-generic.c b/coregrind/m_syswrap/syswrap-generic.c index e4602e44a..9093b831d 100644 --- a/coregrind/m_syswrap/syswrap-generic.c +++ b/coregrind/m_syswrap/syswrap-generic.c @@ -4566,18 +4566,19 @@ POST(sys_poll) PRE(sys_readlink) { FUSE_COMPATIBLE_MAY_BLOCK(); - Word saved = SYSNO; - PRINT("sys_readlink ( %#" FMT_REGWORD "x(%s), %#" FMT_REGWORD "x, %llu )", ARG1, (char*)(Addr)ARG1, ARG2, (ULong)ARG3); PRE_REG_READ3(long, "readlink", const char *, path, char *, buf, int, bufsiz); PRE_MEM_RASCIIZ( "readlink(path)", ARG1 ); PRE_MEM_WRITE( "readlink(buf)", ARG2,ARG3 ); +} - - { +POST(sys_readlink) +{ #if defined(VGO_linux) || defined(VGO_solaris) + { + Word saved = SYSNO; #if defined(VGO_linux) #define PID_EXEPATH "/proc/%d/exe" #define SELF_EXEPATH "/proc/self/exe" @@ -4598,15 +4599,10 @@ PRE(sys_readlink) && (VG_STREQ(arg1s, name) || VG_STREQ(arg1s, SELF_EXEPATH))) { VG_(sprintf)(name, SELF_EXEFD, VG_(cl_exec_fd)); SET_STATUS_from_SysRes( VG_(do_syscall3)(saved, (UWord)name, - ARG2, ARG3)); - } else -#endif - { - /* Normal case */ - SET_STATUS_from_SysRes( VG_(do_syscall3)(saved, ARG1, ARG2, ARG3)); + ARG2, ARG3)); } } - +#endif if (SUCCESS && RES > 0) POST_MEM_WRITE( ARG2, RES ); } diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c index a9b82d16a..6a6b6bcb3 100644 --- a/coregrind/m_syswrap/syswrap-linux.c +++ b/coregrind/m_syswrap/syswrap-linux.c @@ -6049,17 +6049,19 @@ PRE(sys_symlinkat) PRE(sys_readlinkat) { - HChar name[30]; // large enough - Word saved = SYSNO; - FUSE_COMPATIBLE_MAY_BLOCK(); - PRINT("sys_readlinkat ( %ld, %#" FMT_REGWORD "x(%s), %#" FMT_REGWORD "x, %" FMT_REGWORD "u )", SARG1, ARG2, (HChar*)(Addr)ARG2, ARG3, ARG4); PRE_REG_READ4(long, "readlinkat", int, dfd, const char *, path, char *, buf, vki_size_t, bufsiz); PRE_MEM_RASCIIZ( "readlinkat(path)", ARG2 ); PRE_MEM_WRITE( "readlinkat(buf)", ARG3,ARG4 ); +} + +POST(sys_readlinkat) +{ + HChar name[30]; // large enough + Word saved = SYSNO; /* * Handle the case where readlinkat is looking at /proc/self/exe or @@ -6071,10 +6073,7 @@ PRE(sys_readlinkat) || VG_(strcmp)((HChar *)(Addr)ARG2, "/proc/self/exe") == 0)) { VG_(sprintf)(name, "/proc/self/fd/%d", VG_(cl_exec_fd)); SET_STATUS_from_SysRes( VG_(do_syscall4)(saved, ARG1, (UWord)name, - ARG3, ARG4)); - } else { - /* Normal case */ - SET_STATUS_from_SysRes( VG_(do_syscall4)(saved, ARG1, ARG2, ARG3, ARG4)); + ARG3, ARG4)); } if (SUCCESS && RES > 0) diff --git a/coregrind/m_syswrap/syswrap-mips32-linux.c b/coregrind/m_syswrap/syswrap-mips32-linux.c index e3498cd96..421344213 100644 --- a/coregrind/m_syswrap/syswrap-mips32-linux.c +++ b/coregrind/m_syswrap/syswrap-mips32-linux.c @@ -849,7 +849,7 @@ static SyscallTableEntry syscall_main_table[] = { //.. PLAX_(__NR_select, old_select), // 82 GENX_ (__NR_symlink, sys_symlink), // 83 //.. // (__NR_oldlstat, sys_lstat), // 84 - GENX_ (__NR_readlink, sys_readlink), // 85 + GENXY (__NR_readlink, sys_readlink), // 85 //.. // (__NR_uselib, sys_uselib), // 86 //.. // (__NR_swapon, sys_swapon), // 87 //.. // (__NR_reboot, sys_reboot), // 88 @@ -1054,7 +1054,7 @@ static SyscallTableEntry syscall_main_table[] = { LINX_ (__NR_renameat, sys_renameat), // 295 LINX_ (__NR_linkat, sys_linkat), // 296 LINX_ (__NR_symlinkat, sys_symlinkat), // 297 - LINX_ (__NR_readlinkat, sys_readlinkat), // 298 + LINXY (__NR_readlinkat, sys_readlinkat), // 298 LINX_ (__NR_fchmodat, sys_fchmodat), // 299 LINX_ (__NR_faccessat, sys_faccessat), // 300 LINXY (__NR_pselect6, sys_pselect6), // 301 diff --git a/coregrind/m_syswrap/syswrap-mips64-linux.c b/coregrind/m_syswrap/syswrap-mips64-linux.c index b07b7da45..e9bb5c54c 100644 --- a/coregrind/m_syswrap/syswrap-mips64-linux.c +++ b/coregrind/m_syswrap/syswrap-mips64-linux.c @@ -603,7 +603,7 @@ static SyscallTableEntry syscall_main_table[] = { GENX_ (__NR_link, sys_link), GENX_ (__NR_unlink, sys_unlink), GENX_ (__NR_symlink, sys_symlink), - GENX_ (__NR_readlink, sys_readlink), + GENXY (__NR_readlink, sys_readlink), GENX_ (__NR_chmod, sys_chmod), GENX_ (__NR_fchmod, sys_fchmod), GENX_ (__NR_chown, sys_chown), @@ -771,7 +771,7 @@ static SyscallTableEntry syscall_main_table[] = { LINX_ (__NR_renameat, sys_renameat), LINX_ (__NR_linkat, sys_linkat), LINX_ (__NR_symlinkat, sys_symlinkat), - LINX_ (__NR_readlinkat, sys_readlinkat), + LINXY (__NR_readlinkat, sys_readlinkat), LINX_ (__NR_fchmodat, sys_fchmodat), LINX_ (__NR_faccessat, sys_faccessat), LINXY (__NR_pselect6, sys_pselect6), diff --git a/coregrind/m_syswrap/syswrap-nanomips-linux.c b/coregrind/m_syswrap/syswrap-nanomips-linux.c index dc99f3d55..36a5c0ca0 100644 --- a/coregrind/m_syswrap/syswrap-nanomips-linux.c +++ b/coregrind/m_syswrap/syswrap-nanomips-linux.c @@ -631,7 +631,7 @@ static SyscallTableEntry syscall_main_table[] = { LINX_ (__NR_vmsplice, sys_vmsplice), LINX_ (__NR_splice, sys_splice), LINX_ (__NR_tee, sys_tee), - LINX_ (__NR_readlinkat, sys_readlinkat), + LINXY (__NR_readlinkat, sys_readlinkat), GENX_ (__NR_sync, sys_sync), GENX_ (__NR_fsync, sys_fsync), GENX_ (__NR_fdatasync, sys_fdatasync), diff --git a/coregrind/m_syswrap/syswrap-ppc32-linux.c b/coregrind/m_syswrap/syswrap-ppc32-linux.c index 74ba68564..f7a90c753 100644 --- a/coregrind/m_syswrap/syswrap-ppc32-linux.c +++ b/coregrind/m_syswrap/syswrap-ppc32-linux.c @@ -713,7 +713,7 @@ static SyscallTableEntry syscall_table[] = { GENX_(__NR_symlink, sys_symlink), // 83 //.. // (__NR_oldlstat, sys_lstat), // 84 -- obsolete //.. - GENX_(__NR_readlink, sys_readlink), // 85 + GENXY(__NR_readlink, sys_readlink), // 85 //.. // (__NR_uselib, sys_uselib), // 86 */Linux //.. // (__NR_swapon, sys_swapon), // 87 */Linux //.. // (__NR_reboot, sys_reboot), // 88 */Linux @@ -963,7 +963,7 @@ static SyscallTableEntry syscall_table[] = { LINX_(__NR_renameat, sys_renameat), // 293 LINX_(__NR_linkat, sys_linkat), // 294 LINX_(__NR_symlinkat, sys_symlinkat), // 295 - LINX_(__NR_readlinkat, sys_readlinkat), // 296 + LINXY(__NR_readlinkat, sys_readlinkat), // 296 LINX_(__NR_fchmodat, sys_fchmodat), // 297 LINX_(__NR_faccessat, sys_faccessat), // 298 LINX_(__NR_set_robust_list, sys_set_robust_list), // 299 diff --git a/coregrind/m_syswrap/syswrap-ppc64-linux.c b/coregrind/m_syswrap/syswrap-ppc64-linux.c index 4609e10df..8de95624f 100644 --- a/coregrind/m_syswrap/syswrap-ppc64-linux.c +++ b/coregrind/m_syswrap/syswrap-ppc64-linux.c @@ -702,7 +702,7 @@ static SyscallTableEntry syscall_table[] = { GENX_(__NR_symlink, sys_symlink), // 83 // _____(__NR_oldlstat, sys_oldlstat), // 84 - GENX_(__NR_readlink, sys_readlink), // 85 + GENXY(__NR_readlink, sys_readlink), // 85 // _____(__NR_uselib, sys_uselib), // 86 // _____(__NR_swapon, sys_swapon), // 87 // _____(__NR_reboot, sys_reboot), // 88 @@ -945,7 +945,7 @@ static SyscallTableEntry syscall_table[] = { LINX_(__NR_renameat, sys_renameat), // 293 LINX_(__NR_linkat, sys_linkat), // 294 LINX_(__NR_symlinkat, sys_symlinkat), // 295 - LINX_(__NR_readlinkat, sys_readlinkat), // 296 + LINXY(__NR_readlinkat, sys_readlinkat), // 296 LINX_(__NR_fchmodat, sys_fchmodat), // 297 LINX_(__NR_faccessat, sys_faccessat), // 298 LINX_(__NR_set_robust_list, sys_set_robust_list), // 299 diff --git a/coregrind/m_syswrap/syswrap-s390x-linux.c b/coregrind/m_syswrap/syswrap-s390x-linux.c index 9ed2fa468..8a1be8cbe 100644 --- a/coregrind/m_syswrap/syswrap-s390x-linux.c +++ b/coregrind/m_syswrap/syswrap-s390x-linux.c @@ -513,7 +513,7 @@ static SyscallTableEntry syscall_table[] = { GENX_(__NR_symlink, sys_symlink), // 83 GENX_(84, sys_ni_syscall), /* unimplemented (by the kernel) */ // 84 - GENX_(__NR_readlink, sys_readlink), // 85 + GENXY(__NR_readlink, sys_readlink), // 85 // ?????(__NR_uselib, ), // 86 // ?????(__NR_swapon, ), // 87 // ?????(__NR_reboot, ), // 88 @@ -768,7 +768,7 @@ static SyscallTableEntry syscall_table[] = { LINX_(__NR_renameat, sys_renameat), // 295 LINX_(__NR_linkat, sys_linkat), // 296 LINX_(__NR_symlinkat, sys_symlinkat), // 297 - LINX_(__NR_readlinkat, sys_readlinkat), // 298 + LINXY(__NR_readlinkat, sys_readlinkat), // 298 LINX_(__NR_fchmodat, sys_fchmodat), // 299 LINX_(__NR_faccessat, sys_faccessat), // 300 diff --git a/coregrind/m_syswrap/syswrap-solaris.c b/coregrind/m_syswrap/syswrap-solaris.c index b954c2cfd..dad70ef85 100644 --- a/coregrind/m_syswrap/syswrap-solaris.c +++ b/coregrind/m_syswrap/syswrap-solaris.c @@ -10905,7 +10905,7 @@ static SyscallTableEntry syscall_table[] = { #if defined(SOLARIS_OLD_SYSCALLS) SOLXY(__NR_lstat, sys_lstat), /* 88 */ GENX_(__NR_symlink, sys_symlink), /* 89 */ - GENX_(__NR_readlink, sys_readlink), /* 90 */ + GENXY(__NR_readlink, sys_readlink), /* 90 */ #endif /* SOLARIS_OLD_SYSCALLS */ GENX_(__NR_setgroups, sys_setgroups), /* 91 */ GENXY(__NR_getgroups, sys_getgroups), /* 92 */ diff --git a/coregrind/m_syswrap/syswrap-x86-linux.c b/coregrind/m_syswrap/syswrap-x86-linux.c index ea930bafe..31243a0db 100644 --- a/coregrind/m_syswrap/syswrap-x86-linux.c +++ b/coregrind/m_syswrap/syswrap-x86-linux.c @@ -1258,7 +1258,7 @@ static SyscallTableEntry syscall_table[] = { GENX_(__NR_symlink, sys_symlink), // 83 //zz // (__NR_oldlstat, sys_lstat), // 84 -- obsolete //zz - GENX_(__NR_readlink, sys_readlink), // 85 + GENXY(__NR_readlink, sys_readlink), // 85 //zz // (__NR_uselib, sys_uselib), // 86 */Linux //zz // (__NR_swapon, sys_swapon), // 87 */Linux //zz // (__NR_reboot, sys_reboot), // 88 */Linux @@ -1525,7 +1525,7 @@ static SyscallTableEntry syscall_table[] = { LINX_(__NR_linkat, sys_linkat), // 303 LINX_(__NR_symlinkat, sys_symlinkat), // 304 - LINX_(__NR_readlinkat, sys_readlinkat), // 305 + LINXY(__NR_readlinkat, sys_readlinkat), // 305 LINX_(__NR_fchmodat, sys_fchmodat), // 306 LINX_(__NR_faccessat, sys_faccessat), // 307 LINXY(__NR_pselect6, sys_pselect6), // 308