[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] linux-user: Fix 'utimensat()' implementation
From: |
Laurent Vivier |
Subject: |
Re: [PATCH] linux-user: Fix 'utimensat()' implementation |
Date: |
Tue, 11 Aug 2020 14:51:57 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 |
Le 11/08/2020 à 13:31, Filip Bozuta a écrit :
> Implementation of syscall 'utimensat()' in 'syscall.c' uses functions
> target_to_host/host_to_target_timespec() to convert values of
> 'struct timespec' between host and target. However, the implementation
> doesn't check whether the conversion succeeds and thus can cause an
> inappropriate error or succeed unappropriately instead of setting errno
> EFAULT ('Bad address') which is supposed to be set in these cases.
>
> This was confirmed with the LTP test for utimensat ('testcases/utimensat')
> which fails for test cases when the errno EFAULT is expected. After changes
> from this patch, the test passes for all test cases.
>
> Signed-off-by: Filip Bozuta <Filip.Bozuta@syrmia.com>
> ---
> linux-user/syscall.c | 9 +++++++--
> 1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index 05f03919ff..920656191b 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -11722,8 +11722,13 @@ static abi_long do_syscall1(void *cpu_env, int num,
> abi_long arg1,
> if (!arg3) {
> tsp = NULL;
> } else {
> - target_to_host_timespec(ts, arg3);
> - target_to_host_timespec(ts+1, arg3+sizeof(struct
> target_timespec));
> + if (target_to_host_timespec(ts, arg3)) {
> + return -TARGET_EFAULT;
> + }
> + if (target_to_host_timespec(ts + 1, arg3 +
> + sizeof(struct target_timespec)))
> {
> + return -TARGET_EFAULT;
> + }
> tsp = ts;
> }
> if (!arg2)
>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>