Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp747910ybl; Fri, 24 Jan 2020 08:51:33 -0800 (PST) X-Google-Smtp-Source: APXvYqy+YmZRXHjlKvWFaPHM2LCpbGX1vMdn5MYAXj1fK3xQX2oJIuIZHHe3UfYiaJs1Sf1JYEpw X-Received: by 2002:a05:6808:486:: with SMTP id z6mr72715oid.117.1579884693657; Fri, 24 Jan 2020 08:51:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1579884693; cv=none; d=google.com; s=arc-20160816; b=c8KAMq72wp4Ap8dOy5l7azc0y/VNE40q3YcRJyociTGFOHj+5T30DnC9QwWXRnXOI5 WK08XRJTqSkDCPa5kGb4eD6QNgDBx6UyY0PEMVQpiiZmbLtrcArPihoelBDnxLcKk3s9 Ttmc/95dnbenXnUzvgWtfcfogDSzT54GJQMDKn72Ktqjcnzk6IdaJsDM42zLT7C3MsXx 6RY/GVrr4TYODFqsoSHv4fbjWZSP+gVL9bYzgVzgUcs4Cu3nYsJQa96xnBc3ZKCHR5mM CCPPWFJ/rWtq8WmH2eV+wSdxfpRjD7trRtlSsJAE6eE9o/TPSN6VqW6QnOO3PfaXzl6I a/mg== 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=p3L55Hn2RnjufaXubshzg/yT1YFWgXCPa7JLnVvoHFA=; b=BA2oNO7xdUPaTrbiQ0xqY8yxjAiGLCd6x05QOsLrfRgFP8D7JllQzcQzVXknE1N4m2 EkmU1bMKUeCYnkgecx0PiOZMFHbsOygV4uklocjDUSuvnlciKl4nZPfwgRAPzKktNLQt tr+azuDcKv/rH9rmh9VYuKF0GACv4sIgPAS228TYDTkVKdrWeIIMcuP+FXl7xcxnD97v nFWZ2uGQQjLG3gyyFQdCEWv3bd5hK8Q4NBApIbtQRFExr9yDSxAUGoxv11vey2DPzyta i6LZOPeLb98yyNx+VaPpTaIDO0kHG8fdLYEp5lpbV8as3qACRx7VpVfml/cw2LNxki2m MnlQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=0Lrpdt+8; 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 e192si48518oib.82.2020.01.24.08.51.20; Fri, 24 Jan 2020 08:51:33 -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=0Lrpdt+8; 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 S2389775AbgAXLJi (ORCPT + 99 others); Fri, 24 Jan 2020 06:09:38 -0500 Received: from mail.kernel.org ([198.145.29.99]:45180 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729384AbgAXLJf (ORCPT ); Fri, 24 Jan 2020 06:09:35 -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 513E320708; Fri, 24 Jan 2020 11:09:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1579864174; bh=FNDlCaA7CsRZz0x1me+unknOSEKFfEY7IfzhP3KWdJI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=0Lrpdt+8mpNSkmR9F95yfu86HHgx1L8G2XRPt/Ll/2q1oni5cqFviYetl3eR55uzy QcD6AkS9wq8Cf1vyY+YfMfkR9cfW11ghW4BuQivCmRkrio7GX6vv2vHVOTO4hcnPur cuyxIYiAF97+s5fGr/qStzIyFhyrR3X9MEh6gWX0= 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 179/639] rtc: 88pm860x: fix unintended sign extension Date: Fri, 24 Jan 2020 10:25:49 +0100 Message-Id: <20200124093109.587325741@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 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 fbcf13bbbd8d1..73697e4b18a9d 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