[PATCH] linux-user: Implement fchmodat2 syscall

Peter Maydell posted 1 patch 5 months, 1 week ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20250710113123.1109461-1-peter.maydell@linaro.org
Maintainers: Laurent Vivier <laurent@vivier.eu>
linux-user/syscall.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
[PATCH] linux-user: Implement fchmodat2 syscall
Posted by Peter Maydell 5 months, 1 week ago
The fchmodat2 syscall is new from Linux 6.6; it is like the
existing fchmodat syscall except that it takes a flags parameter.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
v1->v2: don't bother with trying to fall back to libc fchmodat();
add missing braces for if()
---
 linux-user/syscall.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index fc37028597c..e1b1476936c 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -790,6 +790,10 @@ safe_syscall6(ssize_t, copy_file_range, int, infd, loff_t *, pinoff,
               int, outfd, loff_t *, poutoff, size_t, length,
               unsigned int, flags)
 #endif
+#if defined(TARGET_NR_fchmodat2) && defined(__NR_fchmodat2)
+safe_syscall4(int, fchmodat2, int, dfd, const char *, filename,
+              unsigned short, mode, unsigned int, flags)
+#endif
 
 /* We do ioctl like this rather than via safe_syscall3 to preserve the
  * "third argument might be integer or pointer or not present" behaviour of
@@ -10713,6 +10717,15 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1,
         ret = get_errno(fchmodat(arg1, p, arg3, 0));
         unlock_user(p, arg2, 0);
         return ret;
+#endif
+#if defined(TARGET_NR_fchmodat2) && defined(__NR_fchmodat2)
+    case TARGET_NR_fchmodat2:
+        if (!(p = lock_user_string(arg2))) {
+            return -TARGET_EFAULT;
+        }
+        ret = get_errno(safe_fchmodat2(arg1, p, arg3, arg4));
+        unlock_user(p, arg2, 0);
+        return ret;
 #endif
     case TARGET_NR_getpriority:
         /* Note that negative values are valid for getpriority, so we must
-- 
2.43.0
Re: [PATCH] linux-user: Implement fchmodat2 syscall
Posted by Richard Henderson 5 months, 1 week ago
On 7/10/25 05:31, Peter Maydell wrote:
> The fchmodat2 syscall is new from Linux 6.6; it is like the
> existing fchmodat syscall except that it takes a flags parameter.
> 
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
> v1->v2: don't bother with trying to fall back to libc fchmodat();
> add missing braces for if()

Queued.

r~
Re: [PATCH] linux-user: Implement fchmodat2 syscall
Posted by Richard Henderson 5 months, 1 week ago
On 7/10/25 05:31, Peter Maydell wrote:
> The fchmodat2 syscall is new from Linux 6.6; it is like the
> existing fchmodat syscall except that it takes a flags parameter.
> 
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
> v1->v2: don't bother with trying to fall back to libc fchmodat();
> add missing braces for if()
> ---
>   linux-user/syscall.c | 13 +++++++++++++
>   1 file changed, 13 insertions(+)

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

r~

> 
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index fc37028597c..e1b1476936c 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -790,6 +790,10 @@ safe_syscall6(ssize_t, copy_file_range, int, infd, loff_t *, pinoff,
>                 int, outfd, loff_t *, poutoff, size_t, length,
>                 unsigned int, flags)
>   #endif
> +#if defined(TARGET_NR_fchmodat2) && defined(__NR_fchmodat2)
> +safe_syscall4(int, fchmodat2, int, dfd, const char *, filename,
> +              unsigned short, mode, unsigned int, flags)
> +#endif
>   
>   /* We do ioctl like this rather than via safe_syscall3 to preserve the
>    * "third argument might be integer or pointer or not present" behaviour of
> @@ -10713,6 +10717,15 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1,
>           ret = get_errno(fchmodat(arg1, p, arg3, 0));
>           unlock_user(p, arg2, 0);
>           return ret;
> +#endif
> +#if defined(TARGET_NR_fchmodat2) && defined(__NR_fchmodat2)
> +    case TARGET_NR_fchmodat2:
> +        if (!(p = lock_user_string(arg2))) {
> +            return -TARGET_EFAULT;
> +        }
> +        ret = get_errno(safe_fchmodat2(arg1, p, arg3, arg4));
> +        unlock_user(p, arg2, 0);
> +        return ret;
>   #endif
>       case TARGET_NR_getpriority:
>           /* Note that negative values are valid for getpriority, so we must
Re: [PATCH] linux-user: Implement fchmodat2 syscall
Posted by Philippe Mathieu-Daudé 5 months, 1 week ago
On 10/7/25 13:31, Peter Maydell wrote:
> The fchmodat2 syscall is new from Linux 6.6; it is like the
> existing fchmodat syscall except that it takes a flags parameter.
> 
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
> v1->v2: don't bother with trying to fall back to libc fchmodat();
> add missing braces for if()
> ---
>   linux-user/syscall.c | 13 +++++++++++++
>   1 file changed, 13 insertions(+)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>


Re: [PATCH v2] linux-user: Implement fchmodat2 syscall
Posted by Peter Maydell 5 months, 1 week ago
On Thu, 10 Jul 2025 at 12:31, Peter Maydell <peter.maydell@linaro.org> wrote:
>
> The fchmodat2 syscall is new from Linux 6.6; it is like the
> existing fchmodat syscall except that it takes a flags parameter.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
> v1->v2: don't bother with trying to fall back to libc fchmodat();
> add missing braces for if()

I forgot to put 'v2' in the subject, but this is indeed version 2 :-)

> ---
>  linux-user/syscall.c | 13 +++++++++++++
>  1 file changed, 13 insertions(+)
>
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index fc37028597c..e1b1476936c 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -790,6 +790,10 @@ safe_syscall6(ssize_t, copy_file_range, int, infd, loff_t *, pinoff,
>                int, outfd, loff_t *, poutoff, size_t, length,
>                unsigned int, flags)
>  #endif
> +#if defined(TARGET_NR_fchmodat2) && defined(__NR_fchmodat2)
> +safe_syscall4(int, fchmodat2, int, dfd, const char *, filename,
> +              unsigned short, mode, unsigned int, flags)
> +#endif
>
>  /* We do ioctl like this rather than via safe_syscall3 to preserve the
>   * "third argument might be integer or pointer or not present" behaviour of
> @@ -10713,6 +10717,15 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1,
>          ret = get_errno(fchmodat(arg1, p, arg3, 0));
>          unlock_user(p, arg2, 0);
>          return ret;
> +#endif
> +#if defined(TARGET_NR_fchmodat2) && defined(__NR_fchmodat2)
> +    case TARGET_NR_fchmodat2:
> +        if (!(p = lock_user_string(arg2))) {
> +            return -TARGET_EFAULT;
> +        }
> +        ret = get_errno(safe_fchmodat2(arg1, p, arg3, arg4));
> +        unlock_user(p, arg2, 0);
> +        return ret;
>  #endif
>      case TARGET_NR_getpriority:
>          /* Note that negative values are valid for getpriority, so we must
> --
> 2.43.0
>
Re: [PATCH v2] linux-user: Implement fchmodat2 syscall
Posted by Peter Maydell 5 months, 1 week ago
On Thu, 10 Jul 2025 at 12:36, Peter Maydell <peter.maydell@linaro.org> wrote:
>
> On Thu, 10 Jul 2025 at 12:31, Peter Maydell <peter.maydell@linaro.org> wrote:
> >
> > The fchmodat2 syscall is new from Linux 6.6; it is like the
> > existing fchmodat syscall except that it takes a flags parameter.
> >
> > Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> > ---
> > v1->v2: don't bother with trying to fall back to libc fchmodat();
> > add missing braces for if()
>
> I forgot to put 'v2' in the subject, but this is indeed version 2 :-)

Oh, and also

Resolves: https://gitlab.com/qemu-project/qemu/-/issues/3019

thanks
-- PMM