From patchwork Mon Aug 27 19:45:30 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 145198 Delivered-To: patch@linaro.org Received: by 2002:a2e:1648:0:0:0:0:0 with SMTP id 8-v6csp332388ljw; Mon, 27 Aug 2018 12:45:53 -0700 (PDT) X-Google-Smtp-Source: ANB0Vda/QU8JErco10qQ0cVdOEKhRkJYr5a0JZHSxL7gKEDrsmG9I4Nk8Y+em8jE6kCOriw++lJj X-Received: by 2002:a17:902:6115:: with SMTP id t21-v6mr14522257plj.92.1535399153434; Mon, 27 Aug 2018 12:45:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1535399153; cv=none; d=google.com; s=arc-20160816; b=F7WZtI6xbkmRqWbcZWneGGCop5oXNTtvVvEFBzmL3Pchj2JWuDlWEe+JrORfDwopwR URXND2VGsNoVqSCwKGt7sxFo6DolN5fHaCPocMjb7RcAqM18fab5rKacIQWix/AQZct3 uX68EW+6KAfihZT9gqKg8Uob31+Oz9btnnvOSMa7dazoYojIvB5m89NDyG+HFgmmW4Kj nbz/oWC/UFXYlGeD+h3VMNWyLv7ORs9XnJ72nAgz1Yddic3pUqfaF7lKljWQncvfhkeX o5WsM0QXkqTtKdhAFMbv2bShxdHQx5GmTK458Nbx7ydqKD1LWfybUw9PdQNlZTM+LSVM ryNA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=kBJVWoJ5Ln+gG7A7XZlYsOJh1DGCQ6u7oHxY2hxj+6A=; b=OFzUvH/9ioAK6KzXTllBAmrpMegIC0KFkgglg/qEXDVapPjTgOqKC0VD5ujFXo9ePr Vr6+99/oagvmfyV/thZmyrLhReZXwbP97NTXDu+ysuluNLfdqGwWuBtABUIY1OcKPz+p GscQOud8CJQGy8AKN1H56B2KMY9Pdem0D7e0I26hii5EEhKPyFju52RJlsiFZxH2BbNN 2PN6+w9KsUlDt0zXJsqA2LxZhyBzoRt8Q1ovXrrvKr/F1NWdhlframzYqpPQO3IPU968 vealSA3lXPiYC012KlKPf2y/FGiS8UUjptR138bRXuYkBumwPtZD39CvyK4j9L41nIK3 wn0w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id o126-v6si110454pga.294.2018.08.27.12.45.53; Mon, 27 Aug 2018 12:45:53 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727678AbeH0Xdu (ORCPT + 32 others); Mon, 27 Aug 2018 19:33:50 -0400 Received: from mout.kundenserver.de ([217.72.192.73]:39705 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727468AbeH0Xdu (ORCPT ); Mon, 27 Aug 2018 19:33:50 -0400 Received: from wuerfel.lan ([109.193.40.16]) by mrelayeu.kundenserver.de (mreue101 [212.227.15.145]) with ESMTPA (Nemesis) id 0M73gb-1fgOuX1pbR-00wp38; Mon, 27 Aug 2018 21:45:40 +0200 From: Arnd Bergmann To: tglx@linutronix.de Cc: y2038@lists.linaro.org, linux-api@vger.kernel.org, Christoph Hellwig , linux-kernel@vger.kernel.org, torvalds@linux-foundation.org, deepa.kernel@gmail.com, linux-arch@vger.kernel.org, Arnd Bergmann Subject: [PATCH 13/14] y2038: socket: Change recvmmsg to use __kernel_timespec Date: Mon, 27 Aug 2018 21:45:30 +0200 Message-Id: <20180827194531.3796559-14-arnd@arndb.de> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20180827194531.3796559-1-arnd@arndb.de> References: <20180827194531.3796559-1-arnd@arndb.de> X-Provags-ID: V03:K1:V7XQZl/ZW81NfyBSLXtTx6Jd2VYw1T3PcNZLy3/zcKCVKE9TsTG MrL5oHyvdviiYMXRqro6oD2iHv0Qb2gyWygNsKMspFNy3ANSGzQkP9cBBPdtJ+TSV4FOpPD 4Ls+28sfWTuWmtgv57FPhCGvJwE50NF1WtJCvhRVxQOnQH8yUYSu5m2cxeSipJ4O3ZT3uPE 4CtdNnGpaJ3KMEMBlJmYw== X-UI-Out-Filterresults: notjunk:1; V01:K0:o+GhUvvZZsk=:OAa5iFyoQhNLOLn8C/lsRz IFjuXBxLVZtmtNg4uTzbkPzaahDhamX5EwHybWBJsQHHZOa6sVhqkvxH7Ao20V6DWck9RJN+V 6EF0jQc6UPmPs9wq1BQs8jdvaOrsFF7jbwwz20dMe2UdbRPlJHtdmmrs2hogVhge+tXGZKkqB 64NWTCvli18aep74XbhysCZbW2pdMAehVZqfeeLq7LU2r1tqCLUgo6QrkRsXEfU6dOnjglcyZ zmAtBSo2UHRbBRpCzXgUh1CHH4PRnDT5HWCbG7Ir6J3beru7hTnj7KyT1I07KwatHB+LAeiXb juxcL4kmcV+YN3N7O+K6sATd144roeoYdjN8BNFs2JschtVEojvSpRByqIXvwPUEFVEvyDUoE Po8yAt/MmTsAaEmYZdunQ7OUAuQ6fXB7pcrGl7nGfg2sqSGz30k6YMK71WaeQ9gnhdfEME4Jq L+iV1ZJmdeinSaoI1+L3CQ3vlSCOWcVgCxQRjJc67AMExXDGBY5j+UYF9sw2WYDYxiIALEj6w 0m+rZ3yvy6gWVJtLcjFTDa/zJzBjEBkX4GQ8HS8Mg0n+jfH0c5rO8QjlIIRL43U7f6mhoaGuR DRjmW51iH3U129ahKANVvDcYvgE0zczHEYfxcJB41OE+Quogj8xk/9fB5cPQ7JhYTty81fVB7 sF0CFmZI5Whw5E+fvFtMq1cC4EWY4VqQNvdzA6dtzu+yH16dp4AVk9+og/GIrp4/4t68= Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This converts the recvmmsg() system call in all its variations to use 'timespec64' internally for its timeout, and have a __kernel_timespec64 argument in the native entry point. This lets us change the type to use 64-bit time_t at a later point while using the 32-bit compat system call emulation for existing user space. Signed-off-by: Arnd Bergmann --- include/linux/socket.h | 4 ++-- include/linux/syscalls.h | 2 +- net/compat.c | 6 +++--- net/socket.c | 18 ++++++++---------- 4 files changed, 14 insertions(+), 16 deletions(-) -- 2.18.0 diff --git a/include/linux/socket.h b/include/linux/socket.h index 7ed4713d5337..8b571e9b9f76 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h @@ -348,7 +348,7 @@ struct ucred { extern int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr_storage *kaddr); extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data); -struct timespec; +struct timespec64; /* The __sys_...msg variants allow MSG_CMSG_COMPAT iff * forbid_cmsg_compat==false @@ -358,7 +358,7 @@ extern long __sys_recvmsg(int fd, struct user_msghdr __user *msg, extern long __sys_sendmsg(int fd, struct user_msghdr __user *msg, unsigned int flags, bool forbid_cmsg_compat); extern int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, - unsigned int flags, struct timespec *timeout); + unsigned int flags, struct timespec64 *timeout); extern int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, unsigned int flags, bool forbid_cmsg_compat); diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 5642016a312d..fb3a05fab8aa 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h @@ -830,7 +830,7 @@ asmlinkage long sys_perf_event_open( asmlinkage long sys_accept4(int, struct sockaddr __user *, int __user *, int); asmlinkage long sys_recvmmsg(int fd, struct mmsghdr __user *msg, unsigned int vlen, unsigned flags, - struct timespec __user *timeout); + struct __kernel_timespec __user *timeout); asmlinkage long sys_wait4(pid_t pid, int __user *stat_addr, int options, struct rusage __user *ru); diff --git a/net/compat.c b/net/compat.c index 2ef160876bc1..47a614b370cd 100644 --- a/net/compat.c +++ b/net/compat.c @@ -815,18 +815,18 @@ static int __compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg, struct old_timespec32 __user *timeout) { int datagrams; - struct timespec ktspec; + struct timespec64 ktspec; if (timeout == NULL) return __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen, flags | MSG_CMSG_COMPAT, NULL); - if (compat_get_timespec(&ktspec, timeout)) + if (compat_get_timespec64(&ktspec, timeout)) return -EFAULT; datagrams = __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen, flags | MSG_CMSG_COMPAT, &ktspec); - if (datagrams > 0 && compat_put_timespec(&ktspec, timeout)) + if (datagrams > 0 && compat_put_timespec64(&ktspec, timeout)) datagrams = -EFAULT; return datagrams; diff --git a/net/socket.c b/net/socket.c index e6945e318f02..b9d71b503720 100644 --- a/net/socket.c +++ b/net/socket.c @@ -2340,7 +2340,7 @@ SYSCALL_DEFINE3(recvmsg, int, fd, struct user_msghdr __user *, msg, */ int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, - unsigned int flags, struct timespec *timeout) + unsigned int flags, struct timespec64 *timeout) { int fput_needed, err, datagrams; struct socket *sock; @@ -2405,8 +2405,7 @@ int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, if (timeout) { ktime_get_ts64(&timeout64); - *timeout = timespec64_to_timespec( - timespec64_sub(end_time, timeout64)); + *timeout = timespec64_sub(end_time, timeout64); if (timeout->tv_sec < 0) { timeout->tv_sec = timeout->tv_nsec = 0; break; @@ -2452,10 +2451,10 @@ int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, static int do_sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, unsigned int flags, - struct timespec __user *timeout) + struct __kernel_timespec __user *timeout) { int datagrams; - struct timespec timeout_sys; + struct timespec64 timeout_sys; if (flags & MSG_CMSG_COMPAT) return -EINVAL; @@ -2463,13 +2462,12 @@ static int do_sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, if (!timeout) return __sys_recvmmsg(fd, mmsg, vlen, flags, NULL); - if (copy_from_user(&timeout_sys, timeout, sizeof(timeout_sys))) + if (get_timespec64(&timeout_sys, timeout)) return -EFAULT; datagrams = __sys_recvmmsg(fd, mmsg, vlen, flags, &timeout_sys); - if (datagrams > 0 && - copy_to_user(timeout, &timeout_sys, sizeof(timeout_sys))) + if (datagrams > 0 && put_timespec64(&timeout_sys, timeout)) datagrams = -EFAULT; return datagrams; @@ -2477,7 +2475,7 @@ static int do_sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg, unsigned int, vlen, unsigned int, flags, - struct timespec __user *, timeout) + struct __kernel_timespec __user *, timeout) { return do_sys_recvmmsg(fd, mmsg, vlen, flags, timeout); } @@ -2601,7 +2599,7 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long __user *, args) break; case SYS_RECVMMSG: err = do_sys_recvmmsg(a0, (struct mmsghdr __user *)a1, a[2], - a[3], (struct timespec __user *)a[4]); + a[3], (struct __kernel_timespec __user *)a[4]); break; case SYS_ACCEPT4: err = __sys_accept4(a0, (struct sockaddr __user *)a1,