Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp549450ybl; Fri, 24 Jan 2020 05:19:03 -0800 (PST) X-Google-Smtp-Source: APXvYqxp4uJjSJ17z2gJA7R20+ckwEdnfZvIiH93VU0H0kCw3RzVakXSXTLxjIHJEzUFICdgJFLQ X-Received: by 2002:a9d:68d1:: with SMTP id i17mr2504932oto.367.1579871943141; Fri, 24 Jan 2020 05:19:03 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1579871943; cv=none; d=google.com; s=arc-20160816; b=wSOgIXPKh/D0sDQkj5HuEfR5qpvmQJXMhHez+JkfSvExHT6yRiLJAgkC3hLA8Q6C0C gwHKF41dotNSvfeiny/1CbfBXM9n/0Ae3avO5TNokenCIvXuEX2tulsAE+uXZL3ISD70 +ChxLLlI8cdxeB9nfbhxFi1j6xDsBDDrQClYmnAt29WyUJjd5Bj3BHl9eS4tm7mEOcXQ V/3z2s+QuXxtTfMS0TBTT0ZgwyG090gm+sZgBFtzNWp1t52OsI3d5M4v0RfRD8j2wari 4dVTjr+fYLZDm4KSMXVc6/fdYiAOT5l1YJ809o1jh6Ev2ttzoausxq4zlaUqxzJ4x8S9 RXFg== 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=5R0zTzKTG2LuaHW+UoER5uCb5+3ko2l52LNEHROJ9Zs=; b=H3R3XL9GJEXlaWWgsSsCYBLHZ7hfqP7iznrjJ87zq9gxgFJMSAU/uI7dwjDsRLkNuK iedK7vnZwWx2eF5WRFAxXEcB/QwOhp5qZZ23jRV76Zuyh8NxWCpmWM3KluJfanyJREoU heb4xkH06SgIAW28MOdie5SotxILyoshSu2eBmE+1ZeIa++x7INRu0fZH6mkmI1qdwIt LussnoNwm9YLdYYtpH94yfJHK6CErsfO5PIvrser5MWkurJXEIuO+JJNH0wWgtOajSkh Zj3UGRux3TS0KoWewEHvMCpTTV2e0cOSUeDo6WmzNlNSJ3my+9DbaZddNva2cyu+8RBK SBOg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="oxKa/Xsm"; 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 p11si2802338ota.300.2020.01.24.05.18.50; Fri, 24 Jan 2020 05:19:03 -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="oxKa/Xsm"; 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 S2387858AbgAXJtr (ORCPT + 99 others); Fri, 24 Jan 2020 04:49:47 -0500 Received: from mail.kernel.org ([198.145.29.99]:50262 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729375AbgAXJtp (ORCPT ); Fri, 24 Jan 2020 04:49:45 -0500 Received: from localhost (unknown [145.15.244.15]) (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 92DA4208C4; Fri, 24 Jan 2020 09:49:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1579859384; bh=4tsbLvzpH6KACgrSusRTvQLdfeOm9HSCRWokT2heKuA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oxKa/XsmdD/4yQoPIDUqoUDwBQlnFWJyou02UqsypC/mfkWlm0ejmfCixDmksmcSm qs6mfyo6aSsJjX5BoZr2WSbmXUZSC7b4jY9v/ExEWr+P9dnwB/QYNkw3oh1JaFRAAS yHutOcBOS3iiklG+QxgRAxx6ixcg3B2d+PE5Mktc= 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.14 093/343] rtc: 88pm860x: fix unintended sign extension Date: Fri, 24 Jan 2020 10:28:31 +0100 Message-Id: <20200124092932.287932961@linuxfoundation.org> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200124092919.490687572@linuxfoundation.org> References: <20200124092919.490687572@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 dc9e47160626cdb58d5c39a4f43dcfdb27a5c004 ] 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#144925-144928 ("Unintended sign extension") Fixes: 008b30408c40 ("mfd: Add rtc support to 88pm860x") Signed-off-by: Colin Ian King Signed-off-by: Alexandre Belloni Signed-off-by: Sasha Levin --- drivers/rtc/rtc-88pm860x.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/drivers/rtc/rtc-88pm860x.c b/drivers/rtc/rtc-88pm860x.c index 166faae3a59cd..7d3e5168fcefc 100644 --- a/drivers/rtc/rtc-88pm860x.c +++ b/drivers/rtc/rtc-88pm860x.c @@ -115,11 +115,13 @@ static int pm860x_rtc_read_time(struct device *dev, struct rtc_time *tm) pm860x_page_bulk_read(info->i2c, REG0_ADDR, 8, buf); dev_dbg(info->dev, "%x-%x-%x-%x-%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); - base = (buf[1] << 24) | (buf[3] << 16) | (buf[5] << 8) | buf[7]; + base = ((unsigned long)buf[1] << 24) | (buf[3] << 16) | + (buf[5] << 8) | buf[7]; /* load 32-bit read-only counter */ pm860x_bulk_read(info->i2c, PM8607_RTC_COUNTER1, 4, buf); - 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); @@ -145,7 +147,8 @@ static int pm860x_rtc_set_time(struct device *dev, struct rtc_time *tm) /* load 32-bit read-only counter */ pm860x_bulk_read(info->i2c, PM8607_RTC_COUNTER1, 4, buf); - 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); @@ -170,10 +173,12 @@ static int pm860x_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) pm860x_page_bulk_read(info->i2c, REG0_ADDR, 8, buf); dev_dbg(info->dev, "%x-%x-%x-%x-%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); - base = (buf[1] << 24) | (buf[3] << 16) | (buf[5] << 8) | buf[7]; + base = ((unsigned long)buf[1] << 24) | (buf[3] << 16) | + (buf[5] << 8) | buf[7]; pm860x_bulk_read(info->i2c, PM8607_RTC_EXPIRE1, 4, buf); - 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); @@ -198,11 +203,13 @@ static int pm860x_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) pm860x_page_bulk_read(info->i2c, REG0_ADDR, 8, buf); dev_dbg(info->dev, "%x-%x-%x-%x-%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); - base = (buf[1] << 24) | (buf[3] << 16) | (buf[5] << 8) | buf[7]; + base = ((unsigned long)buf[1] << 24) | (buf[3] << 16) | + (buf[5] << 8) | buf[7]; /* load 32-bit read-only counter */ pm860x_bulk_read(info->i2c, PM8607_RTC_COUNTER1, 4, buf); - 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