From patchwork Mon Dec 31 19:53:30 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: linux-user: correct setsockopt() SO_SNDTIMEO and SO_RCVTIMEO take a struct timeval, not an int X-Patchwork-Submitter: Laurent Vivier X-Patchwork-Id: 208894 Message-Id: <1356983610-14793-1-git-send-email-laurent@vivier.eu> To: qemu-devel@nongnu.org Cc: Riku Voipio , Laurent Vivier Date: Mon, 31 Dec 2012 20:53:30 +0100 From: Laurent Vivier List-Id: From: Laurent Vivier Signed-off-by: Laurent Vivier --- linux-user/syscall.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index e99adab..1530c8f 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -1491,6 +1491,25 @@ static abi_long do_setsockopt(int sockfd, int level, int optname, break; case TARGET_SOL_SOCKET: switch (optname) { + case TARGET_SO_RCVTIMEO: { + struct timeval tv; + + optname = SO_RCVTIMEO; + +set_timeout: + if (optlen != sizeof(struct target_timeval)) + return -TARGET_EINVAL; + + if (copy_from_user_timeval(&tv, optval_addr)) + return -TARGET_EFAULT; + + ret = get_errno(setsockopt(sockfd, SOL_SOCKET, optname, + &tv, sizeof(tv))); + return ret; + } + case TARGET_SO_SNDTIMEO: + optname = SO_SNDTIMEO; + goto set_timeout; /* Options with 'int' argument. */ case TARGET_SO_DEBUG: optname = SO_DEBUG; @@ -1542,13 +1561,6 @@ static abi_long do_setsockopt(int sockfd, int level, int optname, case TARGET_SO_RCVLOWAT: optname = SO_RCVLOWAT; break; - case TARGET_SO_RCVTIMEO: - optname = SO_RCVTIMEO; - break; - case TARGET_SO_SNDTIMEO: - optname = SO_SNDTIMEO; - break; - break; default: goto unimplemented; }