Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp2675812pxj; Mon, 14 Jun 2021 04:42:12 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwP4jxOppQVzUKsr57ysciarqanm8ChC3KaVukuyh9uDgQYWmiigXlNpzRscYNN3x71Ae4M X-Received: by 2002:a17:906:278f:: with SMTP id j15mr15315040ejc.388.1623670932431; Mon, 14 Jun 2021 04:42:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623670932; cv=none; d=google.com; s=arc-20160816; b=ziDEc1uzwYqPFCiOohyGm1lpy/sXApxUfQwqIpCLftbQoWhTPpJG6V0cI4hOprZetH 5qT3Bo2Ig/HGOc1yy/Rp+kNMD1pMAuSClSPha/i202d/LrSur4T8VtGb+bDZVmtW5pic DTf1ALx0m4t+eHNKrI/h2wYMxDnVSBpWvmGKQvbfRQImV+9D+CoxuzrPBavmbtdTMlWo sza0GslcjQYpMlZaRXSQrZNHVjKaQcO1U3Hkv3qQ6gm+zKq5h4BS+gbgVJ/iuv8le7YG uD9/g+5Wy+SQPWsWZNihdhkDFO1Cik5L7DoSvl4CnxLC5ZUnKsypVka2Sj4N3xciLOZl jNWA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=8nAjVaFx+8+ZBfco4g7ritqk7FG8lLcgJYzum7umNnM=; b=aLS4+DQwFG6keYphKgrN84HXopek6eRIi2jTATP/sDdCrVUAy8NQLyNgbjVTMNHGXn zRi/wlDB6k3bpYJdXRt3lxXZn0QGgtoiqMik+Y/s8wVlShth2QRJAx5eujnnMci39pG/ Ad2qwHKfIPlevWe8+tO5FVydCuL+NBlS+PIa5o9Ez50yyIhQJW/yvmc7/ieKFYEs9U5Y cGrIIYKw8JFrtsECm2hxaySC6kfB12DlohYIkskbzg/Nvu+UbVK+sUUQLhMbDTwVJ8oX ZPjy4Meyy+qXrjfbUCSQawID67hyp436wHRKcX2EJByBMb13vhtiA4OZxJOdo+isjWKB 54EQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=siemens.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id u16si11860955edb.334.2021.06.14.04.41.49; Mon, 14 Jun 2021 04:42:12 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=siemens.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235998AbhFNLlv (ORCPT + 99 others); Mon, 14 Jun 2021 07:41:51 -0400 Received: from goliath.siemens.de ([192.35.17.28]:58848 "EHLO goliath.siemens.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235495AbhFNLbc (ORCPT ); Mon, 14 Jun 2021 07:31:32 -0400 X-Greylist: delayed 1084 seconds by postgrey-1.27 at vger.kernel.org; Mon, 14 Jun 2021 07:31:31 EDT Received: from mail2.sbs.de (mail2.sbs.de [192.129.41.66]) by goliath.siemens.de (8.15.2/8.15.2) with ESMTPS id 15EBAFkJ005424 (version=TLSv1.2 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 14 Jun 2021 13:10:15 +0200 Received: from coregen2.erlf.siemens.de (coregen2.erlf.siemens.de [157.163.234.63]) by mail2.sbs.de (8.15.2/8.15.2) with ESMTP id 15EBAEHU023202; Mon, 14 Jun 2021 13:10:14 +0200 From: Werner Zeh To: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, x86@kernel.org, linux-kernel@vger.kernel.org Cc: Werner Zeh Subject: [PATCH 1/1] x86/kernel/rtc: add sanity check for RTC date and time Date: Mon, 14 Jun 2021 13:09:46 +0200 Message-Id: <20210614110946.15587-1-werner.zeh@siemens.com> X-Mailer: git-send-email 2.19.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The timekeeper is synchronized with the CMOS RTC when it is initialized. If the RTC buffering is bad (not buffered at all, empty battery) the RTC registers can contain random data. In order to avoid date and time being completely rubbish check the sanity of the registers before calling mktime64. If the values are not valid, set tv_sec to 0 so that at least the starting time is valid. Signed-off-by: Werner Zeh --- [resent due to wrong lkml address] arch/x86/kernel/rtc.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/arch/x86/kernel/rtc.c b/arch/x86/kernel/rtc.c index 586f718b8e95..f4af7b18c6c0 100644 --- a/arch/x86/kernel/rtc.c +++ b/arch/x86/kernel/rtc.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -64,6 +65,7 @@ void mach_get_cmos_time(struct timespec64 *now) { unsigned int status, year, mon, day, hour, min, sec, century = 0; unsigned long flags; + struct rtc_time tm = {0}; /* * If pm_trace abused the RTC as storage, set the timespec to 0, @@ -118,7 +120,15 @@ void mach_get_cmos_time(struct timespec64 *now) } else year += CMOS_YEARS_OFFS; - now->tv_sec = mktime64(year, mon, day, hour, min, sec); + tm.tm_sec = sec; + tm.tm_min = min; + tm.tm_hour = hour; + tm.tm_mday = day; + tm.tm_mon = mon; + tm.tm_year = year; + now->tv_sec = 0; + if (rtc_valid_tm(&tm) == 0) + now->tv_sec = mktime64(year, mon, day, hour, min, sec); now->tv_nsec = 0; } -- 2.21.3