]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Implement /proc/self/exe readlink[at] fallback in POST handler
authorMark Wielaard <mark@klomp.org>
Sun, 22 Sep 2024 21:24:34 +0000 (23:24 +0200)
committerMark Wielaard <mark@klomp.org>
Sat, 5 Oct 2024 12:52:47 +0000 (14:52 +0200)
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

14 files changed:
NEWS
coregrind/m_syswrap/syswrap-amd64-linux.c
coregrind/m_syswrap/syswrap-arm-linux.c
coregrind/m_syswrap/syswrap-arm64-linux.c
coregrind/m_syswrap/syswrap-generic.c
coregrind/m_syswrap/syswrap-linux.c
coregrind/m_syswrap/syswrap-mips32-linux.c
coregrind/m_syswrap/syswrap-mips64-linux.c
coregrind/m_syswrap/syswrap-nanomips-linux.c
coregrind/m_syswrap/syswrap-ppc32-linux.c
coregrind/m_syswrap/syswrap-ppc64-linux.c
coregrind/m_syswrap/syswrap-s390x-linux.c
coregrind/m_syswrap/syswrap-solaris.c
coregrind/m_syswrap/syswrap-x86-linux.c

diff --git a/NEWS b/NEWS
index c76791aae1ab85cb9ee8284f5d3c70ffd81c1729..cbb138ac631c7e4f9bad281d4fe6ac737f3f4c7d 100644 (file)
--- 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
index 86a47d9c2811daceebfeccc8264af1cb41e33f68..2230baf772b00c902a08fee4c77fc9eb88a7a04b 100644 (file)
@@ -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
 
index 7b536e52cb2e621b94522cf4091cd3aeec16ad80..d326fdb9eeda516474ea5fa909db5dfa7f181f18 100644 (file)
@@ -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
index ccc548484b48f85096583d83f4b4c87cff1c025f..05e0e421fa6c5e3b1ebfc3afe14dbd638a398eef 100644 (file)
@@ -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
index e4602e44a80cc0c0b96c49a59b5f7e09b6502c53..9093b831d6ef9ed8fc7fbd906a2c38911f6b58ab 100644 (file)
@@ -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 );
 }
index a9b82d16a17b6e9905f9bdd28d279df9f0dbd3ef..6a6b6bcb3422681910d4f14ae30383e8e46a6343 100644 (file)
@@ -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)
index e3498cd96f9b4ba2cc2534613a681747d5bd5ee3..42134421367618efa347d4b9b05d8b97ed5f4312 100644 (file)
@@ -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
index b07b7da459e6b2e7551b86cad97a9a97e9c91573..e9bb5c54c59ccdde873c93e4eb450f1b05dbefba 100644 (file)
@@ -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),
index dc99f3d550e56d7b049732dc29d29aef047a05e7..36a5c0ca002d5061cafeedf1aa7df6f90b8e35fd 100644 (file)
@@ -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),
index 74ba68564cd83676d24db72758359c3b254f1a53..f7a90c753060909a91553f77fb4e590fa83f9802 100644 (file)
@@ -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
index 4609e10df363f367b74ac56b61e9ee66df8da43c..8de95624fa7caf867bfd6b3842568f0a3940f622 100644 (file)
@@ -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
index 9ed2fa46888f1d88bdaf70080f64e540c6ffb1ab..8a1be8cbef54b5ce05a076ad8cd6164afc30a5c0 100644 (file)
@@ -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
index b954c2cfdb0940c6b822d26a4ceb760f1dc979ca..dad70ef857b56e2af93ab17093aebd61dddb4ba8 100644 (file)
@@ -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 */
index ea930bafe3ec76e811966408ed3eab3b22b7a637..31243a0db3739d6ecbd5bd5254e5d2617789d70b 100644 (file)
@@ -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