linux-user: Flush out implementation of gettimeofday

The first argument, timeval, is allowed to be NULL.

The second argument, timezone, was missing.  While its use is
deprecated, it is still present in the syscall.

Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20200213032223.14643-6-richard.henderson@linaro.org>
[lv: add "#if defined(TARGET_NR_gettimeofday)"]
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
This commit is contained in:
Richard Henderson 2020-02-12 19:22:23 -08:00 committed by Laurent Vivier
parent bf02adcd88
commit a52f5f87be
1 changed files with 27 additions and 2 deletions

View File

@ -1273,6 +1273,25 @@ static inline abi_long host_to_target_timespec64(abi_ulong target_addr,
return 0;
}
#if defined(TARGET_NR_gettimeofday)
static inline abi_long copy_to_user_timezone(abi_ulong target_tz_addr,
struct timezone *tz)
{
struct target_timezone *target_tz;
if (!lock_user_struct(VERIFY_WRITE, target_tz, target_tz_addr, 1)) {
return -TARGET_EFAULT;
}
__put_user(tz->tz_minuteswest, &target_tz->tz_minuteswest);
__put_user(tz->tz_dsttime, &target_tz->tz_dsttime);
unlock_user_struct(target_tz, target_tz_addr, 1);
return 0;
}
#endif
#if defined(TARGET_NR_settimeofday)
static inline abi_long copy_from_user_timezone(struct timezone *tz,
abi_ulong target_tz_addr)
@ -8710,10 +8729,16 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
case TARGET_NR_gettimeofday:
{
struct timeval tv;
ret = get_errno(gettimeofday(&tv, NULL));
struct timezone tz;
ret = get_errno(gettimeofday(&tv, &tz));
if (!is_error(ret)) {
if (copy_to_user_timeval(arg1, &tv))
if (arg1 && copy_to_user_timeval(arg1, &tv)) {
return -TARGET_EFAULT;
}
if (arg2 && copy_to_user_timezone(arg2, &tz)) {
return -TARGET_EFAULT;
}
}
}
return ret;