From: Laurent Vivier <laurent@vivier.eu>
To: chengang@emindsoft.com.cn, riku.voipio@iki.fi
Cc: peter.maydell@linaro.org, Chen Gang <gang.chen.5i5j@gmail.com>,
qemu-devel@nongnu.org, rth@twiddle.net
Subject: Re: [Qemu-devel] [PATCH] linux-user: syscall: Add SO_LINGER for setsockopt
Date: Fri, 8 Jan 2016 09:38:37 +0100 [thread overview]
Message-ID: <568F758D.30405@vivier.eu> (raw)
In-Reply-To: <1452218586-4009-1-git-send-email-chengang@emindsoft.com.cn>
Le 08/01/2016 03:03, chengang@emindsoft.com.cn a écrit :
> From: Chen Gang <chengang@emindsoft.com.cn>
>
> Just implement it according to the other features implementations.
>
> Signed-off-by: Chen Gang <gang.chen.5i5j@gmail.com>
> ---
> linux-user/syscall.c | 16 +++++++++++++++-
> linux-user/syscall_defs.h | 5 +++++
> 2 files changed, 20 insertions(+), 1 deletion(-)
>
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index f27148a..9f2c871 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -1409,6 +1409,9 @@ static abi_long do_setsockopt(int sockfd, int level, int optname,
> int val;
> struct ip_mreqn *ip_mreq;
> struct ip_mreq_source *ip_mreq_source;
> + struct linger lg;
> + struct target_linger *tlg;
> +
>
> switch(level) {
> case SOL_TCP:
> @@ -1659,7 +1662,19 @@ set_timeout:
> case TARGET_SO_RCVLOWAT:
> optname = SO_RCVLOWAT;
> break;
> - break;
> + case TARGET_SO_LINGER:
> + optname = SO_LINGER;
> + if (optlen != sizeof(struct target_linger)) {
> + return -TARGET_EINVAL;
> + }
OK, this time you're right, there is this check in the kernel too...
and optlen is really the length for setsockopt(), not a pointer.
> + if (!lock_user_struct(VERIFY_READ, tlg, optval_addr, 1)) {
> + return -TARGET_EFAULT;
> + }
> + __get_user(lg.l_onoff, &tlg->l_onoff);
> + __get_user(lg.l_linger, &tlg->l_linger);
> + unlock_user_struct(tlg, optval_addr, 0);
You can't unlock the structure you're going to use.
> + return get_errno(setsockopt(sockfd, SOL_SOCKET, optname,
> + &lg, sizeof(lg)));
Why do you use "SOL_SOCKET" instead of "level" ?
> default:
> goto unimplemented;
> }
> diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
> index 9d3c537..5a4d565 100644
> --- a/linux-user/syscall_defs.h
> +++ b/linux-user/syscall_defs.h
> @@ -165,6 +165,11 @@ struct target_ip_mreq_source {
> uint32_t imr_sourceaddr;
> };
>
> +struct target_linger {
> + int l_onoff; /* Linger active */
> + int l_linger; /* How long to linger for */
> +};
> +
Must be "abi_int" to force good alignment for the target.
> struct target_timeval {
> abi_long tv_sec;
> abi_long tv_usec;
>
next prev parent reply other threads:[~2016-01-08 8:39 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-08 2:03 [Qemu-devel] [PATCH] linux-user: syscall: Add SO_LINGER for setsockopt chengang
2016-01-08 8:38 ` Laurent Vivier [this message]
2016-01-08 9:45 ` Chen Gang
2016-01-08 9:57 ` Laurent Vivier
2016-01-08 10:13 ` Chen Gang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=568F758D.30405@vivier.eu \
--to=laurent@vivier.eu \
--cc=chengang@emindsoft.com.cn \
--cc=gang.chen.5i5j@gmail.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=riku.voipio@iki.fi \
--cc=rth@twiddle.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.