]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Add open_tree, move_mount, fsopen, fsconfig, fsmount, fspick linux syswraps
authorMark Wielaard <mark@klomp.org>
Tue, 26 Nov 2024 18:00:34 +0000 (19:00 +0100)
committerMark Wielaard <mark@klomp.org>
Tue, 26 Nov 2024 18:00:44 +0000 (19:00 +0100)
Shared linux syscalls implementing various file system mount tasks.
Since linux kernel version 5.2.

Check arguments and track file descriptors.

https://bugs.kde.org/show_bug.cgi?id=494246

12 files changed:
coregrind/m_syswrap/priv_syswrap-linux.h
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-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-x86-linux.c

index 221439a0ec339df806ad8376361ee7d4a0406bcf..1bdd9a94ec19598c253b57e068ab0b237189a969 100644 (file)
@@ -321,6 +321,14 @@ DECL_TEMPLATE(linux, sys_io_uring_setup);
 DECL_TEMPLATE(linux, sys_io_uring_enter);
 DECL_TEMPLATE(linux, sys_io_uring_register);
 
+// open_tree and friends (shared linux syscalls)
+DECL_TEMPLATE(linux, sys_open_tree);
+DECL_TEMPLATE(linux, sys_move_mount);
+DECL_TEMPLATE(linux, sys_fsopen);
+DECL_TEMPLATE(linux, sys_fsconfig);
+DECL_TEMPLATE(linux, sys_fsmount);
+DECL_TEMPLATE(linux, sys_fspick);
+
 // Linux-specific (new in Linux 5.3)
 DECL_TEMPLATE(linux, sys_pidfd_open);
 
index 9488d3090e8053463c75b5c2d2057c6f03c9a6cd..bdba41826ad8fab2ef2496bfeaaf2b805d4054e7 100644 (file)
@@ -877,6 +877,12 @@ static SyscallTableEntry syscall_table[] = {
    LINXY(__NR_io_uring_setup,    sys_io_uring_setup),    // 425
    LINXY(__NR_io_uring_enter,    sys_io_uring_enter),    // 426
    LINXY(__NR_io_uring_register, sys_io_uring_register), // 427
+   LINXY(__NR_open_tree,         sys_open_tree),         // 428
+   LINX_(__NR_move_mount,        sys_move_mount),        // 429
+   LINXY(__NR_fsopen,            sys_fsopen),            // 430
+   LINX_(__NR_fsconfig,          sys_fsconfig),          // 431
+   LINXY(__NR_fsmount,           sys_fsmount),           // 432
+   LINXY(__NR_fspick,            sys_fspick),            // 433
 
    LINXY(__NR_pidfd_open,        sys_pidfd_open),        // 434
    GENX_(__NR_clone3,            sys_ni_syscall),        // 435
index 5dac60f82145ef8c1e3d66b4ce170352f3955b66..bbe3e81e7cde4fdd9cd228c8a9da8556d95bf682 100644 (file)
@@ -1053,7 +1053,12 @@ static SyscallTableEntry syscall_main_table[] = {
    LINXY(__NR_io_uring_setup,    sys_io_uring_setup),    // 425
    LINXY(__NR_io_uring_enter,    sys_io_uring_enter),    // 426
    LINXY(__NR_io_uring_register, sys_io_uring_register), // 427
-
+   LINXY(__NR_open_tree,         sys_open_tree),         // 428
+   LINX_(__NR_move_mount,        sys_move_mount),        // 429
+   LINXY(__NR_fsopen,            sys_fsopen),            // 430
+   LINX_(__NR_fsconfig,          sys_fsconfig),          // 431
+   LINXY(__NR_fsmount,           sys_fsmount),           // 432
+   LINXY(__NR_fspick,            sys_fspick),            // 433
    LINXY(__NR_pidfd_open,        sys_pidfd_open),        // 434
    GENX_(__NR_clone3,            sys_ni_syscall),        // 435
    LINXY(__NR_close_range,       sys_close_range),       // 436
index 151ae0640b1088afff8f4a1cc3eec1edd7972c42..23b0b6b51c10c19098c5610c86514865f348381e 100644 (file)
@@ -830,7 +830,12 @@ static SyscallTableEntry syscall_main_table[] = {
    LINXY(__NR_io_uring_setup,    sys_io_uring_setup),    // 425
    LINXY(__NR_io_uring_enter,    sys_io_uring_enter),    // 426
    LINXY(__NR_io_uring_register, sys_io_uring_register), // 427
-
+   LINXY(__NR_open_tree,         sys_open_tree),         // 428
+   LINX_(__NR_move_mount,        sys_move_mount),        // 429
+   LINXY(__NR_fsopen,            sys_fsopen),            // 430
+   LINX_(__NR_fsconfig,          sys_fsconfig),          // 431
+   LINXY(__NR_fsmount,           sys_fsmount),           // 432
+   LINXY(__NR_fspick,            sys_fspick),            // 433
    LINXY(__NR_pidfd_open,        sys_pidfd_open),        // 434
    GENX_(__NR_clone3,            sys_ni_syscall),        // 435
    LINXY(__NR_close_range,       sys_close_range),       // 436
index 5af84d739912959b047c02ed1763b166ca6773cb..e01d920e11c6108efc2c83f1a5c7f6e0f431408b 100644 (file)
@@ -13840,6 +13840,152 @@ POST(sys_pidfd_getfd)
    }
 }
 
+/* int open_tree (int dfd, const char *filename, unsigned int flags)  */
+PRE(sys_open_tree)
+{
+   PRINT("sys_open_tree ( %ld, %#" FMT_REGWORD "x(%s), %ld",
+         SARG1, ARG2, (HChar*)(Addr)ARG2, SARG3);
+   PRE_REG_READ3(long, "open_tree",
+                 int, dfd, const char *, filename, int, flags);
+   PRE_MEM_RASCIIZ( "open_tree(filename)", ARG2);
+   /* For absolute filenames, dfd is ignored.  If dfd is AT_FDCWD,
+      filename is relative to cwd.  When comparing dfd against AT_FDCWD,
+      be sure only to compare the bottom 32 bits. */
+   if (ML_(safe_to_deref)( (void*)(Addr)ARG2, 1 )
+       && *(Char *)(Addr)ARG2 != '/'
+       && ((Int)ARG1) != ((Int)VKI_AT_FDCWD)
+       && !ML_(fd_allowed)(ARG1, "open_tree", tid, False))
+      SET_STATUS_Failure( VKI_EBADF );
+}
+
+POST(sys_open_tree)
+{
+   if (!ML_(fd_allowed)(RES, "open_tree", tid, True)) {
+      VG_(close)(RES);
+      SET_STATUS_Failure( VKI_EMFILE );
+   } else {
+      if (VG_(clo_track_fds))
+         ML_(record_fd_open_with_given_name)(tid, RES, (HChar*)(Addr)ARG2);
+   }
+}
+
+/* int move_mount (int from_dfd, const char *from_pathname,
+                   int to_dfd, const char *to_pathname,
+                   unsigned int flags)  */
+PRE(sys_move_mount)
+{
+   PRINT("sys_move_mount ( %ld, %#" FMT_REGWORD "x(%s), "
+         "%ld, %#" FMT_REGWORD "x(%s), %ld",
+         SARG1, ARG2, (HChar*)(Addr)ARG2,
+         SARG3, ARG4, (HChar*)(Addr)ARG4, SARG5);
+   PRE_REG_READ5(long, "mount_move",
+                 int, from_dfd, const char *, from_pathname,
+                 int, to_dfd, const char*, to_pathname, int, flags);
+   PRE_MEM_RASCIIZ( "mount_move(from_pathname)", ARG2);
+   /* For absolute filenames, from_dfd is ignored.  If from_dfd is AT_FDCWD,
+      from_pathname is relative to cwd.  When comparing from_dfd against
+      AT_FDCWD, be sure only to compare the bottom 32 bits. */
+   if (ML_(safe_to_deref)( (void*)(Addr)ARG2, 1 )
+       && *(Char *)(Addr)ARG2 != '/'
+       && ((Int)ARG1) != ((Int)VKI_AT_FDCWD)
+       && !ML_(fd_allowed)(ARG1, "mount_move", tid, False))
+      SET_STATUS_Failure( VKI_EBADF );
+   PRE_MEM_RASCIIZ( "mount_move(from_pathname)", ARG4);
+   /* For absolute filenames, to_dfd is ignored.  If to_dfd is AT_FDCWD,
+      to_pathname is relative to cwd.  When comparing to_dfd against
+      AT_FDCWD, be sure only to compare the bottom 32 bits. */
+   if (ML_(safe_to_deref)( (void*)(Addr)ARG4, 1 )
+       && *(Char *)(Addr)ARG4 != '/'
+       && ((Int)ARG4) != ((Int)VKI_AT_FDCWD)
+       && !ML_(fd_allowed)(ARG3, "mount_move", tid, False))
+      SET_STATUS_Failure( VKI_EBADF );
+}
+
+/* int fsopen (const char *fs_name, unsigned int flags)  */
+PRE(sys_fsopen)
+{
+   PRINT("sys_fsopen ( %#" FMT_REGWORD "x(%s), %ld",
+         ARG1, (HChar*)(Addr)ARG1, SARG2);
+   PRE_REG_READ2(long, "fsopen", const char *, fs_name, int, flags);
+   PRE_MEM_RASCIIZ( "fsopen(filename)", ARG1);
+}
+
+POST(sys_fsopen)
+{
+   if (!ML_(fd_allowed)(RES, "fsopen", tid, True)) {
+      VG_(close)(RES);
+      SET_STATUS_Failure( VKI_EMFILE );
+   } else {
+      if (VG_(clo_track_fds))
+         ML_(record_fd_open_with_given_name)(tid, RES, (HChar*)(Addr)ARG1);
+   }
+}
+
+/* int fsmount (int fd, unsigned int flags, unsigned int ms_flags)  */
+PRE(sys_fsmount)
+{
+   PRINT("sys_fsmount ( %ld, %ld, %ld", SARG1, SARG2, SARG3);
+   PRE_REG_READ3(long, "fsmount", int, fd, int, flags, int, ms_flags);
+   if (!ML_(fd_allowed)(ARG1, "fsmount", tid, False))
+      SET_STATUS_Failure( VKI_EBADF );
+}
+
+POST(sys_fsmount)
+{
+   if (!ML_(fd_allowed)(RES, "fsmount", tid, True)) {
+      VG_(close)(RES);
+      SET_STATUS_Failure( VKI_EMFILE );
+   } else {
+      if (VG_(clo_track_fds))
+         ML_(record_fd_open_nameless)(tid, RES);
+   }
+}
+
+/* int fsconfig (int fd, unsigned int cmd, const char *key,
+                 const void *value, int aux)  */
+PRE(sys_fsconfig)
+{
+   PRINT("sys_fsconfig ( %ld, %ld, %#" FMT_REGWORD "x(%s), "
+         "%#" FMT_REGWORD "x, %ld )",
+         SARG1, SARG2, ARG3, (HChar*)(Addr)ARG3, ARG4, SARG6);
+   PRE_REG_READ5(long, "fsconfig", int, fd, int, cmd,
+                 const char *, key, const void *, value, int, aux);
+   if (ARG3)
+      PRE_MEM_RASCIIZ( "fsconfig(key)", ARG3);
+   if (!ML_(fd_allowed)(ARG1, "fsconfig", tid, False))
+      SET_STATUS_Failure( VKI_EBADF );
+   /* XXX we could also check the value based on the cmd FSCONFIG_...  */
+}
+
+/* int fspick (int dfd, const char *path, unsigned int flags)  */
+PRE(sys_fspick)
+{
+   PRINT("sys_fspick ( %ld, %#" FMT_REGWORD "x(%s), %ld",
+         SARG1, ARG2, (HChar*)(Addr)ARG2, SARG3);
+   PRE_REG_READ3(long, "fspick",
+                 int, dfd, const char *, filename, int, flags);
+   PRE_MEM_RASCIIZ( "fspick(path)", ARG2);
+   /* For absolute filenames, dfd is ignored.  If dfd is AT_FDCWD,
+      path is relative to cwd.  When comparing dfd against AT_FDCWD,
+      be sure only to compare the bottom 32 bits. */
+   if (ML_(safe_to_deref)( (void*)(Addr)ARG2, 1 )
+       && *(Char *)(Addr)ARG2 != '/'
+       && ((Int)ARG1) != ((Int)VKI_AT_FDCWD)
+       && !ML_(fd_allowed)(ARG1, "fspick", tid, False))
+      SET_STATUS_Failure( VKI_EBADF );
+}
+
+POST(sys_fspick)
+{
+   if (!ML_(fd_allowed)(RES, "fspick", tid, True)) {
+      VG_(close)(RES);
+      SET_STATUS_Failure( VKI_EMFILE );
+   } else {
+      if (VG_(clo_track_fds))
+         ML_(record_fd_open_with_given_name)(tid, RES, (HChar*)(Addr)ARG2);
+   }
+}
+
 #undef PRE
 #undef POST
 
index 757b637ba9864845314b1eb97fa61696e4df1d84..39ba911aa5e493ad561431d3ce91df98be8c9012 100644 (file)
@@ -1137,7 +1137,12 @@ static SyscallTableEntry syscall_main_table[] = {
    LINXY(__NR_io_uring_setup,          sys_io_uring_setup),          // 425
    LINXY(__NR_io_uring_enter,          sys_io_uring_enter),          // 426
    LINXY(__NR_io_uring_register,       sys_io_uring_register),       // 427
-
+   LINXY(__NR_open_tree,               sys_open_tree),               // 428
+   LINX_(__NR_move_mount,              sys_move_mount),              // 429
+   LINXY(__NR_fsopen,                  sys_fsopen),                  // 430
+   LINX_(__NR_fsconfig,                sys_fsconfig),                // 431
+   LINXY(__NR_fsmount,                 sys_fsmount),                 // 432
+   LINXY(__NR_fspick,                  sys_fspick),                  // 433
    LINXY(__NR_pidfd_open,              sys_pidfd_open),              // 434
    GENX_(__NR_clone3,                  sys_ni_syscall),              // 435
    LINXY(__NR_close_range,       sys_close_range),       // 436
index f0c5f7e04f4e68f1a000473aee00c973fdb4da7c..d603924c5566b54c9b3aecc8cf83e8aa365d944a 100644 (file)
@@ -818,6 +818,12 @@ static SyscallTableEntry syscall_main_table[] = {
    LINXY (__NR_io_uring_setup, sys_io_uring_setup),
    LINXY (__NR_io_uring_enter, sys_io_uring_enter),
    LINXY (__NR_io_uring_register, sys_io_uring_register),
+   LINXY (__NR_open_tree, sys_open_tree),
+   LINX_ (__NR_move_mount, sys_move_mount),
+   LINXY (__NR_fsopen, sys_fsopen),
+   LINX_ (__NR_fsconfig, sys_fsconfig),
+   LINXY (__NR_fsmount, sys_fsmount),
+   LINXY (__NR_fspick, sys_fspick),
    LINXY (__NR_pidfd_open, sys_pidfd_open),
    GENX_ (__NR_clone3, sys_ni_syscall),
    LINXY (__NR_close_range, sys_close_range),
index f466aca147e04d9747e20acbb9f95c7615d69521..853495e981b162983e04ce55c3d0a1544cfa03d9 100644 (file)
@@ -824,6 +824,12 @@ static SyscallTableEntry syscall_main_table[] = {
    LINXY (__NR_io_uring_setup,         sys_io_uring_setup),
    LINXY (__NR_io_uring_enter,         sys_io_uring_enter),
    LINXY (__NR_io_uring_register,      sys_io_uring_register),
+   LINXY (__NR_open_tree,              sys_open_tree),
+   LINX_ (__NR_move_mount,             sys_move_mount),
+   LINXY (__NR_fsopen,                 sys_fsopen),
+   LINX_ (__NR_fsconfig,               sys_fsconfig),
+   LINXY (__NR_fsmount,                sys_fsmount),
+   LINXY (__NR_fspick,                 sys_fspick),
    LINXY (__NR_pidfd_open,             sys_pidfd_open),
    GENX_ (__NR_clone3,                 sys_ni_syscall),
    LINXY (__NR_close_range,            sys_close_range),
index 634f288ce0d166877353e08a237a0c9c19dad156..24d8eb21319049ccd8027ca2b5449c4ee499d769 100644 (file)
@@ -1059,7 +1059,12 @@ static SyscallTableEntry syscall_table[] = {
    LINXY(__NR_io_uring_setup,    sys_io_uring_setup),    // 425
    LINXY(__NR_io_uring_enter,    sys_io_uring_enter),    // 426
    LINXY(__NR_io_uring_register, sys_io_uring_register), // 427
-
+   LINXY(__NR_open_tree,         sys_open_tree),         // 428
+   LINX_(__NR_move_mount,        sys_move_mount),        // 429
+   LINXY(__NR_fsopen,            sys_fsopen),            // 430
+   LINX_(__NR_fsconfig,          sys_fsconfig),          // 431
+   LINXY(__NR_fsmount,           sys_fsmount),           // 432
+   LINXY(__NR_fspick,            sys_fspick),            // 433
    LINXY(__NR_pidfd_open,        sys_pidfd_open),        // 434
    GENX_(__NR_clone3,            sys_ni_syscall),        // 435
    LINXY(__NR_close_range,       sys_close_range),       // 436
index 2c2def330ad7df99afc1f7fac35b1ff80cdbfde5..2a3ed8b92481c1dcf176e89f5489f164248d8c54 100644 (file)
@@ -1025,7 +1025,12 @@ static SyscallTableEntry syscall_table[] = {
    LINXY(__NR_io_uring_setup,    sys_io_uring_setup),    // 425
    LINXY(__NR_io_uring_enter,    sys_io_uring_enter),    // 426
    LINXY(__NR_io_uring_register, sys_io_uring_register), // 427
-
+   LINXY(__NR_open_tree,         sys_open_tree),         // 428
+   LINX_(__NR_move_mount,        sys_move_mount),        // 429
+   LINXY(__NR_fsopen,            sys_fsopen),            // 430
+   LINX_(__NR_fsconfig,          sys_fsconfig),          // 431
+   LINXY(__NR_fsmount,           sys_fsmount),           // 432
+   LINXY(__NR_fspick,            sys_fspick),            // 433
    LINXY(__NR_pidfd_open,        sys_pidfd_open),        // 434
    GENX_(__NR_clone3,            sys_ni_syscall),        // 435
    LINXY(__NR_close_range,       sys_close_range),       // 436
index ca571f0f1a7cc681de87c4eba0beeff4f8d0498d..893306bbdae36e021ebb0a544e159b3db993ca5a 100644 (file)
@@ -865,7 +865,12 @@ static SyscallTableEntry syscall_table[] = {
    LINXY(__NR_io_uring_setup, sys_io_uring_setup),                    // 425
    LINXY(__NR_io_uring_enter, sys_io_uring_enter),                    // 426
    LINXY(__NR_io_uring_register, sys_io_uring_register),              // 427
-
+   LINXY(__NR_open_tree, sys_open_tree),                              // 428
+   LINX_(__NR_move_mount, sys_move_mount),                            // 429
+   LINXY(__NR_fsopen, sys_fsopen),                                    // 430
+   LINX_(__NR_fsconfig, sys_fsconfig),                                // 431
+   LINXY(__NR_fsmount, sys_fsmount),                                  // 432
+   LINXY(__NR_fspick, sys_fspick),                                    // 433
    LINXY(__NR_pidfd_open, sys_pidfd_open),                            // 434
    GENX_(__NR_clone3, sys_ni_syscall),                                // 435
    LINXY(__NR_close_range, sys_close_range),                          // 436
index a23743743abea20f987a0e670434a58f1cdb8ef7..50384817dbe5305ab8dfc44bc0aa983ca21242cc 100644 (file)
@@ -1646,7 +1646,12 @@ static SyscallTableEntry syscall_table[] = {
    LINXY(__NR_io_uring_setup,    sys_io_uring_setup),   // 425
    LINXY(__NR_io_uring_enter,    sys_io_uring_enter),   // 426
    LINXY(__NR_io_uring_register, sys_io_uring_register),// 427
-
+   LINXY(__NR_open_tree,         sys_open_tree),        // 428
+   LINX_(__NR_move_mount,        sys_move_mount),       // 429
+   LINXY(__NR_fsopen,            sys_fsopen),           // 430
+   LINX_(__NR_fsconfig,          sys_fsconfig),         // 431
+   LINXY(__NR_fsmount,           sys_fsmount),          // 432
+   LINXY(__NR_fspick,            sys_fspick),           // 433
    LINXY(__NR_pidfd_open,        sys_pidfd_open),       // 434
    GENX_(__NR_clone3,            sys_ni_syscall),       // 435
    LINXY(__NR_close_range,       sys_close_range),      // 436