Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp491427ybl; Tue, 28 Jan 2020 06:47:49 -0800 (PST) X-Google-Smtp-Source: APXvYqzL7IICKK+KA1n1CG8BEMEZN16IXcbREg8641hnfHT5qz2D90DC0ybMruZF8S7w8PuWFPmW X-Received: by 2002:aca:ab51:: with SMTP id u78mr3078319oie.21.1580222869469; Tue, 28 Jan 2020 06:47:49 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1580222869; cv=none; d=google.com; s=arc-20160816; b=0R3sB4MNFU58YN4wVtP3o8lpXET3qIWfnjblcaQgPIzeIuroEfVDa4udYcXg+DXYy5 NCpJeUyuJm9qXvbxoQVsa1lwnoKKy9qsbPUEtMltQQto0hoB2zwxf/DN9aMJBzkft/op gFiMy90FYCF18cUQlBo76iOmWMjVROuOZIqlpN4lR8wqHTE1itbTvH8lbJDKe+NvM73e anJSvyTPmxzI+9ZfB1gkEF2H90Ey2BN+kGBIbBO0yVsY2sosCuXdkqJ2VFDC9UnUKfAb v5xu3HGZW/HAKn+W4vzc6rY/3raC3ie5LrLkxUrRvJIQWcko8UvlAwATxYMOhvX+RttI uk1A== 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=TA+U45w0L+QPAhgLBjXhrmz5VcAXlLuo3ZFEjH7XnqpplyEHPnJX/a3yljRWqi/qe7 5AqXpFljAGbtMfq0sYkTvYI72fTB6kykNSJTREXRsbZsNaX5tCW5XeCzdA40M2rZwoHv E7e1BZ5EcP0SymZF5KOCgCpoey7CO/6FQ/4wmAqWwsRHDv2vcQosUg3cEcEhR9TYX3LW MmO5kv0Vj8nWlf8DE4OJo9JyWT3ijKkXJtpWaOHhIc9G+n2lH+ij3EGvKsW7c2zmymTc 3pRD1Qo8OLCTOfalaZAdjTncbQ5iPCeDn5U15Kii3crymgt1xfrQ4VIHf79+anPob5Ew dkRg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=bbK3X02a; 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 e5si8796000oti.104.2020.01.28.06.47.37; Tue, 28 Jan 2020 06:47:49 -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=bbK3X02a; 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 S1726820AbgA1OKU (ORCPT + 99 others); Tue, 28 Jan 2020 09:10:20 -0500 Received: from mail.kernel.org ([198.145.29.99]:58960 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729126AbgA1OKP (ORCPT ); Tue, 28 Jan 2020 09:10:15 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (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 D267F24688; Tue, 28 Jan 2020 14:10:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1580220614; bh=4tsbLvzpH6KACgrSusRTvQLdfeOm9HSCRWokT2heKuA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bbK3X02aJ/YZPNhaR0e5gJViLd7cYTV6NW3Ojo0O1T33NBA7sfz2xyz1wl0iONBdL esiyzCXEDgiJfmr5u67K16O7aldI9iTTNZaog1AuCKUE3g51ppn//Nhvnk91U1fo/6 nmogmQchJHr3HC/+ACqw+N8HcIMd1rawMBunkHP0= 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.4 040/183] rtc: 88pm860x: fix unintended sign extension Date: Tue, 28 Jan 2020 15:04:19 +0100 Message-Id: <20200128135834.007102906@linuxfoundation.org> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200128135829.486060649@linuxfoundation.org> References: <20200128135829.486060649@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