Patch "cxl/region: Avoid null pointer dereference in region lookup" has been added to the 6.9-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    cxl/region: Avoid null pointer dereference in region lookup

to the 6.9-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     cxl-region-avoid-null-pointer-dereference-in-region-.patch
and it can be found in the queue-6.9 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 9eba043a3688668901d7a8674c7ec24da94ee6f4
Author: Alison Schofield <alison.schofield@xxxxxxxxx>
Date:   Mon Jun 3 17:36:09 2024 -0700

    cxl/region: Avoid null pointer dereference in region lookup
    
    [ Upstream commit 285f2a08841432fc3e498b1cd00cce5216cdf189 ]
    
    cxl_dpa_to_region() looks up a region based on a memdev and DPA.
    It wrongly assumes an endpoint found mapping the DPA is also of
    a fully assembled region. When not true it leads to a null pointer
    dereference looking up the region name.
    
    This appears during testing of region lookup after a failure to
    assemble a BIOS defined region or if the lookup raced with the
    assembly of the BIOS defined region.
    
    Failure to clean up BIOS defined regions that fail assembly is an
    issue in itself and a fix to that problem will alleviate some of
    the impact. It will not alleviate the race condition so let's harden
    this path.
    
    The behavior change is that the kernel oops due to a null pointer
    dereference is replaced with a dev_dbg() message noting that an
    endpoint was mapped.
    
    Additional comments are added so that future users of this function
    can more clearly understand what it provides.
    
    Fixes: 0a105ab28a4d ("cxl/memdev: Warn of poison inject or clear to a mapped region")
    Signed-off-by: Alison Schofield <alison.schofield@xxxxxxxxx>
    Reviewed-by: Jonathan Cameron <Jonathan.Cameron@xxxxxxxxxx>
    Link: https://patch.msgid.link/20240604003609.202682-1-alison.schofield@xxxxxxxxx
    Signed-off-by: Dave Jiang <dave.jiang@xxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c
index 52061edf4bd97..a083893c0afe0 100644
--- a/drivers/cxl/core/region.c
+++ b/drivers/cxl/core/region.c
@@ -2688,22 +2688,33 @@ static int __cxl_dpa_to_region(struct device *dev, void *arg)
 {
 	struct cxl_dpa_to_region_context *ctx = arg;
 	struct cxl_endpoint_decoder *cxled;
+	struct cxl_region *cxlr;
 	u64 dpa = ctx->dpa;
 
 	if (!is_endpoint_decoder(dev))
 		return 0;
 
 	cxled = to_cxl_endpoint_decoder(dev);
-	if (!cxled->dpa_res || !resource_size(cxled->dpa_res))
+	if (!cxled || !cxled->dpa_res || !resource_size(cxled->dpa_res))
 		return 0;
 
 	if (dpa > cxled->dpa_res->end || dpa < cxled->dpa_res->start)
 		return 0;
 
-	dev_dbg(dev, "dpa:0x%llx mapped in region:%s\n", dpa,
-		dev_name(&cxled->cxld.region->dev));
+	/*
+	 * Stop the region search (return 1) when an endpoint mapping is
+	 * found. The region may not be fully constructed so offering
+	 * the cxlr in the context structure is not guaranteed.
+	 */
+	cxlr = cxled->cxld.region;
+	if (cxlr)
+		dev_dbg(dev, "dpa:0x%llx mapped in region:%s\n", dpa,
+			dev_name(&cxlr->dev));
+	else
+		dev_dbg(dev, "dpa:0x%llx mapped in endpoint:%s\n", dpa,
+			dev_name(dev));
 
-	ctx->cxlr = cxled->cxld.region;
+	ctx->cxlr = cxlr;
 
 	return 1;
 }




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux