Le 18/09/2022 à 21:45, Helge Deller a écrit :
> Signed-off-by: Helge Deller <deller@gmx.de>
> ---
> linux-user/strace.list | 3 +++
> linux-user/syscall.c | 16 ++++++++++++++++
> 2 files changed, 19 insertions(+)
>
> diff --git a/linux-user/strace.list b/linux-user/strace.list
> index 215d971b2a..ad9ef94689 100644
> --- a/linux-user/strace.list
> +++ b/linux-user/strace.list
> @@ -103,6 +103,9 @@
> #ifdef TARGET_NR_close
> { TARGET_NR_close, "close" , "%s(%d)", NULL, NULL },
> #endif
> +#ifdef TARGET_NR_close_range
> +{ TARGET_NR_close_range, "close_range" , "%s(%d,%d,%d)", NULL, NULL },
> +#endif
> #ifdef TARGET_NR_connect
> { TARGET_NR_connect, "connect" , "%s(%d,%#x,%d)", NULL, NULL },
> #endif
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index ca39acfceb..2e0e974562 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -338,6 +338,10 @@ _syscall3(int,sys_syslog,int,type,char*,bufp,int,len)
> #ifdef __NR_exit_group
> _syscall1(int,exit_group,int,error_code)
> #endif
> +#if defined(__NR_close_range) && defined(TARGET_NR_close_range)
> +#define __NR_sys_close_range __NR_close_range
> +_syscall3(int,sys_close_range,int,first,int,last,int,flags)
> +#endif
> #if defined(__NR_futex)
> _syscall6(int,sys_futex,int *,uaddr,int,op,int,val,
> const struct timespec *,timeout,int *,uaddr2,int,val3)
> @@ -8721,6 +8725,18 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1,
> case TARGET_NR_close:
> fd_trans_unregister(arg1);
> return get_errno(close(arg1));
> +#if defined(__NR_close_range) && defined(TARGET_NR_close_range)
> + case TARGET_NR_close_range:
> + {
> + abi_long fd;
> + abi_long maxfd = (arg2 == (abi_long)-1) ? target_fd_max : arg2;
> +
> + for (fd = arg1; fd <= maxfd; fd++) {
> + fd_trans_unregister(fd);
> + }
> + }
> + return get_errno(sys_close_range(arg1, arg2, arg3));
if flags is CLOSE_RANGE_CLOEXEC, the fd is not closed so you don't want to call
fd_trans_unregister() in this case.
It would be better to call fd_trans_unregister() loop only if sys_close_range() doesn't fail.
Thanks,
Laurent
> +#endif
>
> case TARGET_NR_brk:
> return do_brk(arg1);
> --
> 2.37.3
>
>