From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A388620E0 for ; Thu, 7 Apr 2022 01:12:06 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 005E1C385A6; Thu, 7 Apr 2022 01:12:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1649293926; bh=adLbLelwA0eTEMAxwIejJevJ/N5XHRVQmd9kn8IfuU0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WvMSrizTIpPuOtX/ik0gp1Rfkv0/TlkQu2AABS5UTZySKS+unXRIkTL3ytzqAD06p 6Ko+TyvxIDGX3nKipI5L3bIr7PjEcUiGGlgw8ydSLlgsJ0ZP19HpcB4/rM6cM3j3P2 pOD6WVAdH/NfKcDMj4jlFRP9MuOnJcqTXcL29+YTZON6sxrtXJiEkq9tDnLLEsZ9+b eaVdFHkt3RHsxIe23SyNY/SR8xKf9mw4E+kFcRhEGzXgCpgyYT4UJ4YuyldtH+3Fpj opja7SR0fm2l/cTQ+abLUJUUv4QCONo5GNMJSm9Xk94EWLBSlUIRaehO1WT6yzxsjp YPlwFo4JaA3DQ== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Andre Przywara , Jernej Skrabec , Alexandre Belloni , Sasha Levin , a.zummo@towertech.it, wens@csie.org, samuel@sholland.org, linux-rtc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev Subject: [PATCH AUTOSEL 5.16 13/30] rtc: sun6i: Fix time overflow handling Date: Wed, 6 Apr 2022 21:11:23 -0400 Message-Id: <20220407011140.113856-13-sashal@kernel.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220407011140.113856-1-sashal@kernel.org> References: <20220407011140.113856-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-sunxi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit From: Andre Przywara [ Upstream commit 9f6cd82eca7e91a0d0311242a87c6aa3c2737968 ] Using "unsigned long" for UNIX timestamps is never a good idea, and comparing the value of such a variable against U32_MAX does not do anything useful on 32-bit systems. Use the proper time64_t type when dealing with timestamps, and avoid cutting down the time range unnecessarily. This also fixes the flawed check for the alarm time being too far into the future. The check for this condition is actually somewhat theoretical, as the RTC counts till 2033 only anyways, and 2^32 seconds from now is not before the year 2157 - at which point I hope nobody will be using this hardware anymore. Signed-off-by: Andre Przywara Reviewed-by: Jernej Skrabec Signed-off-by: Alexandre Belloni Link: https://lore.kernel.org/r/20220211122643.1343315-4-andre.przywara@arm.com Signed-off-by: Sasha Levin --- drivers/rtc/rtc-sun6i.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/drivers/rtc/rtc-sun6i.c b/drivers/rtc/rtc-sun6i.c index 711832c758ae..bcc0c2ce4b4e 100644 --- a/drivers/rtc/rtc-sun6i.c +++ b/drivers/rtc/rtc-sun6i.c @@ -138,7 +138,7 @@ struct sun6i_rtc_dev { const struct sun6i_rtc_clk_data *data; void __iomem *base; int irq; - unsigned long alarm; + time64_t alarm; struct clk_hw hw; struct clk_hw *int_osc; @@ -510,10 +510,8 @@ static int sun6i_rtc_setalarm(struct device *dev, struct rtc_wkalrm *wkalrm) struct sun6i_rtc_dev *chip = dev_get_drvdata(dev); struct rtc_time *alrm_tm = &wkalrm->time; struct rtc_time tm_now; - unsigned long time_now = 0; - unsigned long time_set = 0; - unsigned long time_gap = 0; - int ret = 0; + time64_t time_now, time_set; + int ret; ret = sun6i_rtc_gettime(dev, &tm_now); if (ret < 0) { @@ -528,9 +526,7 @@ static int sun6i_rtc_setalarm(struct device *dev, struct rtc_wkalrm *wkalrm) return -EINVAL; } - time_gap = time_set - time_now; - - if (time_gap > U32_MAX) { + if ((time_set - time_now) > U32_MAX) { dev_err(dev, "Date too far in the future\n"); return -EINVAL; } @@ -539,7 +535,7 @@ static int sun6i_rtc_setalarm(struct device *dev, struct rtc_wkalrm *wkalrm) writel(0, chip->base + SUN6I_ALRM_COUNTER); usleep_range(100, 300); - writel(time_gap, chip->base + SUN6I_ALRM_COUNTER); + writel(time_set - time_now, chip->base + SUN6I_ALRM_COUNTER); chip->alarm = time_set; sun6i_rtc_setaie(wkalrm->enabled, chip); -- 2.35.1 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 928A6C433FE for ; Thu, 7 Apr 2022 01:14:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=rUsrL1IhhhXPj0Frq0uO5MKFJdW9it/y4WfurCH8bLs=; b=EHtGV83okUN3g/ kqYOZK+1au1JqmFSxc1ipEvusVt03UKMm0uPAvtsX7Jsi570H0rctuP25YcHrK8/ueWvAwcvVNaWf 5KFeuu456PPNqXlRLFjjNN8jhY7t1KNGr4D8iyN+gsimRSaZv6XxPrNwM2X6cSMftV3+eAsxuPxwB AV7SRPXeZQDo988LhYjjpaL94pW3DeMoukz21l3u480mhgqEA+s9hbShLSZ7HG3PvABZee4SP6OBj IHeBUHrTeG0tHv0qkQRG0Ffi72dVFWrkHKiZA2NMGbg/7iqo0nVZ4wZa7asGTl3dqXLh49gswz6aI cLXo40FJhP2mCt5xQmSw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1ncGhx-008VLn-UO; Thu, 07 Apr 2022 01:13:10 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1ncGgx-008Ugd-1f for linux-arm-kernel@lists.infradead.org; Thu, 07 Apr 2022 01:12:08 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 8EF8B61DB4; Thu, 7 Apr 2022 01:12:06 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 005E1C385A6; Thu, 7 Apr 2022 01:12:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1649293926; bh=adLbLelwA0eTEMAxwIejJevJ/N5XHRVQmd9kn8IfuU0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WvMSrizTIpPuOtX/ik0gp1Rfkv0/TlkQu2AABS5UTZySKS+unXRIkTL3ytzqAD06p 6Ko+TyvxIDGX3nKipI5L3bIr7PjEcUiGGlgw8ydSLlgsJ0ZP19HpcB4/rM6cM3j3P2 pOD6WVAdH/NfKcDMj4jlFRP9MuOnJcqTXcL29+YTZON6sxrtXJiEkq9tDnLLEsZ9+b eaVdFHkt3RHsxIe23SyNY/SR8xKf9mw4E+kFcRhEGzXgCpgyYT4UJ4YuyldtH+3Fpj opja7SR0fm2l/cTQ+abLUJUUv4QCONo5GNMJSm9Xk94EWLBSlUIRaehO1WT6yzxsjp YPlwFo4JaA3DQ== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Andre Przywara , Jernej Skrabec , Alexandre Belloni , Sasha Levin , a.zummo@towertech.it, wens@csie.org, samuel@sholland.org, linux-rtc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev Subject: [PATCH AUTOSEL 5.16 13/30] rtc: sun6i: Fix time overflow handling Date: Wed, 6 Apr 2022 21:11:23 -0400 Message-Id: <20220407011140.113856-13-sashal@kernel.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220407011140.113856-1-sashal@kernel.org> References: <20220407011140.113856-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220406_181207_205039_033A3E80 X-CRM114-Status: GOOD ( 16.92 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org From: Andre Przywara [ Upstream commit 9f6cd82eca7e91a0d0311242a87c6aa3c2737968 ] Using "unsigned long" for UNIX timestamps is never a good idea, and comparing the value of such a variable against U32_MAX does not do anything useful on 32-bit systems. Use the proper time64_t type when dealing with timestamps, and avoid cutting down the time range unnecessarily. This also fixes the flawed check for the alarm time being too far into the future. The check for this condition is actually somewhat theoretical, as the RTC counts till 2033 only anyways, and 2^32 seconds from now is not before the year 2157 - at which point I hope nobody will be using this hardware anymore. Signed-off-by: Andre Przywara Reviewed-by: Jernej Skrabec Signed-off-by: Alexandre Belloni Link: https://lore.kernel.org/r/20220211122643.1343315-4-andre.przywara@arm.com Signed-off-by: Sasha Levin --- drivers/rtc/rtc-sun6i.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/drivers/rtc/rtc-sun6i.c b/drivers/rtc/rtc-sun6i.c index 711832c758ae..bcc0c2ce4b4e 100644 --- a/drivers/rtc/rtc-sun6i.c +++ b/drivers/rtc/rtc-sun6i.c @@ -138,7 +138,7 @@ struct sun6i_rtc_dev { const struct sun6i_rtc_clk_data *data; void __iomem *base; int irq; - unsigned long alarm; + time64_t alarm; struct clk_hw hw; struct clk_hw *int_osc; @@ -510,10 +510,8 @@ static int sun6i_rtc_setalarm(struct device *dev, struct rtc_wkalrm *wkalrm) struct sun6i_rtc_dev *chip = dev_get_drvdata(dev); struct rtc_time *alrm_tm = &wkalrm->time; struct rtc_time tm_now; - unsigned long time_now = 0; - unsigned long time_set = 0; - unsigned long time_gap = 0; - int ret = 0; + time64_t time_now, time_set; + int ret; ret = sun6i_rtc_gettime(dev, &tm_now); if (ret < 0) { @@ -528,9 +526,7 @@ static int sun6i_rtc_setalarm(struct device *dev, struct rtc_wkalrm *wkalrm) return -EINVAL; } - time_gap = time_set - time_now; - - if (time_gap > U32_MAX) { + if ((time_set - time_now) > U32_MAX) { dev_err(dev, "Date too far in the future\n"); return -EINVAL; } @@ -539,7 +535,7 @@ static int sun6i_rtc_setalarm(struct device *dev, struct rtc_wkalrm *wkalrm) writel(0, chip->base + SUN6I_ALRM_COUNTER); usleep_range(100, 300); - writel(time_gap, chip->base + SUN6I_ALRM_COUNTER); + writel(time_set - time_now, chip->base + SUN6I_ALRM_COUNTER); chip->alarm = time_set; sun6i_rtc_setaie(wkalrm->enabled, chip); -- 2.35.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel