From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wr1-f43.google.com (mail-wr1-f43.google.com [209.85.221.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5285735970F for ; Tue, 7 Apr 2026 19:21:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.43 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775589714; cv=none; b=ONp/uHp3ADlPkhB800wO84VLX3lt+yVuH2AL+rdq7hc1uUXi3a2y0P+4a4hZqAiRa+NnzoFTN/Snjh5Dq4S1IxymQ1kdGA9SG9SAqS7Q0oRtePOgrjZeu14mJCqwGM8QzqXpOcp8/DT+3iWLRple2/QqzS1Z5daUcW/yeUPDgR0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775589714; c=relaxed/simple; bh=MKoE3h0DuYR0lgEIvM6gIM01XUL/EcIa7FItQK0XwVc=; h=Date:From:To:Cc:Subject:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=tzJCZBIHDoEklFyi1UPkbRaJM/83SXioWcZhXhcoPz/LdFigFaFA9aycup3kLc9C/DQAX3TZGNZFnUYwM9yWXlUB/KccqTgs+TQ+oIwchPBx7pjK7gMlSmbzm0hrpnv6fNEg/6VZ6Ql5SEuvLC2Cr4Ar44coufxJ3dL5ztj2qWs= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=pNMomS95; arc=none smtp.client-ip=209.85.221.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="pNMomS95" Received: by mail-wr1-f43.google.com with SMTP id ffacd0b85a97d-43cfd832155so3419570f8f.1 for ; Tue, 07 Apr 2026 12:21:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775589710; x=1776194510; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:subject:cc:to:from:date:from:to:cc:subject:date :message-id:reply-to; bh=XTFUY1Kqg7irJGktxqz9kIPDduQ1qlHcsqGBW7GGikk=; b=pNMomS951hcgDieBfxDZMBBrZfWj31yTNhj1ZBSRMXs5AOxfeIp0FNSEltIl7xq6z/ GYkqWg7TAINL1FXSK01WZgk1GtTSOF4dg1OiZGfE6+TjlVwmLsRJqaaAIHdUQMNy4Djq 2ZPqRmpWz+qJOgxI9f+onxFPnXHmS0HCf/cFhoCxIurNSDsCEVgFSqYO2NUb4oLGlkOb yljSEcd5FHYSTcjr1NlbvCEUM3DOAwcuol7r+HxczNIN7NxF+XDvl/TY7Tcf6Ts9KZnz o7EGYCVR9oJYAYoqu1mA+rqhfk0gCjVt39CUVcsRvrDSr/XYVhcWadTCrOz8X3bSF7Vi 8IXw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775589710; x=1776194510; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:subject:cc:to:from:date:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=XTFUY1Kqg7irJGktxqz9kIPDduQ1qlHcsqGBW7GGikk=; b=f95Kc2i9PMtD8GCYXlzr9TspHAdEgs3ZhntFk7vXaQpNyeJ6Dc1czJJgMkjX8S24jQ yvrqIIVYsFak+lXUA1I43SfHO7Om81kKClj9w7JVutpKRTgd62iWFd3L88JhN4ii/fA/ UD2meaDLdHH0MVf+5PMYWB+jMiF3rKrYsHyf4pZhFFVnY08leUIUSUNsVJhkWJ8H7ygQ fjj7irqfFNgjDnDgsniq0mmrUJ0BsNTXGSYQnsb3whKFHohKnFezNhg6oNsXi4LuK1xs Z5E4GxOy2fSBHPJNVp+bWpUR6Xo22f7hWKvBWdkukmr06JcbX+KTolyQQU6PjFlfbyZw woRA== X-Forwarded-Encrypted: i=1; AJvYcCX5GQurN4zI2znMDKSOCc39jNKo54z5pOB27a8PC1bxJA+gNh8Hef88RHwD93Amhxvx+Ao5p1JFNVbVt9Q=@vger.kernel.org X-Gm-Message-State: AOJu0YzkbrW+jXe6sWSUnYPNEw7QmAjAs7NYsMbLQwa58lYH0KJlNbo/ 3407jAel2xtiNH7ZeF5OSuNuTH34Fw0l/nYlddgxbnvahQ1BseW/Aa1y X-Gm-Gg: AeBDieuYjDIW6z6BGcTSVbx2gPHN4X3uyWf72qa/ciTt8BuHK5n+KdJo7act29PgPCQ TVT5YhDtrEhFwJ1yJw4+gEZNHgr/g+ZtiZiXiVTxbJd10WRBC5KwgGcaO4BDs261/QkHAsdKfnx QfyBssC9kLeK9bbN2i8aCCfx0rZMpjC+WqnB1oVHBNurAP0Zl3rW0lAG4wqAFIvrgqyhlsjdzNb cf7O1IcZ1KJfK3U8vTSD3Q2geTyAWrvZ91W5TjTznUVkkUGPbeBLZoKKXIcaobHIYy13V9MKIHf MqJZ3y3XlJcJKxsJ/ehVt10m7NEIEZlj2ssL33OKP6ig9km1T2nNwURI7yJKVJE6tARgBSB12NG aVKz8nj9Y3HXTUB6mMJAHOD2ZCGWVJV2D9y6BE7maSatTepwwZVCHQHpeAMrejdp9Ry8Q8Cn9sl Kpq+1qJE+oDLmdFYngwTSr5A2Gw+bJOr2yAhpnWItXqbN844SubJVl7iDALIFazINAGteNh6ywD 5Y= X-Received: by 2002:a05:6000:2c01:b0:43c:f0c0:c571 with SMTP id ffacd0b85a97d-43d2930fee1mr27805566f8f.47.1775589709607; Tue, 07 Apr 2026 12:21:49 -0700 (PDT) Received: from pumpkin (82-69-66-36.dsl.in-addr.zen.co.uk. [82.69.66.36]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-43d1e4e1c27sm49956069f8f.26.2026.04.07.12.21.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 12:21:49 -0700 (PDT) Date: Tue, 7 Apr 2026 20:21:46 +0100 From: David Laight To: "Pradhan, Sanman" Cc: "linux-hwmon@vger.kernel.org" , "linux@roeck-us.net" , "linux@weissschuh.net" , "cosmo.chou@quantatw.com" , "mail@carsten-spiess.de" , "linux-kernel@vger.kernel.org" , Sanman Pradhan , "stable@vger.kernel.org" Subject: Re: [PATCH v2 2/3] hwmon: (isl28022) Fix integer overflow in power calculation on 32-bit Message-ID: <20260407202146.59b1476f@pumpkin> In-Reply-To: <20260407173624.247803-3-sanman.pradhan@hpe.com> References: <20260407173624.247803-1-sanman.pradhan@hpe.com> <20260407173624.247803-3-sanman.pradhan@hpe.com> X-Mailer: Claws Mail 4.1.1 (GTK 3.24.38; arm-unknown-linux-gnueabihf) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit On Tue, 7 Apr 2026 17:38:01 +0000 "Pradhan, Sanman" wrote: > From: Sanman Pradhan > > isl28022_read_power() computes: > > *val = ((51200000L * ((long)data->gain)) / > (long)data->shunt) * (long)regval; > > On 32-bit platforms, 'long' is 32 bits. With gain=8 and shunt=10000 > (the default configuration): > > (51200000 * 8) / 10000 = 40960 > 40960 * 65535 = 2,684,313,600 > > This exceeds LONG_MAX (2,147,483,647), resulting in signed integer > overflow. > > Additionally, dividing before multiplying by regval loses precision > unnecessarily. > > Use u64 intermediates with div_u64() and multiply before dividing > to retain precision. Power is inherently non-negative, so unsigned > types are the natural fit. Clamp the result to LONG_MAX before > returning it through the hwmon callback, following the pattern used > by ina238. > > Fixes: 39671a14df4f2 ("hwmon: (isl28022) new driver for ISL28022 power monitor") > Cc: stable@vger.kernel.org > Signed-off-by: Sanman Pradhan > --- > v2: > - Switch from s64/div_s64() to u64/div_u64() since power is > inherently non-negative, avoiding implicit u32-to-s32 narrowing > of the shunt divisor There is no such thing as u32-to-s32 narrowing. Basically nothing happens to the bit pattern. But the values are almost certainly never negative. > > drivers/hwmon/isl28022.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/drivers/hwmon/isl28022.c b/drivers/hwmon/isl28022.c > index c2e559dde63f..d233a7b3f327 100644 > --- a/drivers/hwmon/isl28022.c > +++ b/drivers/hwmon/isl28022.c > @@ -9,6 +9,7 @@ > #include > #include > #include > +#include > #include > #include > > @@ -178,6 +179,7 @@ static int isl28022_read_power(struct device *dev, u32 attr, long *val) > struct isl28022_data *data = dev_get_drvdata(dev); > unsigned int regval; > int err; > + u64 tmp; > > switch (attr) { > case hwmon_power_input: > @@ -185,8 +187,9 @@ static int isl28022_read_power(struct device *dev, u32 attr, long *val) > ISL28022_REG_POWER, ®val); > if (err < 0) > return err; > - *val = ((51200000L * ((long)data->gain)) / > - (long)data->shunt) * (long)regval; > + tmp = (u64)51200000 * data->gain * regval; > + tmp = div_u64(tmp, data->shunt); > + *val = clamp_val(tmp, 0, LONG_MAX); Don't use clamp_val(), you don't need to and it is completely broken by design. Just use min(). You could just write: *val = min(div_u64(51200000ULL * data->gain * regval, data->shunt), LONG_MAX); Have you checked that the multiply can't overflow 64bits? That might be why the last multiply was done after the divide. David > break; > default: > return -EOPNOTSUPP;