]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Bug 518076 - FreeBSD: add syscall wrapper for renameat2
authorPaul Floyd <pjfloyd@wanadoo.fr>
Tue, 24 Mar 2026 19:50:34 +0000 (20:50 +0100)
committerPaul Floyd <pjfloyd@wanadoo.fr>
Wed, 25 Mar 2026 06:30:28 +0000 (07:30 +0100)
Made the existing Linux renameat2 wrapper generic.

22 files changed:
NEWS
coregrind/m_syswrap/priv_syswrap-freebsd.h
coregrind/m_syswrap/priv_syswrap-generic.h
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-freebsd.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-riscv64-linux.c
coregrind/m_syswrap/syswrap-s390x-linux.c
coregrind/m_syswrap/syswrap-x86-linux.c
include/vki/vki-scnums-freebsd.h
memcheck/tests/freebsd/scalar.c
memcheck/tests/freebsd/scalar.stderr.exp
memcheck/tests/freebsd/scalar.stderr.exp-x86

diff --git a/NEWS b/NEWS
index ff78f4b2b74548ce13a46872837e210cc59aec9c..ddb51c7934f8b3948446a7e96fe4090b74082537 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -113,6 +113,7 @@ are not entered into bugzilla tend to get forgotten about or ignored.
         error codes rather than -1 on error
 517697  Implement CLRSSONSTACK and SETUJMPBUF handling on Solaris.
 517748  Add ability to redirect global functions to Darwin
+518076  FreeBSD: add syscall wrapper for renameat2
 
 To see details of a given bug, visit
   https://bugs.kde.org/show_bug.cgi?id=XXXXXX
index 32da698a26bbf322a910ebb3cee43dcca27690ee..7e4029301e739cbf406d1e8a00d2b3864e336a9b 100644 (file)
@@ -555,6 +555,7 @@ DECL_TEMPLATE(freebsd, sys_jail_remove_jd) // 598
 DECL_TEMPLATE(freebsd, sys_kexec_load) // 599
 // generic sys_pdrfork redirect to ni_syscall 600
 DECL_TEMPLATE(freebsd, sys_pdwait) // 601
+// generic renameat2 602
 
 DECL_TEMPLATE(freebsd, sys_fake_sigreturn)
 
index ec38236eafc115402a04a9c685557da7a5ab3839..ed5c1dba3711665f13d7095849a1e9af34d4c873 100644 (file)
@@ -268,6 +268,7 @@ DECL_TEMPLATE(generic, sys_getdents64);            // * (SVr4,SVID?)
 DECL_TEMPLATE(generic, sys_statfs64);              // * (?)
 DECL_TEMPLATE(generic, sys_fstatfs64);             // * (?)
 DECL_TEMPLATE(generic, sys_mlock2);                // * L
+DECL_TEMPLATE(generic, sys_renameat2);             // * L, F
 
 
 /* ---------------------------------------------------------------------
index f4d3f8a7a58d91961195bd92ab2133d681f9263d..38755b60c8da952f19c99746a96f4e262a2e06f3 100644 (file)
@@ -181,7 +181,6 @@ DECL_TEMPLATE(linux, sys_futimesat);
 DECL_TEMPLATE(linux, sys_newfstatat);
 DECL_TEMPLATE(linux, sys_unlinkat);
 DECL_TEMPLATE(linux, sys_renameat);
-DECL_TEMPLATE(linux, sys_renameat2);
 DECL_TEMPLATE(linux, sys_linkat);
 DECL_TEMPLATE(linux, sys_symlinkat);
 DECL_TEMPLATE(linux, sys_readlinkat);
index c31a44d44f53a9990397bc84894cd901bec3cd6d..70e3327bb045877a188f429a007ac361e5ccdc1d 100644 (file)
@@ -848,7 +848,7 @@ static SyscallTableEntry syscall_table[] = {
    LINX_(__NR_finit_module,      sys_finit_module),      // 313
    LINX_(__NR_sched_setattr,     sys_sched_setattr),     // 314
    LINXY(__NR_sched_getattr,     sys_sched_getattr),     // 315
-   LINX_(__NR_renameat2,         sys_renameat2),         // 316
+   GENX_(__NR_renameat2,         sys_renameat2),         // 316
 //   LIN__(__NR_seccomp,           sys_ni_syscall),      // 317
    LINXY(__NR_getrandom,         sys_getrandom),         // 318
    LINXY(__NR_memfd_create,      sys_memfd_create),      // 319
index dae613e1e1d36a8f62672c08b6f0f4626e41b97a..faeb61238d97e6dc64a2eb12b6f106f75b38e55e 100644 (file)
@@ -1011,7 +1011,7 @@ static SyscallTableEntry syscall_main_table[] = {
 
    LINX_(__NR_sched_setattr,     sys_sched_setattr),    // 380
    LINXY(__NR_sched_getattr,     sys_sched_getattr),    // 381
-   LINX_(__NR_renameat2,         sys_renameat2),        // 382
+   GENX_(__NR_renameat2,         sys_renameat2),        // 382
 
    LINXY(__NR_getrandom,         sys_getrandom),        // 384
    LINXY(__NR_memfd_create,      sys_memfd_create),     // 385
index 8191b26d0a1c3a4aa5cfdb8589ea552a0452e41b..ad704a462076acc88c2151a313a4a3c29b758dfd 100644 (file)
@@ -808,7 +808,7 @@ static SyscallTableEntry syscall_main_table[] = {
    LINX_(__NR_finit_module,      sys_finit_module),      // 273
    LINX_(__NR_sched_setattr,     sys_sched_setattr),     // 274
    LINXY(__NR_sched_getattr,     sys_sched_getattr),     // 275
-   LINX_(__NR_renameat2,         sys_renameat2),         // 276
+   GENX_(__NR_renameat2,         sys_renameat2),         // 276
    //   (__NR_seccomp,           sys_ni_syscall),        // 277
    LINXY(__NR_getrandom,         sys_getrandom),         // 278
    LINXY(__NR_memfd_create,      sys_memfd_create),      // 279
index d81e916739440b2e6f4d5681f25dd7efcaad480e..dd636b808509066d46a2df826af1878fe5d46d8b 100644 (file)
@@ -8104,6 +8104,7 @@ const SyscallTableEntry ML_(syscall_table)[] = {
    // as not implemented for the moment
    GENX_(__NR_pdrfork,         sys_ni_syscall),        // 600
    BSDXY(__NR_pdwait,          sys_pdwait),            // 601
+   GENX_(__NR_renameat2,       sys_renameat2),         // 602
 
    BSDX_(__NR_freebsd_fake_sigreturn,   sys_fake_sigreturn), // 1000, fake sigreturn
 
index 85d584e4c9459b8143a4cea77bf26145e6b7ad72..5699c78abc52b33a4366332903c8077f0d7b2100 100644 (file)
@@ -5581,6 +5581,22 @@ PRE(sys_sethostname)
    PRE_MEM_READ( "sethostname(name)", ARG1, ARG2 );
 }
 
+PRE(sys_renameat2)
+{
+   FUSE_COMPATIBLE_MAY_BLOCK();
+   PRINT("sys_renameat2 ( %ld, %#" FMT_REGWORD "x(%s), %ld, %#" FMT_REGWORD
+         "x(%s), %" FMT_REGWORD "u )", SARG1, ARG2, (HChar*)(Addr)ARG2, SARG3,
+         ARG4, (HChar*)(Addr)ARG4, ARG5);
+   PRE_REG_READ5(long, "renameat2",
+                 int, olddfd, const char *, oldpath,
+                 int, newdfd, const char *, newpath,
+                 unsigned int, flags);
+   ML_(fd_at_check_allowed)(SARG1, (const HChar*)ARG2, "renameat2(olddirfd)", tid, status);
+   ML_(fd_at_check_allowed)(SARG3, (const HChar*)ARG4, "renameat2(newdirfd)", tid, status);
+   PRE_MEM_RASCIIZ( "renameat2(oldpath)", ARG2 );
+   PRE_MEM_RASCIIZ( "renameat2(newpath)", ARG4 );
+}
+
 #undef PRE
 #undef POST
 
index 6853e5e9453077b9bb206b24b8a11f9e44f557f7..e44c47b52675ff31883e5041e892dd488c7be48c 100644 (file)
@@ -6631,22 +6631,6 @@ PRE(sys_renameat)
    PRE_MEM_RASCIIZ( "renameat(newpath)", ARG4 );
 }
 
-PRE(sys_renameat2)
-{
-   FUSE_COMPATIBLE_MAY_BLOCK();
-   PRINT("sys_renameat2 ( %ld, %#" FMT_REGWORD "x(%s), %ld, %#" FMT_REGWORD
-         "x(%s), %" FMT_REGWORD "u )", SARG1, ARG2, (HChar*)(Addr)ARG2, SARG3,
-         ARG4, (HChar*)(Addr)ARG4, ARG5);
-   PRE_REG_READ5(long, "renameat2",
-                 int, olddfd, const char *, oldpath,
-                 int, newdfd, const char *, newpath,
-                 unsigned int, flags);
-   ML_(fd_at_check_allowed)(SARG1, (const HChar*)ARG2, "renameat2(olddirfd)", tid, status);
-   ML_(fd_at_check_allowed)(SARG3, (const HChar*)ARG4, "renameat2(newdirfd)", tid, status);
-   PRE_MEM_RASCIIZ( "renameat2(oldpath)", ARG2 );
-   PRE_MEM_RASCIIZ( "renameat2(newpath)", ARG4 );
-}
-
 PRE(sys_linkat)
 {
    *flags |= SfMayBlock;
index d6e651139d61c857362160fe5b10e9d22dc91d43..da2f70f8cbc785cb98ebf86a5f8646a48687dd49 100644 (file)
@@ -1110,7 +1110,7 @@ static SyscallTableEntry syscall_main_table[] = {
    //..
    LINX_(__NR_sched_setattr,           sys_sched_setattr),           // 349
    LINXY(__NR_sched_getattr,           sys_sched_getattr),           // 350
-   LINX_(__NR_renameat2,               sys_renameat2),               // 351
+   GENX_(__NR_renameat2,               sys_renameat2),               // 351
    //..
    LINXY (__NR_getrandom,              sys_getrandom),               // 353
    LINXY (__NR_memfd_create,           sys_memfd_create),            // 354
index 6930a924d4fb96c91bb13142b9586a779972535e..8eaa9e263f608cbd284f5b98d44a22b76284bfb1 100644 (file)
@@ -757,7 +757,7 @@ static SyscallTableEntry syscall_main_table[] = {
    LINX_ (__NR_process_vm_writev, sys_process_vm_writev),
    LINX_ (__NR_sched_setattr, sys_sched_setattr),
    LINXY (__NR_sched_getattr, sys_sched_getattr),
-   LINX_ (__NR_renameat2, sys_renameat2),
+   GENX_ (__NR_renameat2, sys_renameat2),
    LINXY (__NR_getrandom, sys_getrandom),
    LINXY (__NR_memfd_create, sys_memfd_create),
    LINX_ (__NR_execveat, sys_execveat),
index c42f16166937ece05ad30c7b17185dcc38b2fe24..589bc6de45b72a6903f354582aef85fde3f33849 100644 (file)
@@ -782,7 +782,7 @@ static SyscallTableEntry syscall_main_table[] = {
    LINXY (__NR_process_vm_readv,       sys_process_vm_readv),
    LINX_ (__NR_process_vm_writev,      sys_process_vm_writev),
    LINX_ (__NR_kcmp,                   sys_kcmp),
-   LINX_ (__NR_renameat2,              sys_renameat2),
+   GENX_ (__NR_renameat2,              sys_renameat2),
    LINX_ (__NR_sched_setattr,          sys_sched_setattr),
    LINXY (__NR_sched_getattr,          sys_sched_getattr),
    LINXY (__NR_getrandom,              sys_getrandom),
index 78bf2de68af7e6a580805ca3fc47235227c91597..0f6a9b234c517ceeec63febcb005d557ac110dcc 100644 (file)
@@ -1022,7 +1022,7 @@ static SyscallTableEntry syscall_table[] = {
 
    LINX_(__NR_sched_setattr,     sys_sched_setattr),    // 355
    LINXY(__NR_sched_getattr,     sys_sched_getattr),    // 356
-   LINX_(__NR_renameat2,         sys_renameat2),        // 357
+   GENX_(__NR_renameat2,         sys_renameat2),        // 357
 
    LINXY(__NR_getrandom,         sys_getrandom),        // 359
    LINXY(__NR_memfd_create,      sys_memfd_create),     // 360
index 3689e8a9db7410c488377774110b0941d6d29c85..9e774a916c421f04842efdaf9c3b877320fd8f84 100644 (file)
@@ -1012,7 +1012,7 @@ static SyscallTableEntry syscall_table[] = {
 
    LINX_(__NR_sched_setattr,     sys_sched_setattr),    // 355
    LINXY(__NR_sched_getattr,     sys_sched_getattr),    // 356
-   LINX_(__NR_renameat2,         sys_renameat2),        // 357
+   GENX_(__NR_renameat2,         sys_renameat2),        // 357
 
    LINXY(__NR_getrandom,         sys_getrandom),        // 359
    LINXY(__NR_memfd_create,      sys_memfd_create),     // 360
index 4d0ab791650692f5d6022fd6a15b9d1ecbaca580..4502a86adae82ef6aaadb7ec4fe931bf5ad528b2 100644 (file)
@@ -567,7 +567,7 @@ static SyscallTableEntry syscall_main_table[] = {
    LINX_(__NR_finit_module, sys_finit_module),                     /* 273 */
    LINX_(__NR_sched_setattr, sys_sched_setattr),                   /* 274 */
    LINXY(__NR_sched_getattr, sys_sched_getattr),                   /* 275 */
-   LINX_(__NR_renameat2, sys_renameat2),                           /* 276 */
+   GENX_(__NR_renameat2, sys_renameat2),                           /* 276 */
    LINXY(__NR_getrandom, sys_getrandom),                           /* 278 */
    LINXY(__NR_memfd_create, sys_memfd_create),                     /* 279 */
    LINXY(__NR_bpf, sys_bpf),                                       /* 280 */
index dcec560d7f32d25b2dce4718ad32bc2b5cdefd67..2c403b6594559d7feced29d09015567f92fb3fdf 100644 (file)
@@ -827,7 +827,7 @@ static SyscallTableEntry syscall_table[] = {
 
    LINX_(__NR_sched_setattr, sys_sched_setattr),                      // 345
    LINXY(__NR_sched_getattr, sys_sched_getattr),                      // 346
-   LINX_(__NR_renameat2, sys_renameat2),                              // 347
+   GENX_(__NR_renameat2, sys_renameat2),                              // 347
 // ?????(__NR_seccomp, ),                                             // 348
    LINXY(__NR_getrandom, sys_getrandom),                              // 349
 
index af66797474d2dc9e2754caac6907735f28d97332..58944db755a76a3d3fc1159ac553dca6601d06b5 100644 (file)
@@ -1583,7 +1583,7 @@ static SyscallTableEntry syscall_table[] = {
 //   LIN__(__NR_finit_module,      sys_ni_syscall),     // 350
    LINX_(__NR_sched_setattr,     sys_sched_setattr),    // 351
    LINXY(__NR_sched_getattr,     sys_sched_getattr),    // 352
-   LINX_(__NR_renameat2,         sys_renameat2),        // 353
+   GENX_(__NR_renameat2,         sys_renameat2),        // 353
 //   LIN__(__NR_seccomp,           sys_ni_syscall),     // 354
 
    LINXY(__NR_getrandom,         sys_getrandom),        // 355
index fbfc5248401c537d6956cbf5a9476ebfc67c339b..5c3e51b93894f1b2de53089e3768de0f47101a97 100644 (file)
 #define __NR_kexec_load          599
 #define __NR_pdrfork             600
 #define __NR_pdwait              601
+#define __NR_renameat2           602
 
 
 #define __NR_freebsd_fake_sigreturn 1000
index 5d42d1da5e29f8b5f1bfb7792077b442fe6acd42..a82902f459719bf859dc38299cb70d6a652d616b 100644 (file)
@@ -2662,6 +2662,38 @@ int main(void)
    FAKE_SY("   ...\n");
    FAKE_SY(" Address 0x........ is not stack'd, malloc'd or (recently) free'd\n");
    FAKE_SY("\n");
+#endif
+
+   /* SYS_renameat2               602 */
+#if defined(SYS_renameat2)
+   GO(SYS_renameat2, "5s 2m");
+   SY(SYS_renameat2, x0+9999, x0+1, x0+9998, x0+1, x0+123456); FAIL;
+#else
+   FAKE_GO("602:           SYS_renameat2 5s 2m");
+   FAKE_SY("Syscall param renameat2(olddfd) contains uninitialised byte(s)\n");
+   FAKE_SY("   ...\n");
+   FAKE_SY("\n");
+   FAKE_SY("Syscall param renameat2(oldpath) contains uninitialised byte(s)\n");
+   FAKE_SY("   ...\n");
+   FAKE_SY("\n");
+   FAKE_SY("Syscall param renameat2(newdfd) contains uninitialised byte(s)\n");
+   FAKE_SY("   ...\n");
+   FAKE_SY("\n");
+   FAKE_SY("Syscall param renameat2(newpath) contains uninitialised byte(s)\n");
+   FAKE_SY("   ...\n");
+   FAKE_SY("\n");
+   FAKE_SY("Syscall param renameat2(flags) contains uninitialised byte(s)\n");
+   FAKE_SY("   ...\n");
+   FAKE_SY("\n");
+   FAKE_SY("Syscall param renameat2(oldpath) points to unaddressable byte(s)\n");
+   FAKE_SY("   ...\n");
+   FAKE_SY(" Address 0x........ is not stack'd, malloc'd or (recently) free'd\n");
+   FAKE_SY("\n");
+   FAKE_SY("Syscall param renameat2(newpath) points to unaddressable byte(s)\n");
+   FAKE_SY("   ...\n");
+   FAKE_SY(" Address 0x........ is not stack'd, malloc'd or (recently) free'd\n");
+   FAKE_SY("\n");
+
 #endif
 
    // no such syscall...
index 365413c66a1d777a5131a1e7c980274dab41ea2d..906de70c6ca806b2757f9197f145c5c152c14a37 100644 (file)
@@ -5950,6 +5950,32 @@ Syscall param pdwait(infop) points to unaddressable byte(s)
    ...
  Address 0x........ is not stack'd, malloc'd or (recently) free'd
 
+---------------------------------------------------------
+602:           SYS_renameat2 5s 2m
+---------------------------------------------------------
+Syscall param renameat2(olddfd) contains uninitialised byte(s)
+   ...
+
+Syscall param renameat2(oldpath) contains uninitialised byte(s)
+   ...
+
+Syscall param renameat2(newdfd) contains uninitialised byte(s)
+   ...
+
+Syscall param renameat2(newpath) contains uninitialised byte(s)
+   ...
+
+Syscall param renameat2(flags) contains uninitialised byte(s)
+   ...
+
+Syscall param renameat2(oldpath) points to unaddressable byte(s)
+   ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+Syscall param renameat2(newpath) points to unaddressable byte(s)
+   ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
 ---------------------------------------------------------
 9999:                    9999 1e
 ---------------------------------------------------------
index 8f3f5e1651822480d355fe8cd2b11d10ae0cbd42..b4e52b97ef800f24bff63b7e5bc7e2ec1d383104 100644 (file)
@@ -6022,6 +6022,32 @@ Syscall param pdwait(infop) points to unaddressable byte(s)
    ...
  Address 0x........ is not stack'd, malloc'd or (recently) free'd
 
+---------------------------------------------------------
+602:           SYS_renameat2 5s 2m
+---------------------------------------------------------
+Syscall param renameat2(olddfd) contains uninitialised byte(s)
+   ...
+
+Syscall param renameat2(oldpath) contains uninitialised byte(s)
+   ...
+
+Syscall param renameat2(newdfd) contains uninitialised byte(s)
+   ...
+
+Syscall param renameat2(newpath) contains uninitialised byte(s)
+   ...
+
+Syscall param renameat2(flags) contains uninitialised byte(s)
+   ...
+
+Syscall param renameat2(oldpath) points to unaddressable byte(s)
+   ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+Syscall param renameat2(newpath) points to unaddressable byte(s)
+   ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
 ---------------------------------------------------------
 9999:                    9999 1e
 ---------------------------------------------------------