From patchwork Tue Jan 8 05:22:53 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Deepa Dinamani X-Patchwork-Id: 1021738 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="bTm5iHsc"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43Ygf52DkFz9sLw for ; Tue, 8 Jan 2019 16:23:41 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727734AbfAHFXg (ORCPT ); Tue, 8 Jan 2019 00:23:36 -0500 Received: from mail-pl1-f194.google.com ([209.85.214.194]:39277 "EHLO mail-pl1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725800AbfAHFXg (ORCPT ); Tue, 8 Jan 2019 00:23:36 -0500 Received: by mail-pl1-f194.google.com with SMTP id 101so1293129pld.6; Mon, 07 Jan 2019 21:23:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=qlZNbPAO/J9Uvse4XP1zTWd0WA+l2Rw7kNOKGh7RDBI=; b=bTm5iHscvl68zC9mxYTeUxZ54NnEuW7J7294APLsNviavHRpbwCp4tYFz5ezV/lT4R md/wQ4SjpbCOHWaLVqX61PmBmDtotUMQRa1CYMqrlzLxq0TKJsBHYCaGAb2Zv5BcDi+4 kDz2VrwbsK0W1pz8maJIFEwoEQs1bn2NlkmKop591Tvs0SsjdrkjiRUevL3bwUznChpA d2JDX2nfikTDeEUkaqkkSCUar7QMRaDgOm/IbSpYy2qZPmhYXTY8BOESpyixH2umdhkt pOfxyh6wwc6vqX95e5YfZsoJNwuuXkt83T7aUOr8LP2T2YgzEI9yMDkIayplbfyJueFA Oc8w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=qlZNbPAO/J9Uvse4XP1zTWd0WA+l2Rw7kNOKGh7RDBI=; b=tBLJpB9Cx2k6YVPK1CvhdRQt/e6ghPiY7yzZsi1HL0ZJTg94qvrrz96115YcUbJTDT twmKDPZkdhRRmmU19AzZJ3Oii4CoyXPFnrF7KZphQ2H/8A5Dh1VpcqKQWBTw0eTKT/CK Rk4HV1lndExaLbTbrvMaWK3OZfe5iwcOyAgLvPeAN99dJL0gFYET7nWRjOmC4iSjgGij B7f+14bxCEM4crmlpZ0VETectucGugy2qgIILOByblMq9N1fSg/2An/8qu49IYeLU0eL /zrNOki4sP44tgb6cgP5KD29OUDVUiiZ4ToBONJuHS2/ulPdzyRSm5qSPgV2g+P34Qbu +vPA== X-Gm-Message-State: AJcUukfiExbaonxz1qq0gh53+Y8xBzHcmwVIDPiBPjKWGp2CkxFA2OkC 4Ja+LyQmMiUuvbCU6Pdw96w= X-Google-Smtp-Source: ALg8bN5qJWgM2NqN9rf4TsDadT2YZr9Y4MDsUjP3cOoGCjBhAdsYIMOm8pvJaalJHiRBnFkhyWZ3Vw== X-Received: by 2002:a17:902:6a4:: with SMTP id 33mr365443plh.99.1546925015480; Mon, 07 Jan 2019 21:23:35 -0800 (PST) Received: from deepa-ubuntu.lan (c-98-234-52-230.hsd1.ca.comcast.net. [98.234.52.230]) by smtp.gmail.com with ESMTPSA id x127sm102710626pfd.156.2019.01.07.21.23.34 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 07 Jan 2019 21:23:35 -0800 (PST) From: Deepa Dinamani To: davem@davemloft.net, linux-kernel@vger.kernel.org Cc: netdev@vger.kernel.org, arnd@arndb.de, y2038@lists.linaro.org Subject: [PATCH 1/3] socket: Use old_timeval types for socket timeouts Date: Mon, 7 Jan 2019 21:22:53 -0800 Message-Id: <20190108052255.10699-2-deepa.kernel@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190108052255.10699-1-deepa.kernel@gmail.com> References: <20190108052255.10699-1-deepa.kernel@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org As part of y2038 solution, all internal uses of struct timeval are replaced by struct __kernel_old_timeval and struct compat_timeval by struct old_timeval32. Make socket timeouts use these new types. This is mainly to be able to verify that the kernel build is y2038 safe when such non y2038 safe types are not supported anymore. Signed-off-by: Deepa Dinamani --- net/compat.c | 10 +++++----- net/core/sock.c | 8 ++++---- net/vmw_vsock/af_vsock.c | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/net/compat.c b/net/compat.c index b6ff0899e424..cbc15f65033c 100644 --- a/net/compat.c +++ b/net/compat.c @@ -351,8 +351,8 @@ static int do_set_attach_filter(struct socket *sock, int level, int optname, static int do_set_sock_timeout(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen) { - struct compat_timeval __user *up = (struct compat_timeval __user *)optval; - struct timeval ktime; + struct old_timeval32 __user *up = (struct old_timeval32 __user *)optval; + struct __kernel_old_timeval ktime; mm_segment_t old_fs; int err; @@ -420,12 +420,12 @@ COMPAT_SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, optname, static int do_get_sock_timeout(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen) { - struct compat_timeval __user *up; - struct timeval ktime; + struct old_timeval32 __user *up; + struct __kernel_old_timeval ktime; mm_segment_t old_fs; int len, err; - up = (struct compat_timeval __user *)optval; + up = (struct old_timeval32 __user *)optval; if (get_user(len, optlen)) return -EFAULT; if (len < sizeof(*up)) diff --git a/net/core/sock.c b/net/core/sock.c index 78df5228ffbd..af0fb33624e2 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -337,7 +337,7 @@ EXPORT_SYMBOL(__sk_backlog_rcv); static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen) { - struct timeval tv; + struct __kernel_old_timeval tv; if (optlen < sizeof(tv)) return -EINVAL; @@ -1113,7 +1113,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname, int val; u64 val64; struct linger ling; - struct timeval tm; + struct __kernel_old_timeval tm; struct sock_txtime txtime; } v; @@ -1223,7 +1223,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname, break; case SO_RCVTIMEO: - lv = sizeof(struct timeval); + lv = sizeof(struct __kernel_old_timeval); if (sk->sk_rcvtimeo == MAX_SCHEDULE_TIMEOUT) { v.tm.tv_sec = 0; v.tm.tv_usec = 0; @@ -1234,7 +1234,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname, break; case SO_SNDTIMEO: - lv = sizeof(struct timeval); + lv = sizeof(struct __kernel_old_timeval); if (sk->sk_sndtimeo == MAX_SCHEDULE_TIMEOUT) { v.tm.tv_sec = 0; v.tm.tv_usec = 0; diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c index 43a1dec08825..e1149bf1b57b 100644 --- a/net/vmw_vsock/af_vsock.c +++ b/net/vmw_vsock/af_vsock.c @@ -1439,7 +1439,7 @@ static int vsock_stream_setsockopt(struct socket *sock, break; case SO_VM_SOCKETS_CONNECT_TIMEOUT: { - struct timeval tv; + struct __kernel_old_timeval tv; COPY_IN(tv); if (tv.tv_sec >= 0 && tv.tv_usec < USEC_PER_SEC && tv.tv_sec < (MAX_SCHEDULE_TIMEOUT / HZ - 1)) { @@ -1517,7 +1517,7 @@ static int vsock_stream_getsockopt(struct socket *sock, break; case SO_VM_SOCKETS_CONNECT_TIMEOUT: { - struct timeval tv; + struct __kernel_old_timeval tv; tv.tv_sec = vsk->connect_timeout / HZ; tv.tv_usec = (vsk->connect_timeout - From patchwork Tue Jan 8 05:22:54 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Deepa Dinamani X-Patchwork-Id: 1021739 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="ldZu1KMf"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43YgfD4CNSz9sMp for ; Tue, 8 Jan 2019 16:23:48 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727785AbfAHFXn (ORCPT ); Tue, 8 Jan 2019 00:23:43 -0500 Received: from mail-pl1-f194.google.com ([209.85.214.194]:40865 "EHLO mail-pl1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725800AbfAHFXm (ORCPT ); Tue, 8 Jan 2019 00:23:42 -0500 Received: by mail-pl1-f194.google.com with SMTP id u18so1295694plq.7; Mon, 07 Jan 2019 21:23:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=fsxApbPTdH0ZVYT58ewomrGU7r5AJ7JG2rjpSw7mFu4=; b=ldZu1KMfk/1+FgOSV0qg+oIQlleKEWVHqLtXsS4idX3pvzho2OBPue0rPol6gJRsIa sFjbuejPz0tO9x5X8qnwH2t8FWAgr8EsfxqPEl713qZx6BO4J9pXAHq94eCqg972QtiH fO4ltlbVNc60/aferzTWKXbUrgPFxWuh//Qd8+e7OhjOSTdeOumXIlmsoCZLQ+IRZcRq y/xjJPu9aO/AffFyvIsLQYPizB1X5YL0ykxyDEEvD/RXfX6M5+Nk8HvsrpWv4iOA7yxr vPzxjk/fTwt8WIUWfU+atgj9bYfu7ltYMDhKAVAV9eTqRvWaV2AVAjIdXc5XsuqBEgun a4jA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=fsxApbPTdH0ZVYT58ewomrGU7r5AJ7JG2rjpSw7mFu4=; b=b1dWA6wUUUIGbvZZYuyPglO/LRPMB2GlewORT4smQwQMhbcGR9BVdCIkK375zEKFf4 KKZGl2QBwz32tWptry2DoSmq+cslQylFxCvs9iAFWMsS6ar6y5HTFClq907cdUh9FixT eGbj6JplBM16AktZa7OaI5YPhm24d0JKyqv1Xi9XRuGv8VcWRwaiXc1flmfJyJWQN/Fn kxMyZcYlMnnR3zxR0rmiUZW6vEE9fuGdCDkfHqoDHXN5+YemlROUJu/3W51RqIpxtUA4 uxI6ctWYOq2/mQODf6vjFbBiRMzbs5Kw2MlyGOBeqP5SUPggbyX7IyZOmt59YmjPNiXz WVBg== X-Gm-Message-State: AJcUukfD+d4NpJ0EVeJ60EKzS8um5DDfyGPLJXyxE/xsSwUjmAYSbOVB qUVqSIkfUThmn/VmN6AhOz4= X-Google-Smtp-Source: ALg8bN4xVGo7Zrmlr6oQHTVbi+Wi7CE0X1SN12+BnVP21GkxeCswTGIkslT5NC1TVFZPMM2n9/M8oA== X-Received: by 2002:a17:902:4601:: with SMTP id o1mr364016pld.243.1546925020738; Mon, 07 Jan 2019 21:23:40 -0800 (PST) Received: from deepa-ubuntu.lan (c-98-234-52-230.hsd1.ca.comcast.net. [98.234.52.230]) by smtp.gmail.com with ESMTPSA id x127sm102710626pfd.156.2019.01.07.21.23.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 07 Jan 2019 21:23:40 -0800 (PST) From: Deepa Dinamani To: davem@davemloft.net, linux-kernel@vger.kernel.org Cc: netdev@vger.kernel.org, arnd@arndb.de, y2038@lists.linaro.org, ccaulfie@redhat.com, deller@gmx.de, paulus@samba.org, ralf@linux-mips.org, rth@twiddle.net, cluster-devel@redhat.com, linuxppc-dev@lists.ozlabs.org, linux-alpha@vger.kernel.org, linux-arch@vger.kernel.org, linux-mips@vger.kernel.org, linux-parisc@vger.kernel.org, sparclinux@vger.kernel.org Subject: [PATCH 2/3] socket: Rename SO_RCVTIMEO/ SO_SNDTIMEO with _OLD suffixes Date: Mon, 7 Jan 2019 21:22:54 -0800 Message-Id: <20190108052255.10699-3-deepa.kernel@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190108052255.10699-1-deepa.kernel@gmail.com> References: <20190108052255.10699-1-deepa.kernel@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org SO_RCVTIMEO and SO_SNDTIMEO socket options use struct timeval as the time format. struct timeval is not y2038 safe. The subsequent patches in the series add support for new socket timeout options with _NEW suffix that are y2038 safe. Rename the existing options with _OLD suffix forms so that the right option is enabled for userspace applications according to the architecture and time_t definition of libc. Signed-off-by: Deepa Dinamani Cc: ccaulfie@redhat.com Cc: deller@gmx.de Cc: paulus@samba.org Cc: ralf@linux-mips.org Cc: rth@twiddle.net Cc: cluster-devel@redhat.com Cc: linuxppc-dev@lists.ozlabs.org Cc: linux-alpha@vger.kernel.org Cc: linux-arch@vger.kernel.org Cc: linux-mips@vger.kernel.org Cc: linux-parisc@vger.kernel.org Cc: sparclinux@vger.kernel.org --- arch/alpha/include/uapi/asm/socket.h | 7 +++++-- arch/mips/include/uapi/asm/socket.h | 6 ++++-- arch/parisc/include/uapi/asm/socket.h | 6 ++++-- arch/powerpc/include/uapi/asm/socket.h | 4 ++-- arch/sparc/include/uapi/asm/socket.h | 6 ++++-- fs/dlm/lowcomms.c | 4 ++-- include/net/sock.h | 4 ++-- include/uapi/asm-generic/socket.h | 6 ++++-- net/compat.c | 4 ++-- net/core/sock.c | 8 ++++---- 10 files changed, 33 insertions(+), 22 deletions(-) diff --git a/arch/alpha/include/uapi/asm/socket.h b/arch/alpha/include/uapi/asm/socket.h index da08412bd49f..ea3ba981d8a0 100644 --- a/arch/alpha/include/uapi/asm/socket.h +++ b/arch/alpha/include/uapi/asm/socket.h @@ -31,8 +31,8 @@ #define SO_RCVBUFFORCE 0x100b #define SO_RCVLOWAT 0x1010 #define SO_SNDLOWAT 0x1011 -#define SO_RCVTIMEO 0x1012 -#define SO_SNDTIMEO 0x1013 +#define SO_RCVTIMEO_OLD 0x1012 +#define SO_SNDTIMEO_OLD 0x1013 #define SO_ACCEPTCONN 0x1014 #define SO_PROTOCOL 0x1028 #define SO_DOMAIN 0x1029 @@ -120,6 +120,9 @@ #if !defined(__KERNEL__) +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLD + #if __BITS_PER_LONG == 64 #define SO_TIMESTAMP SO_TIMESTAMP_OLD #define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD diff --git a/arch/mips/include/uapi/asm/socket.h b/arch/mips/include/uapi/asm/socket.h index 1e48f67f1052..4dde20d64690 100644 --- a/arch/mips/include/uapi/asm/socket.h +++ b/arch/mips/include/uapi/asm/socket.h @@ -39,8 +39,8 @@ #define SO_RCVBUF 0x1002 /* Receive buffer. */ #define SO_SNDLOWAT 0x1003 /* send low-water mark */ #define SO_RCVLOWAT 0x1004 /* receive low-water mark */ -#define SO_SNDTIMEO 0x1005 /* send timeout */ -#define SO_RCVTIMEO 0x1006 /* receive timeout */ +#define SO_SNDTIMEO_OLD 0x1005 /* send timeout */ +#define SO_RCVTIMEO_OLD 0x1006 /* receive timeout */ #define SO_ACCEPTCONN 0x1009 #define SO_PROTOCOL 0x1028 /* protocol type */ #define SO_DOMAIN 0x1029 /* domain/socket family */ @@ -130,6 +130,8 @@ #if !defined(__KERNEL__) +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLD #if __BITS_PER_LONG == 64 #define SO_TIMESTAMP SO_TIMESTAMP_OLD #define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD diff --git a/arch/parisc/include/uapi/asm/socket.h b/arch/parisc/include/uapi/asm/socket.h index e8d6cf20f9a4..546937fa0d8b 100644 --- a/arch/parisc/include/uapi/asm/socket.h +++ b/arch/parisc/include/uapi/asm/socket.h @@ -22,8 +22,8 @@ #define SO_RCVBUFFORCE 0x100b #define SO_SNDLOWAT 0x1003 #define SO_RCVLOWAT 0x1004 -#define SO_SNDTIMEO 0x1005 -#define SO_RCVTIMEO 0x1006 +#define SO_SNDTIMEO_OLD 0x1005 +#define SO_RCVTIMEO_OLD 0x1006 #define SO_ERROR 0x1007 #define SO_TYPE 0x1008 #define SO_PROTOCOL 0x1028 @@ -111,6 +111,8 @@ #if !defined(__KERNEL__) +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLD #if __BITS_PER_LONG == 64 #define SO_TIMESTAMP SO_TIMESTAMP_OLD #define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD diff --git a/arch/powerpc/include/uapi/asm/socket.h b/arch/powerpc/include/uapi/asm/socket.h index 94de465e0920..12aa0c43e775 100644 --- a/arch/powerpc/include/uapi/asm/socket.h +++ b/arch/powerpc/include/uapi/asm/socket.h @@ -11,8 +11,8 @@ #define SO_RCVLOWAT 16 #define SO_SNDLOWAT 17 -#define SO_RCVTIMEO 18 -#define SO_SNDTIMEO 19 +#define SO_RCVTIMEO_OLD 18 +#define SO_SNDTIMEO_OLD 19 #define SO_PASSCRED 20 #define SO_PEERCRED 21 diff --git a/arch/sparc/include/uapi/asm/socket.h b/arch/sparc/include/uapi/asm/socket.h index fc65bf6b6440..bdc396211627 100644 --- a/arch/sparc/include/uapi/asm/socket.h +++ b/arch/sparc/include/uapi/asm/socket.h @@ -21,8 +21,8 @@ #define SO_BSDCOMPAT 0x0400 #define SO_RCVLOWAT 0x0800 #define SO_SNDLOWAT 0x1000 -#define SO_RCVTIMEO 0x2000 -#define SO_SNDTIMEO 0x4000 +#define SO_RCVTIMEO_OLD 0x2000 +#define SO_SNDTIMEO_OLD 0x4000 #define SO_ACCEPTCONN 0x8000 #define SO_SNDBUF 0x1001 @@ -112,6 +112,8 @@ #if !defined(__KERNEL__) +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLD #if __BITS_PER_LONG == 64 #define SO_TIMESTAMP SO_TIMESTAMP_OLD #define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c index 76976d6e50f9..c98ad9777ad9 100644 --- a/fs/dlm/lowcomms.c +++ b/fs/dlm/lowcomms.c @@ -1089,12 +1089,12 @@ static void sctp_connect_to_sock(struct connection *con) * since O_NONBLOCK argument in connect() function does not work here, * then, we should restore the default value of this attribute. */ - kernel_setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, + kernel_setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO_OLD, (char *)&tv, sizeof(tv)); result = sock->ops->connect(sock, (struct sockaddr *)&daddr, addr_len, 0); memset(&tv, 0, sizeof(tv)); - kernel_setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, + kernel_setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO_OLD, (char *)&tv, sizeof(tv)); if (result == -EINPROGRESS) diff --git a/include/net/sock.h b/include/net/sock.h index 6679f3c120b0..98965a9a2bf4 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -292,8 +292,8 @@ struct sock_common { * @sk_peer_pid: &struct pid for this socket's peer * @sk_peer_cred: %SO_PEERCRED setting * @sk_rcvlowat: %SO_RCVLOWAT setting - * @sk_rcvtimeo: %SO_RCVTIMEO setting - * @sk_sndtimeo: %SO_SNDTIMEO setting + * @sk_rcvtimeo: %SO_RCVTIMEO_OLD setting + * @sk_sndtimeo: %SO_SNDTIMEO_OLD setting * @sk_txhash: computed flow hash for use on transmit * @sk_filter: socket filtering instructions * @sk_timer: sock cleanup timer diff --git a/include/uapi/asm-generic/socket.h b/include/uapi/asm-generic/socket.h index 94e618a4a43f..9e370586fb19 100644 --- a/include/uapi/asm-generic/socket.h +++ b/include/uapi/asm-generic/socket.h @@ -30,8 +30,8 @@ #define SO_PEERCRED 17 #define SO_RCVLOWAT 18 #define SO_SNDLOWAT 19 -#define SO_RCVTIMEO 20 -#define SO_SNDTIMEO 21 +#define SO_RCVTIMEO_OLD 20 +#define SO_SNDTIMEO_OLD 21 #endif /* Security levels - as per NRL IPv6 - don't actually do anything */ @@ -114,6 +114,8 @@ #if !defined(__KERNEL__) +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLD #if __BITS_PER_LONG == 64 || (defined(__x86_64__) && defined(__ILP32__)) /* on 64-bit and x32, avoid the ?: operator */ #define SO_TIMESTAMP SO_TIMESTAMP_OLD diff --git a/net/compat.c b/net/compat.c index cbc15f65033c..19e047f70f64 100644 --- a/net/compat.c +++ b/net/compat.c @@ -378,7 +378,7 @@ static int compat_sock_setsockopt(struct socket *sock, int level, int optname, return do_set_attach_filter(sock, level, optname, optval, optlen); if (!COMPAT_USE_64BIT_TIME && - (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO)) + (optname == SO_RCVTIMEO_OLD || optname == SO_SNDTIMEO_OLD)) return do_set_sock_timeout(sock, level, optname, optval, optlen); return sock_setsockopt(sock, level, optname, optval, optlen); @@ -450,7 +450,7 @@ static int compat_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen) { if (!COMPAT_USE_64BIT_TIME && - (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO)) + (optname == SO_RCVTIMEO_OLD || optname == SO_SNDTIMEO_OLD)) return do_get_sock_timeout(sock, level, optname, optval, optlen); return sock_getsockopt(sock, level, optname, optval, optlen); } diff --git a/net/core/sock.c b/net/core/sock.c index af0fb33624e2..42914ca3186c 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -889,11 +889,11 @@ int sock_setsockopt(struct socket *sock, int level, int optname, sk->sk_rcvlowat = val ? : 1; break; - case SO_RCVTIMEO: + case SO_RCVTIMEO_OLD: ret = sock_set_timeout(&sk->sk_rcvtimeo, optval, optlen); break; - case SO_SNDTIMEO: + case SO_SNDTIMEO_OLD: ret = sock_set_timeout(&sk->sk_sndtimeo, optval, optlen); break; @@ -1222,7 +1222,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname, v.val = sk->sk_tsflags; break; - case SO_RCVTIMEO: + case SO_RCVTIMEO_OLD: lv = sizeof(struct __kernel_old_timeval); if (sk->sk_rcvtimeo == MAX_SCHEDULE_TIMEOUT) { v.tm.tv_sec = 0; @@ -1233,7 +1233,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname, } break; - case SO_SNDTIMEO: + case SO_SNDTIMEO_OLD: lv = sizeof(struct __kernel_old_timeval); if (sk->sk_sndtimeo == MAX_SCHEDULE_TIMEOUT) { v.tm.tv_sec = 0; From patchwork Tue Jan 8 05:22:55 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Deepa Dinamani X-Patchwork-Id: 1021740 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="pnq/fq1n"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43YgfH6WLQz9sMQ for ; Tue, 8 Jan 2019 16:23:51 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727825AbfAHFXr (ORCPT ); Tue, 8 Jan 2019 00:23:47 -0500 Received: from mail-pg1-f193.google.com ([209.85.215.193]:38848 "EHLO mail-pg1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725800AbfAHFXq (ORCPT ); Tue, 8 Jan 2019 00:23:46 -0500 Received: by mail-pg1-f193.google.com with SMTP id g189so1196368pgc.5; Mon, 07 Jan 2019 21:23:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=tAhRSlvBCw0jlWlEIq0KYU18kUyop4luzyQAUajikNU=; b=pnq/fq1nrzFtTMiE5UoQbAHmSN+Du0v7pZ15O4bPg7rGRYVYNIIvVTFKGpQ+sVMaf+ bIDwSbSXVRcVXQ+hxFMFdbgZBcKPASXmys8a1hBQzxKO+HI0ViCW4ywf4BcBBaczMDau rWXcHnl+NguPFKZOneQFOafV7mKPMTI5b0MTluUD4DkcWbtkRpkeJHkHXRw5PwdLFJPL 7x5AQqXhZ1cmNvCRQbpk3lthD6/CUqG+8UbP7nzk0qdWC/A0j8/I2Gb2o/TwFPmjiYam 2b8PDEYVrL12VmBPgZGpjaBLtVVJRVjzKQsZpSRyM71bN9fDhbCwdiYlwD8vIfE7JSCA kdAQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=tAhRSlvBCw0jlWlEIq0KYU18kUyop4luzyQAUajikNU=; b=sx6lixOwV9deadG10+FzJIanzw5EK0JJs8dc5yyGKR44AlIVu5qRh5Xd2EYv5myZ0Z CWpp4kLruU6aeRm5c3Mj3mQz5cPJ1QmfnsCjuT2C8sklsodLktir9TOdbCZ33m9WuZYq zi40UImx70QA1snnfL0adLXLImuKSOq4MIBdsaEKCrYKdC0iwk2to5SGLPDY/o6eXBz0 VZEOYHmxY7A4o9Px4KqACkgLOeN8avd5rd5zaPnPQ/TnxyV0lF5pUMEvPWfasFMMAcMg 1Aw90Kw4hn3Tzc/aOsNRFtNaB+VChMcdqsKJfn3UMixvMbWknCuJopYM1CtagkutFA2W c9qg== X-Gm-Message-State: AJcUukegq4k6wB++GWMUR3zWbzILN5ClZq4m4AY6YrNKFCeuPTUtkKOs aIgxVGyEVjzhwC+Uk95GfzOhzAU8 X-Google-Smtp-Source: ALg8bN4t04GVa0fMQUhLGrokSOg8J4Jdz/oAQltCP50PXpmCuFSFZSsSUhVJQu+DHBe01xD0NuiPuw== X-Received: by 2002:a63:de04:: with SMTP id f4mr325595pgg.292.1546925025124; Mon, 07 Jan 2019 21:23:45 -0800 (PST) Received: from deepa-ubuntu.lan (c-98-234-52-230.hsd1.ca.comcast.net. [98.234.52.230]) by smtp.gmail.com with ESMTPSA id x127sm102710626pfd.156.2019.01.07.21.23.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 07 Jan 2019 21:23:44 -0800 (PST) From: Deepa Dinamani To: davem@davemloft.net, linux-kernel@vger.kernel.org Cc: netdev@vger.kernel.org, arnd@arndb.de, y2038@lists.linaro.org, ccaulfie@redhat.com, deller@gmx.de, paulus@samba.org, ralf@linux-mips.org, rth@twiddle.net, cluster-devel@redhat.com, linuxppc-dev@lists.ozlabs.org, linux-alpha@vger.kernel.org, linux-arch@vger.kernel.org, linux-mips@vger.kernel.org, linux-parisc@vger.kernel.org, sparclinux@vger.kernel.org Subject: [PATCH 3/3] sock: Add SO_RCVTIMEO_NEW and SO_SNDTIMEO_NEW Date: Mon, 7 Jan 2019 21:22:55 -0800 Message-Id: <20190108052255.10699-4-deepa.kernel@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190108052255.10699-1-deepa.kernel@gmail.com> References: <20190108052255.10699-1-deepa.kernel@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add new socket timeout options that are y2038 safe. Signed-off-by: Deepa Dinamani Cc: ccaulfie@redhat.com Cc: davem@davemloft.net Cc: deller@gmx.de Cc: paulus@samba.org Cc: ralf@linux-mips.org Cc: rth@twiddle.net Cc: cluster-devel@redhat.com Cc: linuxppc-dev@lists.ozlabs.org Cc: linux-alpha@vger.kernel.org Cc: linux-arch@vger.kernel.org Cc: linux-mips@vger.kernel.org Cc: linux-parisc@vger.kernel.org Cc: sparclinux@vger.kernel.org --- arch/alpha/include/uapi/asm/socket.h | 12 +++-- arch/mips/include/uapi/asm/socket.h | 11 ++++- arch/parisc/include/uapi/asm/socket.h | 11 ++++- arch/sparc/include/uapi/asm/socket.h | 11 ++++- include/net/sock.h | 4 +- include/uapi/asm-generic/socket.h | 11 ++++- net/core/sock.c | 64 +++++++++++++++++++++------ 7 files changed, 98 insertions(+), 26 deletions(-) diff --git a/arch/alpha/include/uapi/asm/socket.h b/arch/alpha/include/uapi/asm/socket.h index ea3ba981d8a0..3d800d5d3d5d 100644 --- a/arch/alpha/include/uapi/asm/socket.h +++ b/arch/alpha/include/uapi/asm/socket.h @@ -118,19 +118,25 @@ #define SO_TIMESTAMPNS_NEW 63 #define SO_TIMESTAMPING_NEW 64 -#if !defined(__KERNEL__) +#define SO_RCVTIMEO_NEW 65 +#define SO_SNDTIMEO_NEW 66 -#define SO_RCVTIMEO SO_RCVTIMEO_OLD -#define SO_SNDTIMEO SO_SNDTIMEO_OLD +#if !defined(__KERNEL__) #if __BITS_PER_LONG == 64 #define SO_TIMESTAMP SO_TIMESTAMP_OLD #define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD #define SO_TIMESTAMPING SO_TIMESTAMPING_OLD + +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLD #else #define SO_TIMESTAMP (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMP_OLD : SO_TIMESTAMP_NEW) #define SO_TIMESTAMPNS (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPNS_OLD : SO_TIMESTAMPNS_NEW) #define SO_TIMESTAMPING (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPING_OLD : SO_TIMESTAMPING_NEW) + +#define SO_RCVTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_RCVTIMEO_OLD : SO_RCVTIMEO_NEW) +#define SO_SNDTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_SNDTIMEO_OLD : SO_SNDTIMEO_NEW) #endif #define SCM_TIMESTAMP SO_TIMESTAMP diff --git a/arch/mips/include/uapi/asm/socket.h b/arch/mips/include/uapi/asm/socket.h index 4dde20d64690..5a7f9010c090 100644 --- a/arch/mips/include/uapi/asm/socket.h +++ b/arch/mips/include/uapi/asm/socket.h @@ -128,18 +128,25 @@ #define SO_TIMESTAMPNS_NEW 63 #define SO_TIMESTAMPING_NEW 64 +#define SO_RCVTIMEO_NEW 65 +#define SO_SNDTIMEO_NEW 66 + #if !defined(__KERNEL__) -#define SO_RCVTIMEO SO_RCVTIMEO_OLD -#define SO_SNDTIMEO SO_SNDTIMEO_OLD #if __BITS_PER_LONG == 64 #define SO_TIMESTAMP SO_TIMESTAMP_OLD #define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD #define SO_TIMESTAMPING SO_TIMESTAMPING_OLD + +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLD #else #define SO_TIMESTAMP (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMP_OLD : SO_TIMESTAMP_NEW) #define SO_TIMESTAMPNS (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPNS_OLD : SO_TIMESTAMPNS_NEW) #define SO_TIMESTAMPING (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPING_OLD : SO_TIMESTAMPING_NEW) + +#define SO_RCVTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_RCVTIMEO_OLD : SO_RCVTIMEO_NEW) +#define SO_SNDTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_SNDTIMEO_OLD : SO_SNDTIMEO_NEW) #endif #define SCM_TIMESTAMP SO_TIMESTAMP diff --git a/arch/parisc/include/uapi/asm/socket.h b/arch/parisc/include/uapi/asm/socket.h index 546937fa0d8b..bd35de5b4666 100644 --- a/arch/parisc/include/uapi/asm/socket.h +++ b/arch/parisc/include/uapi/asm/socket.h @@ -109,18 +109,25 @@ #define SO_TIMESTAMPNS_NEW 0x4038 #define SO_TIMESTAMPING_NEW 0x4039 +#define SO_RCVTIMEO_NEW 0x4040 +#define SO_SNDTIMEO_NEW 0x4041 + #if !defined(__KERNEL__) -#define SO_RCVTIMEO SO_RCVTIMEO_OLD -#define SO_SNDTIMEO SO_SNDTIMEO_OLD #if __BITS_PER_LONG == 64 #define SO_TIMESTAMP SO_TIMESTAMP_OLD #define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD #define SO_TIMESTAMPING SO_TIMESTAMPING_OLD + +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLD #else #define SO_TIMESTAMP (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMP_OLD : SO_TIMESTAMP_NEW) #define SO_TIMESTAMPNS (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPNS_OLD : SO_TIMESTAMPNS_NEW) #define SO_TIMESTAMPING (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPING_OLD : SO_TIMESTAMPING_NEW) + +#define SO_RCVTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_RCVTIMEO_OLD : SO_RCVTIMEO_NEW) +#define SO_SNDTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_SNDTIMEO_OLD : SO_SNDTIMEO_NEW) #endif #define SCM_TIMESTAMP SO_TIMESTAMP diff --git a/arch/sparc/include/uapi/asm/socket.h b/arch/sparc/include/uapi/asm/socket.h index bdc396211627..5a5b073c3299 100644 --- a/arch/sparc/include/uapi/asm/socket.h +++ b/arch/sparc/include/uapi/asm/socket.h @@ -110,18 +110,25 @@ #define SO_TIMESTAMPNS_NEW 0x0042 #define SO_TIMESTAMPING_NEW 0x0043 +#define SO_RCVTIMEO_NEW 0x0044 +#define SO_SNDTIMEO_NEW 0x0045 + #if !defined(__KERNEL__) -#define SO_RCVTIMEO SO_RCVTIMEO_OLD -#define SO_SNDTIMEO SO_SNDTIMEO_OLD #if __BITS_PER_LONG == 64 #define SO_TIMESTAMP SO_TIMESTAMP_OLD #define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD #define SO_TIMESTAMPING SO_TIMESTAMPING_OLD + +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLD #else #define SO_TIMESTAMP (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMP_OLD : SO_TIMESTAMP_NEW) #define SO_TIMESTAMPNS (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPNS_OLD : SO_TIMESTAMPNS_NEW) #define SO_TIMESTAMPING (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPING_OLD : SO_TIMESTAMPING_NEW) + +#define SO_RCVTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_RCVTIMEO_OLD : SO_RCVTIMEO_NEW) +#define SO_SNDTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_SNDTIMEO_OLD : SO_SNDTIMEO_NEW) #endif diff --git a/include/net/sock.h b/include/net/sock.h index 98965a9a2bf4..6679f3c120b0 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -292,8 +292,8 @@ struct sock_common { * @sk_peer_pid: &struct pid for this socket's peer * @sk_peer_cred: %SO_PEERCRED setting * @sk_rcvlowat: %SO_RCVLOWAT setting - * @sk_rcvtimeo: %SO_RCVTIMEO_OLD setting - * @sk_sndtimeo: %SO_SNDTIMEO_OLD setting + * @sk_rcvtimeo: %SO_RCVTIMEO setting + * @sk_sndtimeo: %SO_SNDTIMEO setting * @sk_txhash: computed flow hash for use on transmit * @sk_filter: socket filtering instructions * @sk_timer: sock cleanup timer diff --git a/include/uapi/asm-generic/socket.h b/include/uapi/asm-generic/socket.h index 9e370586fb19..5b4da6eacc9f 100644 --- a/include/uapi/asm-generic/socket.h +++ b/include/uapi/asm-generic/socket.h @@ -112,19 +112,26 @@ #define SO_TIMESTAMPNS_NEW 63 #define SO_TIMESTAMPING_NEW 64 +#define SO_RCVTIMEO_NEW 65 +#define SO_SNDTIMEO_NEW 66 + #if !defined(__KERNEL__) -#define SO_RCVTIMEO SO_RCVTIMEO_OLD -#define SO_SNDTIMEO SO_SNDTIMEO_OLD #if __BITS_PER_LONG == 64 || (defined(__x86_64__) && defined(__ILP32__)) /* on 64-bit and x32, avoid the ?: operator */ #define SO_TIMESTAMP SO_TIMESTAMP_OLD #define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD #define SO_TIMESTAMPING SO_TIMESTAMPING_OLD + +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLD #else #define SO_TIMESTAMP (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMP_OLD : SO_TIMESTAMP_NEW) #define SO_TIMESTAMPNS (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPNS_OLD : SO_TIMESTAMPNS_NEW) #define SO_TIMESTAMPING (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPING_OLD : SO_TIMESTAMPING_NEW) + +#define SO_RCVTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_RCVTIMEO_OLD : SO_RCVTIMEO_NEW) +#define SO_SNDTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_SNDTIMEO_OLD : SO_SNDTIMEO_NEW) #endif #define SCM_TIMESTAMP SO_TIMESTAMP diff --git a/net/core/sock.c b/net/core/sock.c index 42914ca3186c..5e1c6dafee65 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -335,18 +335,31 @@ int __sk_backlog_rcv(struct sock *sk, struct sk_buff *skb) } EXPORT_SYMBOL(__sk_backlog_rcv); -static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen) +static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen, bool old_timeval) { - struct __kernel_old_timeval tv; - if (optlen < sizeof(tv)) - return -EINVAL; - if (copy_from_user(&tv, optval, sizeof(tv))) - return -EFAULT; - if (tv.tv_usec < 0 || tv.tv_usec >= USEC_PER_SEC) + struct __kernel_sock_timeval stv; + + if (old_timeval) { + struct __kernel_old_timeval tv; + + if (optlen < sizeof(tv)) + return -EINVAL; + if (copy_from_user(&tv, optval, sizeof(tv))) + return -EFAULT; + stv.tv_sec = tv.tv_sec; + stv.tv_usec = tv.tv_usec; + } else { + if (optlen < sizeof(stv)) + return -EINVAL; + if (copy_from_user(&stv, optval, sizeof(stv))) + return -EFAULT; + } + + if (stv.tv_usec < 0 || stv.tv_usec >= USEC_PER_SEC) return -EDOM; - if (tv.tv_sec < 0) { + if (stv.tv_sec < 0) { static int warned __read_mostly; *timeo_p = 0; @@ -358,10 +371,10 @@ static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen) return 0; } *timeo_p = MAX_SCHEDULE_TIMEOUT; - if (tv.tv_sec == 0 && tv.tv_usec == 0) + if (stv.tv_sec == 0 && stv.tv_usec == 0) return 0; - if (tv.tv_sec < (MAX_SCHEDULE_TIMEOUT/HZ - 1)) - *timeo_p = tv.tv_sec * HZ + DIV_ROUND_UP(tv.tv_usec, USEC_PER_SEC / HZ); + if (stv.tv_sec < (MAX_SCHEDULE_TIMEOUT / HZ - 1)) + *timeo_p = stv.tv_sec * HZ + DIV_ROUND_UP((unsigned long)stv.tv_usec, USEC_PER_SEC / HZ); return 0; } @@ -890,11 +903,13 @@ int sock_setsockopt(struct socket *sock, int level, int optname, break; case SO_RCVTIMEO_OLD: - ret = sock_set_timeout(&sk->sk_rcvtimeo, optval, optlen); + case SO_RCVTIMEO_NEW: + ret = sock_set_timeout(&sk->sk_rcvtimeo, optval, optlen, optname == SO_RCVTIMEO_OLD); break; case SO_SNDTIMEO_OLD: - ret = sock_set_timeout(&sk->sk_sndtimeo, optval, optlen); + case SO_SNDTIMEO_NEW: + ret = sock_set_timeout(&sk->sk_sndtimeo, optval, optlen, optname == SO_SNDTIMEO_OLD); break; case SO_ATTACH_FILTER: @@ -1114,6 +1129,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname, u64 val64; struct linger ling; struct __kernel_old_timeval tm; + struct __kernel_sock_timeval stm; struct sock_txtime txtime; } v; @@ -1233,6 +1249,17 @@ int sock_getsockopt(struct socket *sock, int level, int optname, } break; + case SO_RCVTIMEO_NEW: + lv = sizeof(struct __kernel_sock_timeval); + if (sk->sk_rcvtimeo == MAX_SCHEDULE_TIMEOUT) { + v.stm.tv_sec = 0; + v.stm.tv_usec = 0; + } else { + v.stm.tv_sec = sk->sk_rcvtimeo / HZ; + v.stm.tv_usec = ((sk->sk_rcvtimeo % HZ) * USEC_PER_SEC) / HZ; + } + break; + case SO_SNDTIMEO_OLD: lv = sizeof(struct __kernel_old_timeval); if (sk->sk_sndtimeo == MAX_SCHEDULE_TIMEOUT) { @@ -1244,6 +1271,17 @@ int sock_getsockopt(struct socket *sock, int level, int optname, } break; + case SO_SNDTIMEO_NEW: + lv = sizeof(struct __kernel_sock_timeval); + if (sk->sk_sndtimeo == MAX_SCHEDULE_TIMEOUT) { + v.stm.tv_sec = 0; + v.stm.tv_usec = 0; + } else { + v.stm.tv_sec = sk->sk_sndtimeo / HZ; + v.stm.tv_usec = ((sk->sk_sndtimeo % HZ) * USEC_PER_SEC) / HZ; + } + break; + case SO_RCVLOWAT: v.val = sk->sk_rcvlowat; break;