cxl/region: Fix decoder allocation crash
authorVishal Verma <vishal.l.verma@intel.com>
Tue, 1 Nov 2022 07:41:00 +0000 (01:41 -0600)
committerDan Williams <dan.j.williams@intel.com>
Tue, 1 Nov 2022 22:33:07 +0000 (15:33 -0700)
commit71ee71d7adcba648077997a29a91158d20c40b09
tree72fcf55fcadc94e4cc88efe8273fc5fd96afce49
parent24f0692bfd41fd207d99c993a5785c3426762046
cxl/region: Fix decoder allocation crash

When an intermediate port's decoders have been exhausted by existing
regions, and creating a new region with the port in question in it's
hierarchical path is attempted, cxl_port_attach_region() fails to find a
port decoder (as would be expected), and drops into the failure / cleanup
path.

However, during cleanup of the region reference, a sanity check attempts
to dereference the decoder, which in the above case didn't exist. This
causes a NULL pointer dereference BUG.

To fix this, refactor the decoder allocation and de-allocation into
helper routines, and in this 'free' routine, check that the decoder,
@cxld, is valid before attempting any operations on it.

Cc: <stable@vger.kernel.org>
Suggested-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
Reviewed-by: Dave Jiang <dave.jiang@intel.com>
Fixes: 384e624bb211 ("cxl/region: Attach endpoint decoders")
Link: https://lore.kernel.org/r/20221101074100.1732003-1-vishal.l.verma@intel.com
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
drivers/cxl/core/region.c