From patchwork Thu Sep 21 06:18:07 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "(Exiting) Baolin Wang" X-Patchwork-Id: 9963505 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 42668600C5 for ; Thu, 21 Sep 2017 08:29:26 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2E844289FB for ; Thu, 21 Sep 2017 08:29:26 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 22D2A29357; Thu, 21 Sep 2017 08:29:26 +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=-1.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_NONE, RDNS_NONE, T_DKIM_INVALID autolearn=no version=3.3.1 Received: from alsa0.perex.cz (unknown [77.48.224.243]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3D6B5289FB for ; Thu, 21 Sep 2017 08:29:25 +0000 (UTC) Received: from alsa.alsa-project.org (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id 5F44A2675B6; Thu, 21 Sep 2017 10:22:40 +0200 (CEST) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id 8F5F026758F; Thu, 21 Sep 2017 08:18:59 +0200 (CEST) Received: from mail-pg0-f50.google.com (mail-pg0-f50.google.com [74.125.83.50]) by alsa0.perex.cz (Postfix) with ESMTP id 92FD626734C for ; Thu, 21 Sep 2017 08:18:57 +0200 (CEST) Received: by mail-pg0-f50.google.com with SMTP id u18so3026373pgo.0 for ; Wed, 20 Sep 2017 23:18:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=9UKJs7bSYshiNCpbGIPWwCRi4TXlyyRz3ngV2Dn2lOE=; b=Q8oXGhjRMjQAipu81SRyxqO2u7YI1xau+51QL9yIkOyV1uJqzIzGEQxdNRbBA54HMR 8glGl0RV2V1L7LEpQ59SgrML58lRIc73cRGZUsdmQWvJr2bGP3nU314ZiEb4j+eOEZIN mr+K3kLa6TSGAnrmNTU5QRF8L6V+ULcwxLqbA= 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:in-reply-to:references; bh=9UKJs7bSYshiNCpbGIPWwCRi4TXlyyRz3ngV2Dn2lOE=; b=QFDWg6FYQtkrtMYqZ7lJeyM4PdSB/3ssN19izd0IUsfyZaQgZZeR8aLL5psCRvL0j+ 1Nwe2ExjVgHCslbvUuYYg62v+9kA8K6QBqJJz3NttFL/VbVvEpa8bdP4/i0BEMZ46hfX o2nq0ryfvgeRGuB148I5ou7T4HDMwihc7QajLvtSp/TkoNR9edD8TUCBLePvO8/4my/t SW0fMJw9/dk1L0QfA5Miw5NNk/vf9rygRZyHvgfu5H0ByHwUe9ED7AvI+Ag7PuPwcIfQ 88eSb33DLeKGYuPisVsepT1IawhPt6HYkuY6Dnv4mSa7NuBNd/YNScJgGrHtCMhqWzK/ B6Pw== X-Gm-Message-State: AHPjjUhX9+jwd4OIW7ZmsZPbQ8VRwVrs+X+BZ31xwBkcJCBNut74kJKr u2yQOY0OL1Z7bSoXCgg4SHzd/Q== X-Google-Smtp-Source: AOwi7QCRVHj5+KX+DJbuq+7kG1odsk+CRbk8U5SaJBDV6LDqpv2j2z7FcFQuwUJ9zr117yNyfusjSw== X-Received: by 10.84.238.143 with SMTP id v15mr4576173plk.303.1505974735836; Wed, 20 Sep 2017 23:18:55 -0700 (PDT) Received: from baolinwangubtpc.spreadtrum.com ([117.18.48.82]) by smtp.gmail.com with ESMTPSA id q23sm1037773pfk.182.2017.09.20.23.18.50 (version=TLS1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 20 Sep 2017 23:18:55 -0700 (PDT) From: Baolin Wang To: perex@perex.cz, tiwai@suse.com Date: Thu, 21 Sep 2017 14:18:07 +0800 Message-Id: X-Mailer: git-send-email 1.7.9.5 In-Reply-To: References: In-Reply-To: References: X-Mailman-Approved-At: Thu, 21 Sep 2017 10:19:53 +0200 Cc: mingo@kernel.org, fabf@skynet.be, arvind.yadav.cs@gmail.com, dharageswari.r@intel.com, linux-kernel@vger.kernel.org, arnd@arndb.de, baolin.wang@linaro.org, vinod.koul@intel.com, hardik.t.shah@intel.com, guneshwor.o.singh@intel.com, lgirdwood@gmail.com, o-takashi@sakamocchi.jp, gudishax.kranthikumar@intel.com, broonie@kernel.org, bhumirks@gmail.com, naveen.m@intel.com, jeeja.kp@intel.com, alsa-devel@alsa-project.org, elfring@users.sourceforge.net, dan.carpenter@oracle.com, deepa.kernel@gmail.com Subject: [alsa-devel] [RFC PATCH 5/7] sound: core: Avoid using timespec for struct snd_timer_status X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP The struct snd_timer_status will use 'timespec' type variables to record timestamp, which is not year 2038 safe on 32bits system. Thus thia patch introduces 'struct snd_timer_status32' and 'struct snd_timer_status64' to handle 32bit time_t and 64bit time_t in native mode, which replace timespec with s64 type. In compat mode, this patch renamed the structure as 'struct compat_snd_timer_status32' to handle 32bit time_t. Moreover we should use 'struct snd_timer_status64' to handle 64bit time_t no matter 32bit or 64bit alignment, since they have the same size. When glibc changes time_t to 64-bit, any recompiled program will issue ioctl commands that the kernel does not understand without this patch. Signed-off-by: Baolin Wang --- sound/core/timer.c | 66 ++++++++++++++++++++++++++++++++++++++++----- sound/core/timer_compat.c | 25 ++++++----------- 2 files changed, 68 insertions(+), 23 deletions(-) diff --git a/sound/core/timer.c b/sound/core/timer.c index f44d702..376b7e6 100644 --- a/sound/core/timer.c +++ b/sound/core/timer.c @@ -79,6 +79,30 @@ struct snd_timer_user { struct mutex ioctl_lock; }; +#if __BITS_PER_LONG == 32 +struct snd_timer_status32 { + struct { s32 tv_sec; s32 tv_nsec; } tstamp; /* Timestamp - last update */ + unsigned int resolution; /* current period resolution in ns */ + unsigned int lost; /* counter of master tick lost */ + unsigned int overrun; /* count of read queue overruns */ + unsigned int queue; /* used queue size */ + unsigned char reserved[64]; /* reserved */ +}; + +#define SNDRV_TIMER_IOCTL_STATUS32 _IOR('T', 0x14, struct snd_timer_status32) +#endif + +struct snd_timer_status64 { + struct { s64 tv_sec; s64 tv_nsec; } tstamp; /* Timestamp - last update */ + unsigned int resolution; /* current period resolution in ns */ + unsigned int lost; /* counter of master tick lost */ + unsigned int overrun; /* count of read queue overruns */ + unsigned int queue; /* used queue size */ + unsigned char reserved[64]; /* reserved */ +}; + +#define SNDRV_TIMER_IOCTL_STATUS64 _IOR('T', 0x14, struct snd_timer_status64) + /* list of timers */ static LIST_HEAD(snd_timer_list); @@ -1798,17 +1822,43 @@ static int snd_timer_user_params(struct file *file, return err; } -static int snd_timer_user_status(struct file *file, - struct snd_timer_status __user *_status) +#if __BITS_PER_LONG == 32 +static int snd_timer_user_status32(struct file *file, + struct snd_timer_status32 __user *_status) + { + struct snd_timer_user *tu; + struct snd_timer_status32 status; + + tu = file->private_data; + if (!tu->timeri) + return -EBADFD; + memset(&status, 0, sizeof(status)); + status.tstamp.tv_sec = tu->tstamp.tv_sec; + status.tstamp.tv_nsec = tu->tstamp.tv_nsec; + status.resolution = snd_timer_resolution(tu->timeri); + status.lost = tu->timeri->lost; + status.overrun = tu->overrun; + spin_lock_irq(&tu->qlock); + status.queue = tu->qused; + spin_unlock_irq(&tu->qlock); + if (copy_to_user(_status, &status, sizeof(status))) + return -EFAULT; + return 0; +} +#endif + +static int snd_timer_user_status64(struct file *file, + struct snd_timer_status64 __user *_status) { struct snd_timer_user *tu; - struct snd_timer_status status; + struct snd_timer_status64 status; tu = file->private_data; if (!tu->timeri) return -EBADFD; memset(&status, 0, sizeof(status)); - status.tstamp = timespec64_to_timespec(tu->tstamp); + status.tstamp.tv_sec = tu->tstamp.tv_sec; + status.tstamp.tv_nsec = tu->tstamp.tv_nsec; status.resolution = snd_timer_resolution(tu->timeri); status.lost = tu->timeri->lost; status.overrun = tu->overrun; @@ -1920,8 +1970,12 @@ static long __snd_timer_user_ioctl(struct file *file, unsigned int cmd, return snd_timer_user_info(file, argp); case SNDRV_TIMER_IOCTL_PARAMS: return snd_timer_user_params(file, argp); - case SNDRV_TIMER_IOCTL_STATUS: - return snd_timer_user_status(file, argp); +#if __BITS_PER_LONG == 32 + case SNDRV_TIMER_IOCTL_STATUS32: + return snd_timer_user_status32(file, argp); +#endif + case SNDRV_TIMER_IOCTL_STATUS64: + return snd_timer_user_status64(file, argp); case SNDRV_TIMER_IOCTL_START: case SNDRV_TIMER_IOCTL_START_OLD: return snd_timer_user_start(file); diff --git a/sound/core/timer_compat.c b/sound/core/timer_compat.c index 6a437eb..c592603 100644 --- a/sound/core/timer_compat.c +++ b/sound/core/timer_compat.c @@ -83,7 +83,7 @@ static int snd_timer_user_info_compat(struct file *file, return 0; } -struct snd_timer_status32 { +struct compat_snd_timer_status32 { struct compat_timespec tstamp; u32 resolution; u32 lost; @@ -93,10 +93,10 @@ struct snd_timer_status32 { }; static int snd_timer_user_status_compat(struct file *file, - struct snd_timer_status32 __user *_status) + struct compat_snd_timer_status32 __user *_status) { struct snd_timer_user *tu; - struct snd_timer_status32 status; + struct compat_snd_timer_status32 status; tu = file->private_data; if (snd_BUG_ON(!tu->timeri)) @@ -115,12 +115,6 @@ static int snd_timer_user_status_compat(struct file *file, return 0; } -#ifdef CONFIG_X86_X32 -/* X32 ABI has the same struct as x86-64 */ -#define snd_timer_user_status_x32(file, s) \ - snd_timer_user_status(file, s) -#endif /* CONFIG_X86_X32 */ - /* */ @@ -128,9 +122,8 @@ enum { SNDRV_TIMER_IOCTL_GPARAMS32 = _IOW('T', 0x04, struct snd_timer_gparams32), SNDRV_TIMER_IOCTL_INFO32 = _IOR('T', 0x11, struct snd_timer_info32), SNDRV_TIMER_IOCTL_STATUS32 = _IOW('T', 0x14, struct snd_timer_status32), -#ifdef CONFIG_X86_X32 - SNDRV_TIMER_IOCTL_STATUS_X32 = _IOW('T', 0x14, struct snd_timer_status), -#endif /* CONFIG_X86_X32 */ + SNDRV_TIMER_IOCTL_STATUS_COMPAT32 = _IOW('T', 0x14, struct compat_snd_timer_status32), + SNDRV_TIMER_IOCTL_STATUS_COMPAT64 = _IOW('T', 0x14, struct snd_timer_status64), }; static long snd_timer_user_ioctl_compat(struct file *file, unsigned int cmd, unsigned long arg) @@ -158,12 +151,10 @@ static long snd_timer_user_ioctl_compat(struct file *file, unsigned int cmd, uns return snd_timer_user_gparams_compat(file, argp); case SNDRV_TIMER_IOCTL_INFO32: return snd_timer_user_info_compat(file, argp); - case SNDRV_TIMER_IOCTL_STATUS32: + case SNDRV_TIMER_IOCTL_STATUS_COMPAT32: return snd_timer_user_status_compat(file, argp); -#ifdef CONFIG_X86_X32 - case SNDRV_TIMER_IOCTL_STATUS_X32: - return snd_timer_user_status_x32(file, argp); -#endif /* CONFIG_X86_X32 */ + case SNDRV_TIMER_IOCTL_STATUS_COMPAT64: + return snd_timer_user_status64(file, argp); } return -ENOIOCTLCMD; }