Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp749384ybl; Fri, 24 Jan 2020 08:53:22 -0800 (PST) X-Google-Smtp-Source: APXvYqyOsenzV4pIjIY8UV6LY86Cy7d0iEM3uTXPcwQjQRqjI8h+yd3DQ45GSYG/nXyy/m+vd36R X-Received: by 2002:a9d:5885:: with SMTP id x5mr3326444otg.132.1579884802215; Fri, 24 Jan 2020 08:53:22 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1579884802; cv=none; d=google.com; s=arc-20160816; b=LDx2tRNeVAIFS8xen070KPq9i/KVdKDJabVjPAvKBvk00ofthLLe4W01K5lE4e3I8X W+b4C91iwzalt8IItD0Zm+mSU4mtDEvA3V4qW1Qo2zd5lb9nwU9DOOFvjS8xC3diRy8J GI4jgNiCKsZCLdP88BfezM7Zg1wsrB0AwARCXsGH1YJcUyNc6EV6Ak7Aq4nhZi/skJbv NXrYrwVQAl37mNoFwOt3r4sSR2nILUUc9Oh9WvMAf6YqAj7IY38qTfgrZbaUg3AqG2dx Ju9olpgSLsP9JgKIxYgsusD15oqMgto21ijjU0V1Xh8u/GrKmm8LRAY5AZ2ghU9GJ4wM b/cg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=tVYvQGJoNS5dOJfFiCiiamMVC7lyh6rAFs2s6o/8+sY=; b=S9xM6Xx2+m2ZkxS8M1mLJ1i2cYEVxsLgqulmTa3d56Z/DhLdHxevP5tb+VV5WFVeEt DmGmq1RkR/UQBLz3FL7AAD0zpzc8qwjIPl+EngMRrCjQeBj9yrcE/tk3t+SmuBqTWLV5 GOmSjRivIRxdFfx5jofIaVXPb1eeRpVFeN0oH4MhTcoAQ1p9SMYOAzV4aw+CvE1oVzG4 R85vi1mVCv+Vg90h0euJ+Y0pm5iwN2Eci27t6X/eVs3fivfHpxfY8yGFJ+oIIsm5Z8F1 MTjFiY7j5imVza9LvaAxkiwnI02myfL+rE9dRI6asOdS2e9P7E9OrynkOckirOr/ZjDE hgfw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=oInkUIUg; 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 h5si3015605otn.280.2020.01.24.08.53.10; Fri, 24 Jan 2020 08:53:22 -0800 (PST) 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; dkim=pass header.i=@kernel.org header.s=default header.b=oInkUIUg; 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 S1733144AbgAXLJl (ORCPT + 99 others); Fri, 24 Jan 2020 06:09:41 -0500 Received: from mail.kernel.org ([198.145.29.99]:45246 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732591AbgAXLJi (ORCPT ); Fri, 24 Jan 2020 06:09:38 -0500 Received: from localhost (ip-213-127-102-57.ip.prioritytelecom.net [213.127.102.57]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id BE7E420663; Fri, 24 Jan 2020 11:09:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1579864177; bh=trrOub68xFqzEaB5R7tLHssXE3rZFaaLL1IBSML6mDk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oInkUIUgWUtJzNrxwo5lxfbdPEd9e8miI4EOd6OGeKVu1rsPMxHbHjpM0qF/xXzXb xPI2XZQrTHnTusXO2AWKHmHrRYFByd3RjgCj4OrdPgt4gz8eCbHdynzNZ9ZawSy1DP C2AnitQZOOklcZkhknIpEr9vw3A7eAmtADYnumXs= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Colin Ian King , Alexandre Belloni , Sasha Levin Subject: [PATCH 4.19 180/639] rtc: 88pm80x: fix unintended sign extension Date: Fri, 24 Jan 2020 10:25:50 +0100 Message-Id: <20200124093109.705047680@linuxfoundation.org> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200124093047.008739095@linuxfoundation.org> References: <20200124093047.008739095@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Colin Ian King [ Upstream commit fb0b322537a831b5b0cb948c56f8f958ce493d3a ] Shifting a u8 by 24 will cause the value to be promoted to an integer. If the top bit of the u8 is set then the following conversion to an unsigned long will sign extend the value causing the upper 32 bits to be set in the result. Fix this by casting the u8 value to an unsigned long before the shift. Detected by CoverityScan, CID#714646-714649 ("Unintended sign extension") Fixes: 2985c29c1964 ("rtc: Add rtc support to 88PM80X PMIC") Signed-off-by: Colin Ian King Signed-off-by: Alexandre Belloni Signed-off-by: Sasha Levin --- drivers/rtc/rtc-88pm80x.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/drivers/rtc/rtc-88pm80x.c b/drivers/rtc/rtc-88pm80x.c index cab293cb2bf0b..1fc48ebd3cd05 100644 --- a/drivers/rtc/rtc-88pm80x.c +++ b/drivers/rtc/rtc-88pm80x.c @@ -114,12 +114,14 @@ static int pm80x_rtc_read_time(struct device *dev, struct rtc_time *tm) unsigned char buf[4]; unsigned long ticks, base, data; regmap_raw_read(info->map, PM800_RTC_EXPIRE2_1, buf, 4); - base = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; + base = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | + (buf[1] << 8) | buf[0]; dev_dbg(info->dev, "%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3]); /* load 32-bit read-only counter */ regmap_raw_read(info->map, PM800_RTC_COUNTER1, buf, 4); - data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; + data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | + (buf[1] << 8) | buf[0]; ticks = base + data; dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", base, data, ticks); @@ -137,7 +139,8 @@ static int pm80x_rtc_set_time(struct device *dev, struct rtc_time *tm) /* load 32-bit read-only counter */ regmap_raw_read(info->map, PM800_RTC_COUNTER1, buf, 4); - data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; + data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | + (buf[1] << 8) | buf[0]; base = ticks - data; dev_dbg(info->dev, "set base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", base, data, ticks); @@ -158,11 +161,13 @@ static int pm80x_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) int ret; regmap_raw_read(info->map, PM800_RTC_EXPIRE2_1, buf, 4); - base = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; + base = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | + (buf[1] << 8) | buf[0]; dev_dbg(info->dev, "%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3]); regmap_raw_read(info->map, PM800_RTC_EXPIRE1_1, buf, 4); - data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; + data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | + (buf[1] << 8) | buf[0]; ticks = base + data; dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", base, data, ticks); @@ -185,12 +190,14 @@ static int pm80x_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) regmap_update_bits(info->map, PM800_RTC_CONTROL, PM800_ALARM1_EN, 0); regmap_raw_read(info->map, PM800_RTC_EXPIRE2_1, buf, 4); - base = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; + base = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | + (buf[1] << 8) | buf[0]; dev_dbg(info->dev, "%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3]); /* load 32-bit read-only counter */ regmap_raw_read(info->map, PM800_RTC_COUNTER1, buf, 4); - data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; + data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | + (buf[1] << 8) | buf[0]; ticks = base + data; dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", base, data, ticks); -- 2.20.1