From: Helge Deller <[email protected]> Add handlers for both sockopts which use 64-bit time_t from userspace.
Resolves: https://gitlab.com/qemu-project/qemu/-/work_items/885 Signed-off-by: Helge Deller <[email protected]> (cherry picked from commit edb4588309a753dea40f338fb8e02e3cfc2eed70) Signed-off-by: Michael Tokarev <[email protected]> diff --git a/linux-user/syscall.c b/linux-user/syscall.c index ea1711ff95..d2c98b7237 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -1147,7 +1147,6 @@ static inline abi_long copy_to_user_timeval(abi_ulong target_tv_addr, return 0; } -#if defined(TARGET_NR_clock_adjtime64) && defined(CONFIG_CLOCK_ADJTIME) static inline abi_long copy_from_user_timeval64(struct timeval *tv, abi_ulong target_tv_addr) { @@ -1164,7 +1163,6 @@ static inline abi_long copy_from_user_timeval64(struct timeval *tv, return 0; } -#endif static inline abi_long copy_to_user_timeval64(abi_ulong target_tv_addr, const struct timeval *tv) @@ -2395,6 +2393,25 @@ static abi_long do_setsockopt(int sockfd, int level, int optname, &tv, sizeof(tv))); return ret; } + case TARGET_SO_RCVTIMEO_NEW: + case TARGET_SO_SNDTIMEO_NEW: + { + struct timeval tv; + + if (optlen != sizeof(struct target__kernel_sock_timeval)) { + return -TARGET_EINVAL; + } + + if (copy_from_user_timeval64(&tv, optval_addr)) { + return -TARGET_EFAULT; + } + + ret = get_errno(setsockopt(sockfd, SOL_SOCKET, + optname == TARGET_SO_RCVTIMEO_NEW ? + SO_RCVTIMEO : SO_SNDTIMEO, + &tv, sizeof(tv))); + return ret; + } case TARGET_SO_ATTACH_FILTER: { struct target_sock_fprog *tfprog; -- 2.47.3
