diff options
| author | Dave Jiang <dave.jiang@intel.com> | 2026-07-24 15:38:40 -0700 |
|---|---|---|
| committer | Dave Jiang <dave.jiang@intel.com> | 2026-07-24 15:38:40 -0700 |
| commit | f0986e9e6028f746b2ee63efd85a2d13318d6808 (patch) | |
| tree | b94ab6d643eb0584c66442dd9331aea93a9f0a93 | |
| parent | d86d39138b332d35d7ddb1d0679d7f2471512933 (diff) | |
| parent | bad0aa134b64f38e29fb3e61176c15680afe8a04 (diff) | |
| download | linux-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.c | 10 |
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; } |
