[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2] linux-user/syscall.c: Add SO_RCVTIMEO and SO
From: |
Laurent Vivier |
Subject: |
Re: [Qemu-devel] [PATCH v2] linux-user/syscall.c: Add SO_RCVTIMEO and SO_SNDTIMEO for getsockopt |
Date: |
Mon, 11 Jan 2016 10:07:52 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.4.0 |
Le 11/01/2016 09:54, address@hidden a écrit :
> From: Chen Gang <address@hidden>
>
> Implement them according to the other features implementations.
>
> Signed-off-by: Chen Gang <address@hidden>
> ---
> linux-user/syscall.c | 27 +++++++++++++++++++++++++--
> 1 file changed, 25 insertions(+), 2 deletions(-)
>
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index 44485f2..4c68800 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -1687,6 +1687,7 @@ static abi_long do_getsockopt(int sockfd, int level,
> int optname,
> abi_long ret;
> int len, val;
> socklen_t lv;
> + struct timeval tv;
>
> switch(level) {
> case TARGET_SOL_SOCKET:
> @@ -1694,10 +1695,32 @@ static abi_long do_getsockopt(int sockfd, int level,
> int optname,
> switch (optname) {
> /* These don't just return a single integer */
> case TARGET_SO_LINGER:
> - case TARGET_SO_RCVTIMEO:
> - case TARGET_SO_SNDTIMEO:
> case TARGET_SO_PEERNAME:
> goto unimplemented;
> + case TARGET_SO_RCVTIMEO:
> + optname = SO_RCVTIMEO;
> + goto time_case;
> + case TARGET_SO_SNDTIMEO:
> + optname = SO_SNDTIMEO;
> + time_case:
> + if (get_user_u32(len, optlen)) {
> + return -TARGET_EFAULT;
> + }
> + if (len < sizeof(struct target_timeval)) {
> + return -TARGET_EINVAL;
> + }
Check len >= 0.
> + lv = sizeof(tv);
> + ret = get_errno(getsockopt(sockfd, level, optname, &tv, &lv));
> + if (ret < 0) {
> + return ret;
> + }
> + if (copy_to_user_timeval(optval_addr, &tv)) {
> + return -TARGET_EFAULT;
> + }
> + if (put_user_u32(sizeof(struct target_timeval), optlen)) {
Put in optlen the result of getsockopt(), i.e. "lv", or check lv ==
sizeof(struct target_timeval).
> + return -TARGET_EFAULT;
> + }
> + break;
> case TARGET_SO_PEERCRED: {
> struct ucred cr;
> socklen_t crlen;
>