summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Jiang <dave.jiang@intel.com>2026-07-24 15:38:40 -0700
committerDave Jiang <dave.jiang@intel.com>2026-07-24 15:38:40 -0700
commitf0986e9e6028f746b2ee63efd85a2d13318d6808 (patch)
treeb94ab6d643eb0584c66442dd9331aea93a9f0a93
parentd86d39138b332d35d7ddb1d0679d7f2471512933 (diff)
parentbad0aa134b64f38e29fb3e61176c15680afe8a04 (diff)
downloadlinux-next-f0986e9e6028f746b2ee63efd85a2d13318d6808.tar.gz
linux-next-f0986e9e6028f746b2ee63efd85a2d13318d6808.zip
Merge branch 'for-7.3/cxl-fixes' into cxl-for-next
cxl/region: Use __free(put_device) in find_pos_and_ways() cxl/region: Fix use-after-free in find_pos_and_ways() error path
-rw-r--r--drivers/cxl/core/region.c10
1 files changed, 3 insertions, 7 deletions
diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c
index 578622240401..d50b1dfbcd33 100644
--- a/drivers/cxl/core/region.c
+++ b/drivers/cxl/core/region.c
@@ -1914,15 +1914,14 @@ static int find_pos_and_ways(struct cxl_port *port, struct range *range,
{
struct cxl_switch_decoder *cxlsd;
struct cxl_port *parent;
- struct device *dev;
int rc = -ENXIO;
parent = parent_port_of(port);
if (!parent)
return rc;
- dev = device_find_child(&parent->dev, range,
- match_switch_decoder_by_range);
+ struct device *dev __free(put_device) =
+ device_find_child(&parent->dev, range, match_switch_decoder_by_range);
if (!dev) {
dev_err(port->uport_dev,
"failed to find decoder mapping %#llx-%#llx\n",
@@ -1939,14 +1938,11 @@ static int find_pos_and_ways(struct cxl_port *port, struct range *range,
break;
}
}
- put_device(dev);
-
if (rc)
dev_err(port->uport_dev,
"failed to find %s:%s in target list of %s\n",
dev_name(&port->dev),
- dev_name(port->parent_dport->dport_dev),
- dev_name(&cxlsd->cxld.dev));
+ dev_name(port->parent_dport->dport_dev), dev_name(dev));
return rc;
}