From patchwork Mon Jun 19 06:45:13 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Deepa Dinamani X-Patchwork-Id: 9795261 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 5B9A96020B for ; Mon, 19 Jun 2017 06:46:45 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 450F527E5A for ; Mon, 19 Jun 2017 06:46:45 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3A23827EE2; Mon, 19 Jun 2017 06:46:45 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_HI autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CF26B27E5A for ; Mon, 19 Jun 2017 06:46:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753758AbdFSGpz (ORCPT ); Mon, 19 Jun 2017 02:45:55 -0400 Received: from mail-pf0-f195.google.com ([209.85.192.195]:35090 "EHLO mail-pf0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753751AbdFSGpx (ORCPT ); Mon, 19 Jun 2017 02:45:53 -0400 Received: by mail-pf0-f195.google.com with SMTP id s66so15173124pfs.2; Sun, 18 Jun 2017 23:45:48 -0700 (PDT) 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=mZvLVqYVhMjYPBIIA19yck14S04cL3Nk1PobTxhC+PU=; b=N3wJRxYSKuo/ZNLAnDK0GSw0cQ3+eQ9ysNvOYqMVkrN66psb82C/SL44NCffQyczcs 3BGTSrhf83ofuqvE5N1mvBLggUj8/vq2JqF6G6Wxa1xguOVirOpUvZNTmSRX5x5V/DKD Fxz7fd6RFEll+D5P1JsCs8UVMPVrOIhWxfEy0IX/+Do15/gWtq/FhTq5UoVH9pQOnwLw Jtlvq6cDRHU6n/UnylTFfR2uS/judtV8fWbQ6YvQINUT+LIfk6Ujl57P9qnnvKF5dUwI 2kEurBs5KxtxBYUvArX61iY5K9xrJ1WbZm6lTlHPOyXRWqawEJA2wySY09aIpBLjehG5 Bhlw== 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=mZvLVqYVhMjYPBIIA19yck14S04cL3Nk1PobTxhC+PU=; b=U1N9IFyIRGvxxaTgTd73sSxQCA8dXSXxQpyKdDxBBssO1txnVfndyrF2xsrzCupFEx lKt5rlgY5Q4cXf5bff7TiFgdOhk2XzB9tRLvYJXR28JAMFhM+kKVNVFxShRln/SdL4VD MpE+qUF2NwjsKpEB+FSK3q3Q+rIggr5c1gc+xltPqIGrg6ED5t44yqxE1ZshUm+P90AI fFuH4OH4m5bb7Jayq5wsjt/OUDj5go5bxGRGb7gFw/0Z7GzHliCg+RGmSKQYJX3Jl7U9 XH9qbSOzyKgP1cupvC9sNz44gbW+teeBTYDVWeuG3suPa9XouAZrKqqhBE/Yxt8SiJ13 SAfw== X-Gm-Message-State: AKS2vOzQxW3Q2LBkMpBuK7Z6LD57AivNRZ49pvMKP01EcfkBo2iuyfIy AXR34poor9FrmQ== X-Received: by 10.84.224.70 with SMTP id a6mr20114921plt.286.1497854747783; Sun, 18 Jun 2017 23:45:47 -0700 (PDT) Received: from localhost.localdomain ([2601:647:5000:6620:ecf7:aabb:b31b:424d]) by smtp.gmail.com with ESMTPSA id o66sm19620318pga.64.2017.06.18.23.45.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 18 Jun 2017 23:45:47 -0700 (PDT) From: Deepa Dinamani To: tglx@linutronix.de, viro@zeniv.linux.org.uk, linux-kernel@vger.kernel.org Cc: john.stultz@linaro.org, nicolas.pitre@linaro.org, arnd@arndb.de, y2038@lists.linaro.org, linux-fsdevel@vger.kernel.org Subject: [PATCH 6/8] time: introduce {get,put}_itimerspec64 Date: Sun, 18 Jun 2017 23:45:13 -0700 Message-Id: <20170619064515.922-7-deepa.kernel@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170619064515.922-1-deepa.kernel@gmail.com> References: <20170619064515.922-1-deepa.kernel@gmail.com> Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP As we change the user space type for the timerfd and posix timer functions to newer data types, we need some form of conversion helpers to avoid duplicating that logic. Suggested-by: Arnd Bergmann Signed-off-by: Deepa Dinamani --- include/linux/compat.h | 4 ++++ include/linux/posix-timers.h | 1 - include/linux/time.h | 13 +++++++++++++ kernel/compat.c | 22 ++++++++++++++++++++++ kernel/time/time.c | 30 ++++++++++++++++++++++++++++++ 5 files changed, 69 insertions(+), 1 deletion(-) diff --git a/include/linux/compat.h b/include/linux/compat.h index 72be68953411..c6547d26f8d3 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -158,6 +158,10 @@ extern int compat_get_timeval(struct timeval *, const void __user *); extern int compat_put_timeval(const struct timeval *, void __user *); extern int compat_get_timespec64(struct timespec64 *, const void __user *); extern int compat_put_timespec64(const struct timespec64 *, void __user *); +extern int get_compat_itimerspec64(struct itimerspec64 *its, + const struct compat_itimerspec __user *uits); +extern int put_compat_itimerspec64(const struct itimerspec64 *its, + struct compat_itimerspec __user *uits); /* * This function convert a timespec if necessary and returns a *user diff --git a/include/linux/posix-timers.h b/include/linux/posix-timers.h index 667095dbcd37..e508948ab4b9 100644 --- a/include/linux/posix-timers.h +++ b/include/linux/posix-timers.h @@ -115,5 +115,4 @@ long clock_nanosleep_restart(struct restart_block *restart_block); void update_rlimit_cpu(struct task_struct *task, unsigned long rlim_new); void posixtimer_rearm(struct siginfo *info); - #endif diff --git a/include/linux/time.h b/include/linux/time.h index 36afb579495f..f9858d7e6361 100644 --- a/include/linux/time.h +++ b/include/linux/time.h @@ -12,6 +12,10 @@ int get_timespec64(struct timespec64 *ts, const struct timespec __user *uts); int put_timespec64(const struct timespec64 *ts, struct timespec __user *uts); +int get_itimerspec64(struct itimerspec64 *it, + const struct itimerspec __user *uit); +int put_itimerspec64(const struct itimerspec64 *it, + struct itimerspec __user *uit); #define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1) @@ -275,4 +279,13 @@ static __always_inline void timespec_add_ns(struct timespec *a, u64 ns) a->tv_nsec = ns; } +static inline bool itimerspec64_valid(const struct itimerspec64 *its) +{ + if (!timespec64_valid(&(its->it_interval)) || + !timespec64_valid(&(its->it_value))) + return false; + + return true; +} + #endif diff --git a/kernel/compat.c b/kernel/compat.c index d6559c0c69b0..1b5bd5b9343a 100644 --- a/kernel/compat.c +++ b/kernel/compat.c @@ -657,6 +657,28 @@ int put_compat_itimerspec(struct compat_itimerspec __user *dst, return 0; } +int get_compat_itimerspec64(struct itimerspec64 *its, + const struct compat_itimerspec __user *uits) +{ + + if (__compat_get_timespec64(&its->it_interval, &uits->it_interval) || + __compat_get_timespec64(&its->it_value, &uits->it_value)) + return -EFAULT; + return 0; +} +EXPORT_SYMBOL_GPL(get_compat_itimerspec64); + +int put_compat_itimerspec64(const struct itimerspec64 *its, + struct compat_itimerspec __user *uits) +{ + if (__compat_put_timespec64(&its->it_interval, &uits->it_interval) || + __compat_put_timespec64(&its->it_value, &uits->it_value)) + return -EFAULT; + return 0; +} +EXPORT_SYMBOL_GPL(put_compat_itimerspec64); + + COMPAT_SYSCALL_DEFINE3(timer_create, clockid_t, which_clock, struct compat_sigevent __user *, timer_event_spec, timer_t __user *, created_timer_id) diff --git a/kernel/time/time.c b/kernel/time/time.c index fdd55c7681ec..16bdf7a3687e 100644 --- a/kernel/time/time.c +++ b/kernel/time/time.c @@ -814,3 +814,33 @@ int put_timespec64(const struct timespec64 *ts, return copy_to_user(uts, &kts, sizeof(kts)) ? -EFAULT : 0; } EXPORT_SYMBOL_GPL(put_timespec64); + +int get_itimerspec64(struct itimerspec64 *it, + const struct itimerspec __user *uit) +{ + int ret; + + ret = get_timespec64(&it->it_interval, &uit->it_interval); + if (ret) + return ret; + + ret = get_timespec64(&it->it_value, &uit->it_value); + + return ret; +} +EXPORT_SYMBOL_GPL(get_itimerspec64); + +int put_itimerspec64(const struct itimerspec64 *it, + struct itimerspec __user *uit) +{ + int ret; + + ret = put_timespec64(&it->it_interval, &uit->it_interval); + if (ret) + return ret; + + ret = put_timespec64(&it->it_value, &uit->it_value); + + return ret; +} +EXPORT_SYMBOL_GPL(put_itimerspec64);