From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=209.85.128.44 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1794014809; b=oHVwMKF4aZ2exFi0rVcGXSO1RhY03IHhBmHNMjiFZWJKUCHlgfl4qU4CkgEpqGrjSEtx 3rIfm6osezH9YCxg/0KAk9a8dVAl2J45qr18q1GKrh5onpfoyTlkSrgUx/5CbHUWmdI9+ UkVshqiN8Ku9YUSanMlgvUV4SAaEdveiIHMIIFyABZfDZOpL6ocZxi1yKLC731dAtpU9w MKfi+6XawPPUeuOU15A2ZJ4qm3kKevYLS18SzEU83y00UgVosCwedWgjw+bGcPbdFjYHP zZsFOdA70rs/Bbx7yo44j1c0VYHawBWbB3Hovlia3qq/5gVuXpze1WPrBdJrgYJHcDQ== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1794014809; h=DMARC-Filter:Received:DKIM-Signature:X-Google-DKIM-Signature: X-Forwarded-Encrypted:X-Gm-Message-State:X-Gm-Gg:X-Received:Received: From:To:Cc:Subject:Date:Message-ID:X-Mailer:In-Reply-To:References: MIME-Version:Content-Transfer-Encoding; bh=wlXk6HYre5osGueEzlFOqp7fwiA8+1yEGjyN3cM9QVU=; b=OYFbfK/xbb4T3GULCReH471qvjRZCwtTl7+B1+RuotlEGiJWjN+YQVdomm98eKR9YgqW GwhstBAvS0qD9493YILbd8jdTa9dyGCFFOl0rMnTYbJ5ncBx8Bi44ec5BqOcc04b9zJ11 jijtk7cf6UWoPAck2JF+e5TwbTps6WQij4FRnIkxFBwXrW2eMftz4bjg5fbXVwasnlcfc 15+7EV/Xoyb4BXx/eHLelbIWC9Dw9WOoADaQKclxNcdcoyhGAhnwhWAlycO26tQ/+bxWC hocM33vi14127u4mivXHx/9T58LT2WSlrH5ToFx3cc39ZKBC5K4Q3ITME41Ma6izsPA== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20260707 header.b=EhgaWgwd; arc=none smtp.remote-ip=209.85.128.44 Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6E40B606A32C for ; Sat, 7 Nov 2026 01:26:48 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org 6E40B606A32C 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, unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20260707 header.b=EhgaWgwd Received: by mail-wm1-f44.google.com with SMTP id 5b1f17b1804b1-4a215e64962so13669545e9.1 for ; Fri, 06 Nov 2026 17:26:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20260707; t=1794014807; x=1794619607; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=wlXk6HYre5osGueEzlFOqp7fwiA8+1yEGjyN3cM9QVU=; b=EhgaWgwdErraFHP2TfEO3j2VLtOc9jTnlpqMvMk9e4xm8Rg3dfkoUOFnStr7CAHL3r 9ASP/OzoJtz363Fn5iQ3S5HtI7QzGV6U2Kl+R+zSTR0Yq/FbQYSGfYcBg+TayNYjDUVy i2grb49jxpLX2BmhxhhPocm1vxflVuDEsfSAGHSzGaJ7kuoJwamRaiBUaafu5Ko/qops 3QvJ9jATcicC8RJlPQG8d0/xw//LDKWkpqn3iQ1ynFwVHvJFr2OSQeVFhswaaXXNLWJg 0/XV7SfDdOFZRhmLCbPmA2gzhB38bSnMNWPWjDMn0w5RB7WLrdsryj4kSx+eYHPsZM/l PZmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1794014807; x=1794619607; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=wlXk6HYre5osGueEzlFOqp7fwiA8+1yEGjyN3cM9QVU=; b=dI0PWCxzL4Vz7Ogzx1Oi7nFjSqGS14JcF6IVEHDy0IPzG1XHXaUnlBdjcaJ6hyFzvH SxHQnmTAeLu06cdYmA+0o021bkfQLuRDIu2mWOr9VrJ+fNUECLEo1dCjDpC2hcVwGxOO OZVdZA9ujmK7wYgP0hxR2nej7ZMVFcaGpxhgHxTJEzqhEKBifRW9/3B1TolcyVHvXJbA ctXcdkHNZYzsU4SODl1WJQ0+aDlaYLdC1BYOH5GNwc0TBlLiiI1qXK+0lh0ZU0jJRv5B npvIzO5lyDZDPQOrt6xOVBnU+iV3K9O3cisqEKLuz2HjszX3Tj4K4qfEP4jFbDDeTJKv d5qg== X-Forwarded-Encrypted: i=1; AKwUvBzje7QO6EDGAlQOmjXFUV8IPG0reOClVeN+GdYlQP/qnlUHCXAyPFprm1IE0IOZIgzpiWSbvRBMprfKl/g=@vger.kernel.org X-Gm-Message-State: APuU4Z+ktH8S+sG17QRdWmXiMPGNNiYWMBO0QSuoE9eeBZsGhLK/6IUS fjreO3U7qdRU2mAdDE/NP2e+qtKrTCYhk0unCwvOaV7L66bU4L59u0YU X-Gm-Gg: AYBFou11Woa3FVAgU4qRIt+zl5OMXqwLDSt3YfGcdOmwgnBKcbtTMYdZHymqfTeQKh6 7QyQDqIR3R4dyPnj7sdwzTclwGKN89xRhLT34ZCTV8OrE1NtdAzW3QhsJDz1IK2Q3ipEBoJeH9R Xa4fU3+vzCVAf0q+Xave3UYd/o9kHAHHbyvSxM1dCpD9tsTw+5tmL1jHfn5Pg3mfOudlmihzoVm zU+GCVkOdiNXSdLKHyisAoDjt1ZoejCbagoMrB9u5qxT7I3XeQvkfbJ0apQveehYWIBnWUK4lgn +j40W+Puf1Q4lKELn3gkdI5DSpOJkN4moORB3lHdakt8jptq5NxTn0ObluCt6Yi6f0m6dMfJ8Ww iUh8UJzVJgzf6FRqZxuR+JHjl0FVinF+U1P5tgcBYAdstu/E8Np6Zf9hpPGvpBa3OScyV5kauWI jMpWJaMbyVuYaITJUeoiFprZZR/jVRHvWH0XKhccXdR9yhan9t/iNziopzditpvLZwkTt2OQN9X 51OLx/E9jv/JKzMyKHSBC/TbKh7rfeSVd2qD+s2CdcD5yLUneulQ/p+QXX4ZTWgf6reP349zeiv TUi5XZrx3KRtczY44gjaazuK8myAYAcf5EZLu2QADA== X-Received: by 2002:a05:600c:3f06:b0:4ac:da92:2bd4 with SMTP id 5b1f17b1804b1-4b6dc6ded37mr61622705e9.1.1794014806720; Fri, 06 Nov 2026 17:26:46 -0800 (PST) Received: from beelink ([187.13.199.38]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4b7e3271abasm22773105e9.4.2026.11.06.17.26.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 06 Nov 2026 17:26:46 -0800 (PST) From: Aldo Ariel Panzardo To: Jason Gerecke Cc: Jiri Kosina , Benjamin Tissoires , Ping Cheng , Jason Gerecke , linux-input@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v4] HID: wacom: validate battery range before scaling Date: Fri, 6 Nov 2026 22:26:36 -0300 Message-ID: <20261107012636.1008932-1-qwe.aldo@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20261106213526.3393779-1-qwe.aldo@gmail.com> References: <20261106213526.3393779-1-qwe.aldo@gmail.com> X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Battery events divide by the difference between the logical maximum and minimum without validating the range. A malformed HID descriptor with equal limits can therefore trigger a divide-by-zero exception. Move percentage conversion to a helper that rejects non-positive ranges and accounts for a nonzero logical minimum. Clamp the result to [0, 100] as an additional safeguard against out-of-range percentages. Fixes: 37d160193834 ("HID: wacom: generic: Scale battery capacity measurements to percentages") Cc: stable@vger.kernel.org Signed-off-by: Aldo Ariel Panzardo --- Changes in v4: - Reword commit message: describe clamp as a defensive safeguard rather than claiming it handles a specific ADC scenario. The caller already filters out-of-range values. Code unchanged. Changes in v3: - Drop s64 widening and div64_s64 as requested by Jason Gerecke. Use __s32 range with a <= 0 guard instead. Keep the clamping. Changes in v2: - Clamp the computed percentage to [0, 100] instead of returning false, so that slightly out-of-range ADC values do not prevent battery registration or silently drop updates. drivers/hid/wacom_wac.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c index 361738b..36bab07 100644 --- a/drivers/hid/wacom_wac.c +++ b/drivers/hid/wacom_wac.c @@ -1960,6 +1960,16 @@ static void wacom_wac_battery_usage_mapping(struct hid_device *hdev, return; } +static __s32 wacom_wac_battery_percentage(struct hid_field *field, __s32 value) +{ + __s32 range = field->logical_maximum - field->logical_minimum; + + if (range <= 0) + return 0; + + return clamp_val((value - field->logical_minimum) * 100 / range, 0, 100); +} + static void wacom_wac_battery_event(struct hid_device *hdev, struct hid_field *field, struct hid_usage *usage, __s32 value) { @@ -1973,7 +1983,7 @@ static void wacom_wac_battery_event(struct hid_device *hdev, struct hid_field *f wacom_wac->hid_data.bat_status = POWER_SUPPLY_STATUS_UNKNOWN; } else { - value = value * 100 / (field->logical_maximum - field->logical_minimum); + value = wacom_wac_battery_percentage(field, value); wacom_wac->hid_data.battery_capacity = value; wacom_wac->hid_data.bat_connected = 1; wacom_wac->hid_data.bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO; @@ -1981,7 +1991,7 @@ static void wacom_wac_battery_event(struct hid_device *hdev, struct hid_field *f wacom_wac->features.quirks |= WACOM_QUIRK_BATTERY; break; case WACOM_HID_WD_BATTERY_LEVEL: - value = value * 100 / (field->logical_maximum - field->logical_minimum); + value = wacom_wac_battery_percentage(field, value); wacom_wac->hid_data.battery_capacity = value; wacom_wac->hid_data.bat_connected = 1; wacom_wac->hid_data.bat_status = WACOM_POWER_SUPPLY_STATUS_AUTO; -- 2.53.0