* [PATCH 0/3] hwmon: lenovo-ec-sensors: Probe error handling fixes
@ 2026-05-14 1:14 Kean
2026-05-14 1:14 ` [PATCH 1/3] hwmon: lenovo-ec-sensors: Fix EC signature check logic in probe Kean
` (2 more replies)
0 siblings, 3 replies; 13+ messages in thread
From: Kean @ 2026-05-14 1:14 UTC (permalink / raw)
To: Guenter Roeck; +Cc: Mark Pearson, linux-hwmon, linux-kernel, Kean
This series fixes several bugs in the probe() error handling path of
the lenovo-ec-sensors driver found during code review.
Patch 1 fixes a logic error in the EC signature check where && was
used instead of ||, causing the signature verification to be
effectively bypassed.
Patch 2 adds a missing NULL pointer check for dmi_first_match(),
which can return NULL on unsupported platforms.
Patch 3 converts manual request_region()/release_region() to the
devm-managed variant, fixing a double-release and a resource leak
in the probe error paths.
Kean (3):
hwmon: lenovo-ec-sensors: Fix EC signature check logic in probe
hwmon: lenovo-ec-sensors: Fix NULL pointer dereference when DMI match
fails
hwmon: lenovo-ec-sensors: Use devm_request_region for automatic
cleanup
drivers/hwmon/lenovo-ec-sensors.c | 21 ++++++++++-----------
1 file changed, 10 insertions(+), 11 deletions(-)
--
2.47.3
^ permalink raw reply [flat|nested] 13+ messages in thread* [PATCH 1/3] hwmon: lenovo-ec-sensors: Fix EC signature check logic in probe 2026-05-14 1:14 [PATCH 0/3] hwmon: lenovo-ec-sensors: Probe error handling fixes Kean @ 2026-05-14 1:14 ` Kean 2026-05-14 1:37 ` Guenter Roeck 2026-05-14 1:14 ` [PATCH 2/3] hwmon: lenovo-ec-sensors: Fix NULL pointer dereference when DMI match fails Kean 2026-05-14 1:14 ` [PATCH 3/3] hwmon: lenovo-ec-sensors: Use devm_request_region for automatic cleanup Kean 2 siblings, 1 reply; 13+ messages in thread From: Kean @ 2026-05-14 1:14 UTC (permalink / raw) To: Guenter Roeck; +Cc: Mark Pearson, linux-hwmon, linux-kernel, Kean The probe function reads a 4-byte signature ("MCHP") from the EC to verify it is a Microchip EC before binding the driver. The condition uses && (AND) to check if each byte differs from the expected value: if ((byte0 != 'M') && (byte1 != 'C') && (byte2 != 'H') && (byte3 != 'P')) This rejects the device only if ALL four bytes are wrong simultaneously. A partially matching signature (e.g. "MXXX") would pass the check and cause the driver to bind to a non-Microchip EC, as long as at least one byte matches the expected value. Change && to || so the driver is rejected when ANY byte does not match the expected "MCHP" signature. Signed-off-by: Kean <rh_king@163.com> Reviewed-by: Mark Pearson <mpearson-lenovo@squebb.ca> --- drivers/hwmon/lenovo-ec-sensors.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/hwmon/lenovo-ec-sensors.c b/drivers/hwmon/lenovo-ec-sensors.c index 8681bbf6665b..a32b1f2c6a3a 100644 --- a/drivers/hwmon/lenovo-ec-sensors.c +++ b/drivers/hwmon/lenovo-ec-sensors.c @@ -537,9 +537,9 @@ static int lenovo_ec_probe(struct platform_device *pdev) outw_p(MCHP_SING_IDX, MCHP_EMI0_EC_ADDRESS); mutex_unlock(&ec_data->mec_mutex); - if ((inb_p(MCHP_EMI0_EC_DATA_BYTE0) != 'M') && - (inb_p(MCHP_EMI0_EC_DATA_BYTE1) != 'C') && - (inb_p(MCHP_EMI0_EC_DATA_BYTE2) != 'H') && + if ((inb_p(MCHP_EMI0_EC_DATA_BYTE0) != 'M') || + (inb_p(MCHP_EMI0_EC_DATA_BYTE1) != 'C') || + (inb_p(MCHP_EMI0_EC_DATA_BYTE2) != 'H') || (inb_p(MCHP_EMI0_EC_DATA_BYTE3) != 'P')) { release_region(IO_REGION_START, IO_REGION_LENGTH); return -ENODEV; -- 2.47.3 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 1/3] hwmon: lenovo-ec-sensors: Fix EC signature check logic in probe 2026-05-14 1:14 ` [PATCH 1/3] hwmon: lenovo-ec-sensors: Fix EC signature check logic in probe Kean @ 2026-05-14 1:37 ` Guenter Roeck 2026-05-14 2:40 ` Mark Pearson 0 siblings, 1 reply; 13+ messages in thread From: Guenter Roeck @ 2026-05-14 1:37 UTC (permalink / raw) To: Kean; +Cc: Mark Pearson, linux-hwmon, linux-kernel On 5/13/26 18:14, Kean wrote: > The probe function reads a 4-byte signature ("MCHP") from the EC to > verify it is a Microchip EC before binding the driver. The condition > uses && (AND) to check if each byte differs from the expected value: > > if ((byte0 != 'M') && (byte1 != 'C') && (byte2 != 'H') && (byte3 != 'P')) > > This rejects the device only if ALL four bytes are wrong simultaneously. > A partially matching signature (e.g. "MXXX") would pass the check and > cause the driver to bind to a non-Microchip EC, as long as at least one > byte matches the expected value. > > Change && to || so the driver is rejected when ANY byte does not match > the expected "MCHP" signature. > > Signed-off-by: Kean <rh_king@163.com> > > Reviewed-by: Mark Pearson <mpearson-lenovo@squebb.ca> As with the other patches: How do I know that this review really happened ? Guenter > --- > drivers/hwmon/lenovo-ec-sensors.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/drivers/hwmon/lenovo-ec-sensors.c b/drivers/hwmon/lenovo-ec-sensors.c > index 8681bbf6665b..a32b1f2c6a3a 100644 > --- a/drivers/hwmon/lenovo-ec-sensors.c > +++ b/drivers/hwmon/lenovo-ec-sensors.c > @@ -537,9 +537,9 @@ static int lenovo_ec_probe(struct platform_device *pdev) > outw_p(MCHP_SING_IDX, MCHP_EMI0_EC_ADDRESS); > mutex_unlock(&ec_data->mec_mutex); > > - if ((inb_p(MCHP_EMI0_EC_DATA_BYTE0) != 'M') && > - (inb_p(MCHP_EMI0_EC_DATA_BYTE1) != 'C') && > - (inb_p(MCHP_EMI0_EC_DATA_BYTE2) != 'H') && > + if ((inb_p(MCHP_EMI0_EC_DATA_BYTE0) != 'M') || > + (inb_p(MCHP_EMI0_EC_DATA_BYTE1) != 'C') || > + (inb_p(MCHP_EMI0_EC_DATA_BYTE2) != 'H') || > (inb_p(MCHP_EMI0_EC_DATA_BYTE3) != 'P')) { > release_region(IO_REGION_START, IO_REGION_LENGTH); > return -ENODEV; ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 1/3] hwmon: lenovo-ec-sensors: Fix EC signature check logic in probe 2026-05-14 1:37 ` Guenter Roeck @ 2026-05-14 2:40 ` Mark Pearson 0 siblings, 0 replies; 13+ messages in thread From: Mark Pearson @ 2026-05-14 2:40 UTC (permalink / raw) To: Guenter Roeck, Kean; +Cc: linux-hwmon, linux-kernel Hi Guenter, On Wed, May 13, 2026, at 9:37 PM, Guenter Roeck wrote: > On 5/13/26 18:14, Kean wrote: >> The probe function reads a 4-byte signature ("MCHP") from the EC to >> verify it is a Microchip EC before binding the driver. The condition >> uses && (AND) to check if each byte differs from the expected value: >> >> if ((byte0 != 'M') && (byte1 != 'C') && (byte2 != 'H') && (byte3 != 'P')) >> >> This rejects the device only if ALL four bytes are wrong simultaneously. >> A partially matching signature (e.g. "MXXX") would pass the check and >> cause the driver to bind to a non-Microchip EC, as long as at least one >> byte matches the expected value. >> >> Change && to || so the driver is rejected when ANY byte does not match >> the expected "MCHP" signature. >> >> Signed-off-by: Kean <rh_king@163.com> >> >> Reviewed-by: Mark Pearson <mpearson-lenovo@squebb.ca> > > As with the other patches: How do I know that this review really happened ? I confirm I did it. For the series: Reviewed-by: Mark Pearson <mpearson@lenovo@squebb.ca> Mark > > Guenter > >> --- >> drivers/hwmon/lenovo-ec-sensors.c | 6 +++--- >> 1 file changed, 3 insertions(+), 3 deletions(-) >> >> diff --git a/drivers/hwmon/lenovo-ec-sensors.c b/drivers/hwmon/lenovo-ec-sensors.c >> index 8681bbf6665b..a32b1f2c6a3a 100644 >> --- a/drivers/hwmon/lenovo-ec-sensors.c >> +++ b/drivers/hwmon/lenovo-ec-sensors.c >> @@ -537,9 +537,9 @@ static int lenovo_ec_probe(struct platform_device *pdev) >> outw_p(MCHP_SING_IDX, MCHP_EMI0_EC_ADDRESS); >> mutex_unlock(&ec_data->mec_mutex); >> >> - if ((inb_p(MCHP_EMI0_EC_DATA_BYTE0) != 'M') && >> - (inb_p(MCHP_EMI0_EC_DATA_BYTE1) != 'C') && >> - (inb_p(MCHP_EMI0_EC_DATA_BYTE2) != 'H') && >> + if ((inb_p(MCHP_EMI0_EC_DATA_BYTE0) != 'M') || >> + (inb_p(MCHP_EMI0_EC_DATA_BYTE1) != 'C') || >> + (inb_p(MCHP_EMI0_EC_DATA_BYTE2) != 'H') || >> (inb_p(MCHP_EMI0_EC_DATA_BYTE3) != 'P')) { >> release_region(IO_REGION_START, IO_REGION_LENGTH); >> return -ENODEV; ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 2/3] hwmon: lenovo-ec-sensors: Fix NULL pointer dereference when DMI match fails 2026-05-14 1:14 [PATCH 0/3] hwmon: lenovo-ec-sensors: Probe error handling fixes Kean 2026-05-14 1:14 ` [PATCH 1/3] hwmon: lenovo-ec-sensors: Fix EC signature check logic in probe Kean @ 2026-05-14 1:14 ` Kean 2026-05-14 1:29 ` Guenter Roeck ` (2 more replies) 2026-05-14 1:14 ` [PATCH 3/3] hwmon: lenovo-ec-sensors: Use devm_request_region for automatic cleanup Kean 2 siblings, 3 replies; 13+ messages in thread From: Kean @ 2026-05-14 1:14 UTC (permalink / raw) To: Guenter Roeck; +Cc: Mark Pearson, linux-hwmon, linux-kernel, Kean dmi_first_match() returns NULL if the running system does not match any entry in thinkstation_dmi_table. Without a NULL check, the subsequent dmi_id->driver_data access dereferences a NULL pointer, causing a kernel oops or panic. Add a NULL check and return -ENODEV to gracefully fail the probe when the driver is loaded on an unsupported platform. Signed-off-by: Kean <rh_king@163.com> Reviewed-by: Mark Pearson <mpearson-lenovo@squebb.ca> --- drivers/hwmon/lenovo-ec-sensors.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/hwmon/lenovo-ec-sensors.c b/drivers/hwmon/lenovo-ec-sensors.c index a32b1f2c6a3a..b0f2a04ce679 100644 --- a/drivers/hwmon/lenovo-ec-sensors.c +++ b/drivers/hwmon/lenovo-ec-sensors.c @@ -546,6 +546,8 @@ static int lenovo_ec_probe(struct platform_device *pdev) } dmi_id = dmi_first_match(thinkstation_dmi_table); + if (!dmi_id) + return -ENODEV; switch ((long)dmi_id->driver_data) { case 0: -- 2.47.3 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 2/3] hwmon: lenovo-ec-sensors: Fix NULL pointer dereference when DMI match fails 2026-05-14 1:14 ` [PATCH 2/3] hwmon: lenovo-ec-sensors: Fix NULL pointer dereference when DMI match fails Kean @ 2026-05-14 1:29 ` Guenter Roeck 2026-05-14 3:25 ` Guenter Roeck 2026-05-14 11:57 ` sashiko-bot 2 siblings, 0 replies; 13+ messages in thread From: Guenter Roeck @ 2026-05-14 1:29 UTC (permalink / raw) To: Kean; +Cc: Mark Pearson, linux-hwmon, linux-kernel On 5/13/26 18:14, Kean wrote: > dmi_first_match() returns NULL if the running system does not match any > entry in thinkstation_dmi_table. Without a NULL check, the subsequent > dmi_id->driver_data access dereferences a NULL pointer, causing a kernel > oops or panic. > > Add a NULL check and return -ENODEV to gracefully fail the probe when > the driver is loaded on an unsupported platform. > How would that happen in practice ? The driver init code has if (!dmi_check_system(thinkstation_dmi_table)) return -ENODEV; Please provide a reproducer. Thanks, Guenter ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/3] hwmon: lenovo-ec-sensors: Fix NULL pointer dereference when DMI match fails 2026-05-14 1:14 ` [PATCH 2/3] hwmon: lenovo-ec-sensors: Fix NULL pointer dereference when DMI match fails Kean 2026-05-14 1:29 ` Guenter Roeck @ 2026-05-14 3:25 ` Guenter Roeck 2026-05-14 11:57 ` sashiko-bot 2 siblings, 0 replies; 13+ messages in thread From: Guenter Roeck @ 2026-05-14 3:25 UTC (permalink / raw) To: Kean; +Cc: Mark Pearson, linux-hwmon, linux-kernel On Thu, May 14, 2026 at 09:14:10AM +0800, Kean wrote: > dmi_first_match() returns NULL if the running system does not match any > entry in thinkstation_dmi_table. Without a NULL check, the subsequent > dmi_id->driver_data access dereferences a NULL pointer, causing a kernel > oops or panic. > > Add a NULL check and return -ENODEV to gracefully fail the probe when > the driver is loaded on an unsupported platform. > > Signed-off-by: Kean <rh_king@163.com> > > Reviewed-by: Mark Pearson <mpearson-lenovo@squebb.ca> ERROR: trailing whitespace #104: FILE: drivers/hwmon/lenovo-ec-sensors.c:540: +^Iif ((inb_p(MCHP_EMI0_EC_DATA_BYTE0) != 'M') || $ ERROR: trailing whitespace #105: FILE: drivers/hwmon/lenovo-ec-sensors.c:541: +^I (inb_p(MCHP_EMI0_EC_DATA_BYTE1) != 'C') || $ total: 2 errors, 0 warnings, 0 checks, 12 lines checked > --- > drivers/hwmon/lenovo-ec-sensors.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/drivers/hwmon/lenovo-ec-sensors.c b/drivers/hwmon/lenovo-ec-sensors.c > index a32b1f2c6a3a..b0f2a04ce679 100644 > --- a/drivers/hwmon/lenovo-ec-sensors.c > +++ b/drivers/hwmon/lenovo-ec-sensors.c > @@ -546,6 +546,8 @@ static int lenovo_ec_probe(struct platform_device *pdev) > } > > dmi_id = dmi_first_match(thinkstation_dmi_table); > + if (!dmi_id) > + return -ENODEV; > > switch ((long)dmi_id->driver_data) { > case 0: ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/3] hwmon: lenovo-ec-sensors: Fix NULL pointer dereference when DMI match fails 2026-05-14 1:14 ` [PATCH 2/3] hwmon: lenovo-ec-sensors: Fix NULL pointer dereference when DMI match fails Kean 2026-05-14 1:29 ` Guenter Roeck 2026-05-14 3:25 ` Guenter Roeck @ 2026-05-14 11:57 ` sashiko-bot 2 siblings, 0 replies; 13+ messages in thread From: sashiko-bot @ 2026-05-14 11:57 UTC (permalink / raw) To: Kean; +Cc: linux-hwmon Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: - [Medium] The newly added error path for DMI match failure introduces an I/O resource leak. -- commit 6d1770785fa851d42148760f539b79225f6680d7 Author: Kean <rh_king@163.com> hwmon: lenovo-ec-sensors: Fix NULL pointer dereference when DMI match fails This commit adds a check to ensure dmi_first_match() does not return NULL before accessing its driver_data. If no match is found, the probe function now gracefully returns -ENODEV to prevent a kernel oops. > diff --git a/drivers/hwmon/lenovo-ec-sensors.c b/drivers/hwmon/lenovo-ec-sensors.c > index 6cd83c378f091..10fc0376cb7f7 100644 > --- a/drivers/hwmon/lenovo-ec-sensors.c > +++ b/drivers/hwmon/lenovo-ec-sensors.c [ ... ] > @@ -546,6 +546,8 @@ static int lenovo_ec_probe(struct platform_device *pdev) > } > > dmi_id = dmi_first_match(thinkstation_dmi_table); > + if (!dmi_id) > + return -ENODEV; Does this new error path leak the I/O region requested earlier in the probe function? Looking earlier in lenovo_ec_probe(), request_region() is called to reserve the I/O ports: drivers/hwmon/lenovo-ec-sensors.c:lenovo_ec_probe() { ... if (!request_region(IO_REGION_START, IO_REGION_LENGTH, "LNV-WKS")) { pr_err(":request fail\n"); return -EIO; } ... } Other error paths in the function explicitly call release_region() before returning, but this newly added return does not. I note that this issue is resolved later in the series by the commit "hwmon: lenovo-ec-sensors: Use devm_request_region for automatic cleanup". -- Sashiko AI review · https://sashiko.dev/#/patchset/20260514011411.4167069-1-rh_king@163.com?part=2 ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 3/3] hwmon: lenovo-ec-sensors: Use devm_request_region for automatic cleanup 2026-05-14 1:14 [PATCH 0/3] hwmon: lenovo-ec-sensors: Probe error handling fixes Kean 2026-05-14 1:14 ` [PATCH 1/3] hwmon: lenovo-ec-sensors: Fix EC signature check logic in probe Kean 2026-05-14 1:14 ` [PATCH 2/3] hwmon: lenovo-ec-sensors: Fix NULL pointer dereference when DMI match fails Kean @ 2026-05-14 1:14 ` Kean 2026-05-14 1:36 ` Guenter Roeck 2026-05-14 12:19 ` sashiko-bot 2 siblings, 2 replies; 13+ messages in thread From: Kean @ 2026-05-14 1:14 UTC (permalink / raw) To: Guenter Roeck; +Cc: Mark Pearson, linux-hwmon, linux-kernel, Kean Replace manual request_region()/release_region() with devm_request_region(). This lets the device-managed framework handle I/O region lifetime automatically and fixes: - A double release_region() when probe fails after acquiring the I/O region: the probe error path releases it, and then lenovo_ec_init() releases it again on the same error path. - A release-after-free in lenovo_ec_exit() where release_region() was called after platform_device_unregister(), which has already released the I/O region via the platform device removal path. - Missing release_region() in lenovo_ec_probe() on the DMI match failure path, which leaked the I/O region. Remove all manual release_region() calls that are now handled automatically by the devm framework. Signed-off-by: Kean <rh_king@163.com> Reviewed-by: Mark Pearson <mpearson-lenovo@squebb.ca> --- drivers/hwmon/lenovo-ec-sensors.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/drivers/hwmon/lenovo-ec-sensors.c b/drivers/hwmon/lenovo-ec-sensors.c index b0f2a04ce679..ea74bddbad5a 100644 --- a/drivers/hwmon/lenovo-ec-sensors.c +++ b/drivers/hwmon/lenovo-ec-sensors.c @@ -519,8 +519,8 @@ static int lenovo_ec_probe(struct platform_device *pdev) if (!ec_data) return -ENOMEM; - if (!request_region(IO_REGION_START, IO_REGION_LENGTH, "LNV-WKS")) { - pr_err(":request fail\n"); + if (!devm_request_region(dev, IO_REGION_START, IO_REGION_LENGTH, "LNV-WKS")) { + dev_err(dev, "Failed to request I/O region.\n"); return -EIO; } @@ -541,7 +541,6 @@ static int lenovo_ec_probe(struct platform_device *pdev) (inb_p(MCHP_EMI0_EC_DATA_BYTE1) != 'C') || (inb_p(MCHP_EMI0_EC_DATA_BYTE2) != 'H') || (inb_p(MCHP_EMI0_EC_DATA_BYTE3) != 'P')) { - release_region(IO_REGION_START, IO_REGION_LENGTH); return -ENODEV; } @@ -579,7 +578,8 @@ static int lenovo_ec_probe(struct platform_device *pdev) lenovo_ec_chip_info.info = lenovo_ec_hwmon_info_p8; break; default: - release_region(IO_REGION_START, IO_REGION_LENGTH); + dev_err(dev, "Unsupported platform type %ld\n", + (long)dmi_id->driver_data); return -ENODEV; } @@ -608,10 +608,8 @@ static int __init lenovo_ec_init(void) platform_create_bundle(&lenovo_ec_sensors_platform_driver, lenovo_ec_probe, NULL, 0, NULL, 0); - if (IS_ERR(lenovo_ec_sensors_platform_device)) { - release_region(IO_REGION_START, IO_REGION_LENGTH); + if (IS_ERR(lenovo_ec_sensors_platform_device)) return PTR_ERR(lenovo_ec_sensors_platform_device); - } return 0; } @@ -619,7 +617,6 @@ module_init(lenovo_ec_init); static void __exit lenovo_ec_exit(void) { - release_region(IO_REGION_START, IO_REGION_LENGTH); platform_device_unregister(lenovo_ec_sensors_platform_device); platform_driver_unregister(&lenovo_ec_sensors_platform_driver); } -- 2.47.3 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 3/3] hwmon: lenovo-ec-sensors: Use devm_request_region for automatic cleanup 2026-05-14 1:14 ` [PATCH 3/3] hwmon: lenovo-ec-sensors: Use devm_request_region for automatic cleanup Kean @ 2026-05-14 1:36 ` Guenter Roeck 2026-05-14 2:39 ` Mark Pearson 2026-05-14 12:19 ` sashiko-bot 1 sibling, 1 reply; 13+ messages in thread From: Guenter Roeck @ 2026-05-14 1:36 UTC (permalink / raw) To: Kean; +Cc: Mark Pearson, linux-hwmon, linux-kernel On 5/13/26 18:14, Kean wrote: > Replace manual request_region()/release_region() with > devm_request_region(). This lets the device-managed framework > handle I/O region lifetime automatically and fixes: > > - A double release_region() when probe fails after acquiring the > I/O region: the probe error path releases it, and then > lenovo_ec_init() releases it again on the same error path. > > - A release-after-free in lenovo_ec_exit() where release_region() > was called after platform_device_unregister(), which has already > released the I/O region via the platform device removal path. > > - Missing release_region() in lenovo_ec_probe() on the DMI match > failure path, which leaked the I/O region. > > Remove all manual release_region() calls that are now handled > automatically by the devm framework. > > Signed-off-by: Kean <rh_king@163.com> > Why this empty line ? > Reviewed-by: Mark Pearson <mpearson-lenovo@squebb.ca> How do I know that this review really happened ? > --- > drivers/hwmon/lenovo-ec-sensors.c | 13 +++++-------- > 1 file changed, 5 insertions(+), 8 deletions(-) > > diff --git a/drivers/hwmon/lenovo-ec-sensors.c b/drivers/hwmon/lenovo-ec-sensors.c > index b0f2a04ce679..ea74bddbad5a 100644 > --- a/drivers/hwmon/lenovo-ec-sensors.c > +++ b/drivers/hwmon/lenovo-ec-sensors.c > @@ -519,8 +519,8 @@ static int lenovo_ec_probe(struct platform_device *pdev) > if (!ec_data) > return -ENOMEM; > > - if (!request_region(IO_REGION_START, IO_REGION_LENGTH, "LNV-WKS")) { > - pr_err(":request fail\n"); > + if (!devm_request_region(dev, IO_REGION_START, IO_REGION_LENGTH, "LNV-WKS")) { > + dev_err(dev, "Failed to request I/O region.\n"); > return -EIO; > } > > @@ -541,7 +541,6 @@ static int lenovo_ec_probe(struct platform_device *pdev) > (inb_p(MCHP_EMI0_EC_DATA_BYTE1) != 'C') || > (inb_p(MCHP_EMI0_EC_DATA_BYTE2) != 'H') || > (inb_p(MCHP_EMI0_EC_DATA_BYTE3) != 'P')) { > - release_region(IO_REGION_START, IO_REGION_LENGTH); > return -ENODEV; > } > > @@ -579,7 +578,8 @@ static int lenovo_ec_probe(struct platform_device *pdev) > lenovo_ec_chip_info.info = lenovo_ec_hwmon_info_p8; > break; > default: > - release_region(IO_REGION_START, IO_REGION_LENGTH); > + dev_err(dev, "Unsupported platform type %ld\n", > + (long)dmi_id->driver_data); This is not documented in the commit message and, on top of that, pointless. It isn't even noise, it is just pointless (the default case can not be reached). > return -ENODEV; > } > > @@ -608,10 +608,8 @@ static int __init lenovo_ec_init(void) > platform_create_bundle(&lenovo_ec_sensors_platform_driver, > lenovo_ec_probe, NULL, 0, NULL, 0); > > - if (IS_ERR(lenovo_ec_sensors_platform_device)) { > - release_region(IO_REGION_START, IO_REGION_LENGTH); > + if (IS_ERR(lenovo_ec_sensors_platform_device)) > return PTR_ERR(lenovo_ec_sensors_platform_device); > - } > > return 0; > } > @@ -619,7 +617,6 @@ module_init(lenovo_ec_init); > > static void __exit lenovo_ec_exit(void) > { > - release_region(IO_REGION_START, IO_REGION_LENGTH); > platform_device_unregister(lenovo_ec_sensors_platform_device); > platform_driver_unregister(&lenovo_ec_sensors_platform_driver); > } ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 3/3] hwmon: lenovo-ec-sensors: Use devm_request_region for automatic cleanup 2026-05-14 1:36 ` Guenter Roeck @ 2026-05-14 2:39 ` Mark Pearson 2026-05-14 3:24 ` Guenter Roeck 0 siblings, 1 reply; 13+ messages in thread From: Mark Pearson @ 2026-05-14 2:39 UTC (permalink / raw) To: Guenter Roeck, Kean; +Cc: linux-hwmon, linux-kernel Hi Guenter, On Wed, May 13, 2026, at 9:36 PM, Guenter Roeck wrote: > On 5/13/26 18:14, Kean wrote: >> Replace manual request_region()/release_region() with >> devm_request_region(). This lets the device-managed framework >> handle I/O region lifetime automatically and fixes: >> >> - A double release_region() when probe fails after acquiring the >> I/O region: the probe error path releases it, and then >> lenovo_ec_init() releases it again on the same error path. >> >> - A release-after-free in lenovo_ec_exit() where release_region() >> was called after platform_device_unregister(), which has already >> released the I/O region via the platform device removal path. >> >> - Missing release_region() in lenovo_ec_probe() on the DMI match >> failure path, which leaked the I/O region. >> >> Remove all manual release_region() calls that are now handled >> automatically by the devm framework. >> >> Signed-off-by: Kean <rh_king@163.com> >> > Why this empty line ? > >> Reviewed-by: Mark Pearson <mpearson-lenovo@squebb.ca> > > How do I know that this review really happened ? The reviewed by's are correct - I can confirm I did review these patches before Kean pushed them upstream. We did some internal review first to discuss the issues he identified. We sometimes take this approach with the platform/x86 patches. We can do it separately next time if preferred here. Mark > >> --- >> drivers/hwmon/lenovo-ec-sensors.c | 13 +++++-------- >> 1 file changed, 5 insertions(+), 8 deletions(-) >> >> diff --git a/drivers/hwmon/lenovo-ec-sensors.c b/drivers/hwmon/lenovo-ec-sensors.c >> index b0f2a04ce679..ea74bddbad5a 100644 >> --- a/drivers/hwmon/lenovo-ec-sensors.c >> +++ b/drivers/hwmon/lenovo-ec-sensors.c >> @@ -519,8 +519,8 @@ static int lenovo_ec_probe(struct platform_device *pdev) >> if (!ec_data) >> return -ENOMEM; >> >> - if (!request_region(IO_REGION_START, IO_REGION_LENGTH, "LNV-WKS")) { >> - pr_err(":request fail\n"); >> + if (!devm_request_region(dev, IO_REGION_START, IO_REGION_LENGTH, "LNV-WKS")) { >> + dev_err(dev, "Failed to request I/O region.\n"); >> return -EIO; >> } >> >> @@ -541,7 +541,6 @@ static int lenovo_ec_probe(struct platform_device *pdev) >> (inb_p(MCHP_EMI0_EC_DATA_BYTE1) != 'C') || >> (inb_p(MCHP_EMI0_EC_DATA_BYTE2) != 'H') || >> (inb_p(MCHP_EMI0_EC_DATA_BYTE3) != 'P')) { >> - release_region(IO_REGION_START, IO_REGION_LENGTH); >> return -ENODEV; >> } >> >> @@ -579,7 +578,8 @@ static int lenovo_ec_probe(struct platform_device *pdev) >> lenovo_ec_chip_info.info = lenovo_ec_hwmon_info_p8; >> break; >> default: >> - release_region(IO_REGION_START, IO_REGION_LENGTH); >> + dev_err(dev, "Unsupported platform type %ld\n", >> + (long)dmi_id->driver_data); > > This is not documented in the commit message and, on top of that, pointless. > It isn't even noise, it is just pointless (the default case can not be reached). > >> return -ENODEV; >> } >> >> @@ -608,10 +608,8 @@ static int __init lenovo_ec_init(void) >> platform_create_bundle(&lenovo_ec_sensors_platform_driver, >> lenovo_ec_probe, NULL, 0, NULL, 0); >> >> - if (IS_ERR(lenovo_ec_sensors_platform_device)) { >> - release_region(IO_REGION_START, IO_REGION_LENGTH); >> + if (IS_ERR(lenovo_ec_sensors_platform_device)) >> return PTR_ERR(lenovo_ec_sensors_platform_device); >> - } >> >> return 0; >> } >> @@ -619,7 +617,6 @@ module_init(lenovo_ec_init); >> >> static void __exit lenovo_ec_exit(void) >> { >> - release_region(IO_REGION_START, IO_REGION_LENGTH); >> platform_device_unregister(lenovo_ec_sensors_platform_device); >> platform_driver_unregister(&lenovo_ec_sensors_platform_driver); >> } ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 3/3] hwmon: lenovo-ec-sensors: Use devm_request_region for automatic cleanup 2026-05-14 2:39 ` Mark Pearson @ 2026-05-14 3:24 ` Guenter Roeck 0 siblings, 0 replies; 13+ messages in thread From: Guenter Roeck @ 2026-05-14 3:24 UTC (permalink / raw) To: Mark Pearson, Kean; +Cc: linux-hwmon, linux-kernel On 5/13/26 19:39, Mark Pearson wrote: > Hi Guenter, > > On Wed, May 13, 2026, at 9:36 PM, Guenter Roeck wrote: >> On 5/13/26 18:14, Kean wrote: >>> Replace manual request_region()/release_region() with >>> devm_request_region(). This lets the device-managed framework >>> handle I/O region lifetime automatically and fixes: >>> >>> - A double release_region() when probe fails after acquiring the >>> I/O region: the probe error path releases it, and then >>> lenovo_ec_init() releases it again on the same error path. >>> >>> - A release-after-free in lenovo_ec_exit() where release_region() >>> was called after platform_device_unregister(), which has already >>> released the I/O region via the platform device removal path. >>> >>> - Missing release_region() in lenovo_ec_probe() on the DMI match >>> failure path, which leaked the I/O region. >>> >>> Remove all manual release_region() calls that are now handled >>> automatically by the devm framework. >>> >>> Signed-off-by: Kean <rh_king@163.com> >>> >> Why this empty line ? >> >>> Reviewed-by: Mark Pearson <mpearson-lenovo@squebb.ca> >> >> How do I know that this review really happened ? > > The reviewed by's are correct - I can confirm I did review these patches before Kean pushed them upstream. We did some internal review first to discuss the issues he identified. > > We sometimes take this approach with the platform/x86 patches. We can do it separately next time if preferred here. > Kean <rh_king@163.com> is not a full name, has no patches in the upstream kernel or in linux-next, and otherwise seems to be a complete unknown. How do you expect me to know that this isn't all made up by some AI ? Anyway, when you do that, please at least ask people to run checkpatch. I really don't want to have to deal with trivial issues such as ERROR: trailing whitespace #135: FILE: drivers/hwmon/lenovo-ec-sensors.c:611: +^Iif (IS_ERR(lenovo_ec_sensors_platform_device)) $ in this patch and the first patch of the series. Guenter > Mark > >> >>> --- >>> drivers/hwmon/lenovo-ec-sensors.c | 13 +++++-------- >>> 1 file changed, 5 insertions(+), 8 deletions(-) >>> >>> diff --git a/drivers/hwmon/lenovo-ec-sensors.c b/drivers/hwmon/lenovo-ec-sensors.c >>> index b0f2a04ce679..ea74bddbad5a 100644 >>> --- a/drivers/hwmon/lenovo-ec-sensors.c >>> +++ b/drivers/hwmon/lenovo-ec-sensors.c >>> @@ -519,8 +519,8 @@ static int lenovo_ec_probe(struct platform_device *pdev) >>> if (!ec_data) >>> return -ENOMEM; >>> >>> - if (!request_region(IO_REGION_START, IO_REGION_LENGTH, "LNV-WKS")) { >>> - pr_err(":request fail\n"); >>> + if (!devm_request_region(dev, IO_REGION_START, IO_REGION_LENGTH, "LNV-WKS")) { >>> + dev_err(dev, "Failed to request I/O region.\n"); >>> return -EIO; >>> } >>> >>> @@ -541,7 +541,6 @@ static int lenovo_ec_probe(struct platform_device *pdev) >>> (inb_p(MCHP_EMI0_EC_DATA_BYTE1) != 'C') || >>> (inb_p(MCHP_EMI0_EC_DATA_BYTE2) != 'H') || >>> (inb_p(MCHP_EMI0_EC_DATA_BYTE3) != 'P')) { >>> - release_region(IO_REGION_START, IO_REGION_LENGTH); >>> return -ENODEV; >>> } >>> >>> @@ -579,7 +578,8 @@ static int lenovo_ec_probe(struct platform_device *pdev) >>> lenovo_ec_chip_info.info = lenovo_ec_hwmon_info_p8; >>> break; >>> default: >>> - release_region(IO_REGION_START, IO_REGION_LENGTH); >>> + dev_err(dev, "Unsupported platform type %ld\n", >>> + (long)dmi_id->driver_data); >> >> This is not documented in the commit message and, on top of that, pointless. >> It isn't even noise, it is just pointless (the default case can not be reached). >> >>> return -ENODEV; >>> } >>> >>> @@ -608,10 +608,8 @@ static int __init lenovo_ec_init(void) >>> platform_create_bundle(&lenovo_ec_sensors_platform_driver, >>> lenovo_ec_probe, NULL, 0, NULL, 0); >>> >>> - if (IS_ERR(lenovo_ec_sensors_platform_device)) { >>> - release_region(IO_REGION_START, IO_REGION_LENGTH); >>> + if (IS_ERR(lenovo_ec_sensors_platform_device)) >>> return PTR_ERR(lenovo_ec_sensors_platform_device); >>> - } >>> >>> return 0; >>> } >>> @@ -619,7 +617,6 @@ module_init(lenovo_ec_init); >>> >>> static void __exit lenovo_ec_exit(void) >>> { >>> - release_region(IO_REGION_START, IO_REGION_LENGTH); >>> platform_device_unregister(lenovo_ec_sensors_platform_device); >>> platform_driver_unregister(&lenovo_ec_sensors_platform_driver); >>> } > ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 3/3] hwmon: lenovo-ec-sensors: Use devm_request_region for automatic cleanup 2026-05-14 1:14 ` [PATCH 3/3] hwmon: lenovo-ec-sensors: Use devm_request_region for automatic cleanup Kean 2026-05-14 1:36 ` Guenter Roeck @ 2026-05-14 12:19 ` sashiko-bot 1 sibling, 0 replies; 13+ messages in thread From: sashiko-bot @ 2026-05-14 12:19 UTC (permalink / raw) To: Kean; +Cc: linux-hwmon Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: - [Medium] Commit message inaccurately claims to fix non-existent 'release-after-free' and 'leak' bugs. -- commit 0f5c675a52c38754efb1c95225e331f855159802 Author: Kean <rh_king@163.com> hwmon: lenovo-ec-sensors: Use devm_request_region for automatic cleanup This patch replaces manual request_region and release_region calls with devm_request_region. It delegates the I/O region lifetime management to the device-managed framework. > - A release-after-free in lenovo_ec_exit() where release_region() > was called after platform_device_unregister(), which has already > released the I/O region via the platform device removal path. Is this description accurate? Looking at the original lenovo_ec_exit(), release_region() was actually called before platform_device_unregister(): static void __exit lenovo_ec_exit(void) { release_region(IO_REGION_START, IO_REGION_LENGTH); platform_device_unregister(lenovo_ec_sensors_platform_device); platform_driver_unregister(&lenovo_ec_sensors_platform_driver); } Additionally, platform_device_unregister() does not automatically free manually requested I/O regions. Could the commit message be updated to reflect the historical behavior? > - Missing release_region() in lenovo_ec_probe() on the DMI match > failure path, which leaked the I/O region. Did this path actually leak the I/O region? If the probe fails due to a DMI match failure, the error propagates back up to lenovo_ec_init(). Looking at the original lenovo_ec_init() error handling: if (IS_ERR(lenovo_ec_sensors_platform_device)) { release_region(IO_REGION_START, IO_REGION_LENGTH); return PTR_ERR(lenovo_ec_sensors_platform_device); } Since lenovo_ec_init() caught the ERR_PTR and correctly called release_region(), it appears no leak occurred on this path. Is there another path being referenced here? -- Sashiko AI review · https://sashiko.dev/#/patchset/20260514011411.4167069-1-rh_king@163.com?part=3 ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2026-05-14 12:19 UTC | newest] Thread overview: 13+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-05-14 1:14 [PATCH 0/3] hwmon: lenovo-ec-sensors: Probe error handling fixes Kean 2026-05-14 1:14 ` [PATCH 1/3] hwmon: lenovo-ec-sensors: Fix EC signature check logic in probe Kean 2026-05-14 1:37 ` Guenter Roeck 2026-05-14 2:40 ` Mark Pearson 2026-05-14 1:14 ` [PATCH 2/3] hwmon: lenovo-ec-sensors: Fix NULL pointer dereference when DMI match fails Kean 2026-05-14 1:29 ` Guenter Roeck 2026-05-14 3:25 ` Guenter Roeck 2026-05-14 11:57 ` sashiko-bot 2026-05-14 1:14 ` [PATCH 3/3] hwmon: lenovo-ec-sensors: Use devm_request_region for automatic cleanup Kean 2026-05-14 1:36 ` Guenter Roeck 2026-05-14 2:39 ` Mark Pearson 2026-05-14 3:24 ` Guenter Roeck 2026-05-14 12:19 ` sashiko-bot
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox