]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Wrap linux specific syscall 22 (ustat)
authorMartin Cermak <mcermak@redhat.com>
Thu, 17 Jul 2025 07:16:53 +0000 (09:16 +0200)
committerMark Wielaard <mark@klomp.org>
Thu, 17 Jul 2025 11:02:29 +0000 (13:02 +0200)
The ustat syscall comes from pre-git linux history.  It is
deprecated in favor of statfs.  But in some cases it may
still be used.

int ustat(dev_t dev, struct ustat *ubuf); returns information
about a mounted filesystem.  dev is a device number identifying
a device containing a mounted filesystem.  ubuf is a pointer to
a ustat structure.

Declare a sys_ustat wrapper in priv_syswrap-linux.h and hook
it for {amd64,arm,arm64,mips64,nanomips,ppc32,ppc64,riscv64,\
s390x,x86}-linux using LINXY with PRE and POST handler in
syswrap-linux.c

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

12 files changed:
NEWS
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-linux.c
coregrind/m_syswrap/syswrap-mips32-linux.c
coregrind/m_syswrap/syswrap-mips64-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
include/vki/vki-linux.h

diff --git a/NEWS b/NEWS
index 868d4218fe43c508cf83ce59d63df9ee62b5fb86..e61b56baf9ea7a3953a9a7c0b931aa8eabad7f48 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -55,6 +55,7 @@ are not entered into bugzilla tend to get forgotten about or ignored.
 506076  unimplemented fcntl command: 1028 (F_CREATED_QUERY)
 506499  Unhandled syscall 592 (exterrctl - FreeBSD
 506795  Better report which clone flags are problematic
+506928  Wrap (deprecated) linux specific ustat syscall
 506930  valgrind allows SIGKILL being reset to SIG_DFL
 506970  mmap needs an EBADF fd_allowed check
 
index 9e6cb89811a8a8ca9aa3bf7b9424c11a49c206f0..ce10a35f6a350d94b4025a9be114f567d4d5da9d 100644 (file)
@@ -40,6 +40,7 @@ extern void ML_(call_on_new_stack_0_1) ( Addr stack, Addr retaddr,
 
 // Linux-specific (but non-arch-specific) syscalls
 
+DECL_TEMPLATE(linux, sys_ustat);
 DECL_TEMPLATE(linux, sys_clone)
 DECL_TEMPLATE(linux, sys_mount);
 DECL_TEMPLATE(linux, sys_oldumount);
index 22989f9fa56bb86bba30531f0f466497e5694f7d..c80286f00bd847531fc5fb8cf1d68b2e25d5cb86 100644 (file)
@@ -633,7 +633,7 @@ static SyscallTableEntry syscall_table[] = {
    //   (__NR_uselib,            sys_uselib),         // 134 
 
    LINX_(__NR_personality,       sys_personality),    // 135 
-   //   (__NR_ustat,             sys_ustat),          // 136 
+   LINXY(__NR_ustat,             sys_ustat),          // 136
    GENXY(__NR_statfs,            sys_statfs),         // 137 
    GENXY(__NR_fstatfs,           sys_fstatfs),        // 138 
    //   (__NR_sysfs,             sys_sysfs),          // 139 
index 7bd69b6817a2c98bc589ed61b79842068bac600c..c5fb08dcc643b26ac4eb8c7c2f8187cf45b3ade8 100644 (file)
@@ -621,7 +621,7 @@ static SyscallTableEntry syscall_main_table[] = {
 //zz 
    GENX_(__NR_umask,             sys_umask),          // 60
    GENX_(__NR_chroot,            sys_chroot),         // 61
-//zz    //   (__NR_ustat,             sys_ustat)           // 62 SVr4 -- deprecated
+   LINXY(__NR_ustat,             sys_ustat),          // 62 SVr4 -- deprecated
    GENXY(__NR_dup2,              sys_dup2),           // 63
    GENX_(__NR_getppid,           sys_getppid),        // 64
 
index 306c3a2f8b41f7d90c3d87f56f88d4a0cd1e8731..bd563d9894cb85e27b90d9c5c636d43584cfa192 100644 (file)
@@ -14204,6 +14204,19 @@ POST(sys_userfaultfd)
    }
 }
 
+PRE(sys_ustat)
+{
+   FUSE_COMPATIBLE_MAY_BLOCK();
+   PRINT("sys_ustat ( %#" FMT_REGWORD "x, %#" FMT_REGWORD "x)", ARG1, ARG2);
+   PRE_REG_READ2(long, "ustat", __vki_u32, dev, struct vki_ustat *, ubuf);
+   PRE_MEM_WRITE( "ustat(ubuf)", ARG2, sizeof(struct vki_ustat) );
+}
+
+POST(sys_ustat)
+{
+   POST_MEM_WRITE( ARG2, sizeof(struct vki_ustat) );
+}
+
 #undef PRE
 #undef POST
 
index 4e5e91e15bab51dfc4daf52f4dea65dd09eb15e4..684bda4b9a139f32348ffed5970692ad05a4e8c4 100644 (file)
@@ -826,7 +826,7 @@ static SyscallTableEntry syscall_main_table[] = {
    //..    //   (__NR_oldolduname,       sys_olduname),          // 59
    GENX_ (__NR_umask,                  sys_umask),                   // 60
    GENX_ (__NR_chroot,                 sys_chroot),                  // 61
-   //..    //   (__NR_ustat,             sys_ustat)              // 62
+   LINXY (__NR_ustat,                  sys_ustat),                   // 62
    GENXY (__NR_dup2,                   sys_dup2),                    // 63
    GENX_ (__NR_getppid,                sys_getppid),                 // 64
    GENX_ (__NR_getpgrp,                sys_getpgrp),                 // 65
index 67e5c0b37db7f05ba29e7ed5c0339f1dac450222..8e2dcbe93c46f88718cd0b8a9f238ebffdf49932 100644 (file)
@@ -216,7 +216,6 @@ SysRes sys_set_tls ( ThreadId tid, Addr tlsptr )
 
 DECL_TEMPLATE (mips_linux, sys_set_thread_area);
 DECL_TEMPLATE (mips_linux, sys_vmsplice);
-DECL_TEMPLATE (mips_linux, sys_ustat);
 DECL_TEMPLATE (mips_linux, sys_sysfs);
 DECL_TEMPLATE (mips_linux, sys_swapon);
 DECL_TEMPLATE (mips_linux, sys_swapoff);
@@ -248,12 +247,6 @@ PRE(sys_sched_rr_get_interval)
    *flags |= SfMayBlock;
 }
 
-PRE(sys_ustat)
-{
-   PRINT("sys_ustat ( %#" FMT_REGWORD "x, %#" FMT_REGWORD "x)", ARG1, ARG2);
-   PRE_REG_READ2(long, "ustat", int, flags, const void *, path);
-}
-
 PRE(sys_swapon)
 {
    PRINT("sys_swapon ( %#" FMT_REGWORD "x, %#" FMT_REGWORD "x )", ARG1, ARG2);
@@ -649,7 +642,7 @@ static SyscallTableEntry syscall_main_table[] = {
    LINX_ (__NR_utime, sys_utime),
    GENX_ (__NR_mknod, sys_mknod),
    LINX_ (__NR_personality, sys_personality),
-   PLAX_ (__NR_ustat, sys_ustat),
+   LINXY (__NR_ustat, sys_ustat),
    GENXY (__NR_statfs, sys_statfs),
    GENXY (__NR_fstatfs, sys_fstatfs),
    PLAX_ (__NR_sysfs, sys_sysfs),
index b5d45e10940ba86890775ed4834aada58b775b81..d2b59786c49587d2c1d5ce6e51e1a575f73b2014 100644 (file)
@@ -685,7 +685,7 @@ static SyscallTableEntry syscall_table[] = {
 
    GENX_(__NR_umask,             sys_umask),             // 60
    GENX_(__NR_chroot,            sys_chroot),            // 61
-//..    //   (__NR_ustat,             sys_ustat)              // 62 SVr4 -- deprecated
+   LINXY(__NR_ustat,             sys_ustat),             // 62 SVr4 -- deprecated
    GENXY(__NR_dup2,              sys_dup2),              // 63
    GENX_(__NR_getppid,           sys_getppid),           // 64
 
index 764fb557ec67d54e23fb4c5203e910752df5de80..3d6c2e4eda8ad9b3a6a341333e45146cb5dc5975 100644 (file)
@@ -674,7 +674,7 @@ static SyscallTableEntry syscall_table[] = {
 
    GENX_(__NR_umask,             sys_umask),              //  60
    GENX_(__NR_chroot,            sys_chroot),             //  61
-// _____(__NR_ustat,             sys_ustat),              //  62
+   LINXY(__NR_ustat,             sys_ustat),              //  62
    GENXY(__NR_dup2,              sys_dup2),               //  63
    GENX_(__NR_getppid,           sys_getppid),            //  64
 
index 8202c1922d1eddaf5df1df825ff8aaf3e09434a9..65a26a02da8b3b70128e1ad05a86aea2a99735a0 100644 (file)
@@ -485,7 +485,7 @@ static SyscallTableEntry syscall_table[] = {
 
    GENX_(__NR_umask,  sys_umask),                                     // 60
    GENX_(__NR_chroot,  sys_chroot),                                   // 61
-// ?????(__NR_ustat, sys_ustat), /* deprecated in favor of statfs */  // 62
+   LINXY(__NR_ustat, sys_ustat), /* deprecated in favor of statfs */  // 62
    GENXY(__NR_dup2,  sys_dup2),                                       // 63
    GENX_(__NR_getppid,  sys_getppid),                                 // 64
 
index 45216b45f4f97d0e444eef37f74ec624d6ee0783..0b8373ffa882cda28ebdc0dc5d01bb6717b8eb2a 100644 (file)
@@ -1230,7 +1230,7 @@ static SyscallTableEntry syscall_table[] = {
 //zz 
    GENX_(__NR_umask,             sys_umask),          // 60
    GENX_(__NR_chroot,            sys_chroot),         // 61
-//zz    //   (__NR_ustat,             sys_ustat)           // 62 SVr4 -- deprecated
+   LINXY(__NR_ustat,             sys_ustat),          // 62 SVr4 -- deprecated
    GENXY(__NR_dup2,              sys_dup2),           // 63
    GENX_(__NR_getppid,           sys_getppid),        // 64
 
index 8c919845bcf0120434322bf66a57a72ee12b5444..c31035cbbe2504cca7b79fa9ced1835b15d935bf 100644 (file)
@@ -171,6 +171,25 @@ typedef struct {
 typedef int __vki_kernel_key_t;
 typedef int __vki_kernel_mqd_t;
 
+//----------------------------------------------------------------------
+// From pre-git history /include/linux/types.h
+//----------------------------------------------------------------------
+
+struct vki_ustat {
+#if defined(VGA_mips32) || defined(VGA_mips64) || defined(VGA_nanomips)
+       long                    f_tfree;
+#else
+       int                     f_tfree;
+#endif
+#if defined(VGA_s390x)
+       unsigned int            f_tinode;
+#else
+       unsigned long           f_tinode;
+#endif
+       char                    f_fname[6];
+       char                    f_fpack[6];
+};
+
 //----------------------------------------------------------------------
 // From linux-2.6.8.1/include/linux/types.h
 //----------------------------------------------------------------------