From nobody Sun Apr 12 17:10:25 2026 Received: from mail-dy1-f171.google.com (mail-dy1-f171.google.com [74.125.82.171]) (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 6ECCD3B52EF for ; Sat, 11 Apr 2026 16:23:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924621; cv=none; b=Ie2yCsLB4Q1M/LinxGmNfBMA7W4R8raAIOuOJsiI86h8M6r2A1/HSsOSnDrmaqI4yLTea0TYgmQaP/Ajrg5EAdSBfiMtUHDZNXWPKxGL3Bl2UsmVui/frGTI0QY6U7PF41vXyjHBq6erpHLR9fnIDv5ggVIXr/CMMsKvyUyzTrw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775924621; c=relaxed/simple; bh=8LUDQtMderd6djIBXviEFlt08t4GGAhmClar2YVACLg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VFBk4rcN4b9h/W3IQtUVW8YLkXKCEK+tHUg4LxNZGf2MIpu0aSUfAVREsb19NbR/TRySgJoDbeL8mv9ie81cCDA0Ieq8ydqCxB3tmDxRsZlpJksRUEH/65AJA/Cs/fins2y4YKZ3ESF829YMm6XSs6cVbWGXHl0L76ZOxDKVqvA= 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=IAojLqQV; arc=none smtp.client-ip=74.125.82.171 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="IAojLqQV" Received: by mail-dy1-f171.google.com with SMTP id 5a478bee46e88-2c156c4a9efso4348184eec.1 for ; Sat, 11 Apr 2026 09:23:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775924620; x=1776529420; 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; bh=JnJVHMF3J4KnB49uOjeY/NdO1ByBdmanEQTbiS1LzsE=; b=IAojLqQVk3e0TxMkw94hA0kuPHdmBQg6zMhNc9I1VvAJ4FzySm9LHMcA1qdzJajc1s 8SIPZm2KAt9jNzjx1tdjf9iWXlMdfzKpoI9b2vFhdtHcjxKyCMib7pkz/v4TE61ZLZ4G K9apq2OxVY4AP798Y/QuG/VXMqXCszWGx556uonRK2sAYAmw0aZabVutppAAYRoVWLiV 3sjTNPVcv3nmbiIEZ7HgfZFdJ6IYeM7P2Z+Uzu/95xsiTwkAJpVWNs4QHjuDhrFxcS2g gKn2vY2VpROlTrxR5kzla4q809VKQRVEKDJEz2UAtQb6nOhRWr5JxDXVV5thHmprxNub hqCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775924620; x=1776529420; 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; bh=JnJVHMF3J4KnB49uOjeY/NdO1ByBdmanEQTbiS1LzsE=; b=Zpj4Ys0LokBqo/jAfPFDe60n+6nDn0cu7O9MGBRqSj2JdFqXfOdqqoq8Ae8kf+qlrC D8obFlZ8KPVFPrlKqOlR61PqkX6gQDe+OwDR2+rxWn1qbXcmOuFO0dbknUw1rs25WVwX qdqKebVCxNrc06WexT4SBZwB7TrD4KhvtrTHFoHDBOanNoQqLgYKiAxMimrnHQKVbe5X A53m22mYuZQCsfTwAJ+1Tt/2dU2J4lLQlconXRW49t1BWSBG6KG8C/zn12yHjc41N866 v9WTu1EIdUBwy76CRriV/zYHYiTBUZDxA39EPZvxH8OMbAAkuzwTfxZJMDQ+OQ7zaRSM oywA== X-Forwarded-Encrypted: i=1; AJvYcCWIgN1bJ6boduqGUkdGbYab8eUmVl6mEQBv4P868AOAFDbBSd5BPuIRDBAdDA+wJmIthKclBd78bxqnIRQ=@vger.kernel.org X-Gm-Message-State: AOJu0YzkpMrH3ED7eFPm6OtTm6xGB1CH80i72YSMBufPruR/+SWf9YZx nH0JBrDLao5xS+Z5IuiTcI+ZfjCz+O+XKe2oVlO8KJ+vAbd0waBPhNWA X-Gm-Gg: AeBDiev5xFIJkcyumA28vIg5Tco05JPHmDcroOW4TezTF/HLMQncbccOOHbuPS4u1kr 1Bd4AZV0UyMvZxQA4gURxHe/lvCNABsVLjyOlr1gCU/+iWWCthBfCtIprdegQG8RWJ+RIu1LR3r c0SZby8LoXC2Fj9U/cI7d1tQiJLmm6Z9O4lds2juxDFiVdMnh06OF1RffFbH5cHq+KSU+QJIf5u uZTeG84Mi+n0qviIjcObz7PWiw/Kx/zkHutZqA+DgVilG8zxSWEOydiCVGuALgqfb0sacLv3CKN oAiqOJbjgh/vX7FWLCRsdosubKfjmQvRLaiDUsCHVL93f8PvTgESQG1z05NQsIlY7V/UpCTijAz 0VGvbSoW2LNka3qNNEKAd+sYOTU9nhk13HObG5R5FpERQ2xym1b7gDRTW6iontn7ZdIBJhZYkrQ I7Of66sBjj+GmEeM0LXjZ8iqq3NfeVUbJedWpVE2lxKSQ9+6LO9qXWW54C6vrWwWkDx+Roh06Ac ltP X-Received: by 2002:a05:7301:1e87:b0:2c6:2bac:8b1 with SMTP id 5a478bee46e88-2d5895690c0mr3446728eec.24.1775924619510; Sat, 11 Apr 2026 09:23:39 -0700 (PDT) Received: from lappy (108-228-232-20.lightspeed.sndgca.sbcglobal.net. [108.228.232.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2d55ce46a65sm9358907eec.0.2026.04.11.09.23.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Apr 2026 09:23:39 -0700 (PDT) From: "Derek J. Clark" To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Hans de Goede Cc: Mark Pearson , Armin Wolf , Jonathan Corbet , Rong Zhang , Kurt Borja , "Derek J . Clark" , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v9 02/16] platform/x86: lenovo-wmi-other: Balance IDA id allocation and free Date: Sat, 11 Apr 2026 16:23:20 +0000 Message-ID: <20260411162334.25682-3-derekjohn.clark@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260411162334.25682-1-derekjohn.clark@gmail.com> References: <20260411162334.25682-1-derekjohn.clark@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Rong Zhang Currently, the IDA id is only freed on wmi-other device removal or failure to create firmware-attributes device, kset, or attributes. It leaks IDA ids if the wmi-other device is bound multiple times, as the unbind callback never frees the previously allocated IDA id. Additionally, if the wmi-other device has failed to create a firmware-attributes device before it gets removed, the wmi-device removal callback double frees the same IDA id. These bugs were found by sashiko.dev [1]. Fix them by moving ida_free() into lwmi_om_fw_attr_remove() so it is balanced with ida_alloc() in lwmi_om_fw_attr_add(). With them fixed, properly set and utilize the validity of priv->ida_id to balance firmware-attributes registration and removal, without relying on propagating the registration error to the component framework, which is more reliable and aligns with the hwmon device registration and removal sequences. No functional change intended. Reviewed-by: Mark Pearson Fixes: edc4b183b794 ("platform/x86: Add Lenovo Other Mode WMI Driver") Cc: stable@vger.kernel.org Link: https://sashiko.dev/#/patchset/20260331181208.421552-1-derekjohn.clar= k%40gmail.com [1] Signed-off-by: Rong Zhang Signed-off-by: Derek J. Clark --- v9: - Invert err logic for when allocating IDA fails. - Rename ida_alloc err goto from 'err' to 'err_no_ida' to disambiguate from 'int err'. --- drivers/platform/x86/lenovo/wmi-other.c | 36 ++++++++++++++----------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/drivers/platform/x86/lenovo/wmi-other.c b/drivers/platform/x86= /lenovo/wmi-other.c index 6040f45aa2b0..be3309d74e03 100644 --- a/drivers/platform/x86/lenovo/wmi-other.c +++ b/drivers/platform/x86/lenovo/wmi-other.c @@ -957,17 +957,17 @@ static struct capdata01_attr_group cd01_attr_groups[]= =3D { /** * lwmi_om_fw_attr_add() - Register all firmware_attributes_class members * @priv: The Other Mode driver data. - * - * Return: Either 0, or an error code. */ -static int lwmi_om_fw_attr_add(struct lwmi_om_priv *priv) +static void lwmi_om_fw_attr_add(struct lwmi_om_priv *priv) { unsigned int i; int err; =20 - priv->ida_id =3D ida_alloc(&lwmi_om_ida, GFP_KERNEL); - if (priv->ida_id < 0) - return priv->ida_id; + err =3D ida_alloc(&lwmi_om_ida, GFP_KERNEL); + if (err < 0) + goto err_no_ida; + + priv->ida_id =3D err; =20 priv->fw_attr_dev =3D device_create(&firmware_attributes_class, NULL, MKDEV(0, 0), NULL, "%s-%u", @@ -993,7 +993,7 @@ static int lwmi_om_fw_attr_add(struct lwmi_om_priv *pri= v) =20 cd01_attr_groups[i].tunable_attr->dev =3D &priv->wdev->dev; } - return 0; + return; =20 err_remove_groups: while (i--) @@ -1007,7 +1007,12 @@ static int lwmi_om_fw_attr_add(struct lwmi_om_priv *= priv) =20 err_free_ida: ida_free(&lwmi_om_ida, priv->ida_id); - return err; + +err_no_ida: + priv->ida_id =3D -EIDRM; + + dev_warn(&priv->wdev->dev, + "failed to register firmware-attributes device: %d\n", err); } =20 /** @@ -1016,12 +1021,17 @@ static int lwmi_om_fw_attr_add(struct lwmi_om_priv = *priv) */ static void lwmi_om_fw_attr_remove(struct lwmi_om_priv *priv) { + if (priv->ida_id < 0) + return; + for (unsigned int i =3D 0; i < ARRAY_SIZE(cd01_attr_groups) - 1; i++) sysfs_remove_group(&priv->fw_attr_kset->kobj, cd01_attr_groups[i].attr_group); =20 kset_unregister(priv->fw_attr_kset); device_unregister(priv->fw_attr_dev); + ida_free(&lwmi_om_ida, priv->ida_id); + priv->ida_id =3D -EIDRM; } =20 /* =3D=3D=3D=3D=3D=3D=3D=3D Self (master: lenovo-wmi-other) =3D=3D=3D=3D= =3D=3D=3D=3D */ @@ -1063,7 +1073,9 @@ static int lwmi_om_master_bind(struct device *dev) =20 lwmi_om_fan_info_collect_cd00(priv); =20 - return lwmi_om_fw_attr_add(priv); + lwmi_om_fw_attr_add(priv); + + return 0; } =20 /** @@ -1115,13 +1127,7 @@ static int lwmi_other_probe(struct wmi_device *wdev,= const void *context) =20 static void lwmi_other_remove(struct wmi_device *wdev) { - struct lwmi_om_priv *priv =3D dev_get_drvdata(&wdev->dev); - component_master_del(&wdev->dev, &lwmi_om_master_ops); - - /* No IDA to free if the driver is never bound to its components. */ - if (priv->ida_id >=3D 0) - ida_free(&lwmi_om_ida, priv->ida_id); } =20 static const struct wmi_device_id lwmi_other_id_table[] =3D { --=20 2.53.0