OSDN Git Service

mei: hbm: fix client dma reply status
authorAlexander Usyskin <alexander.usyskin@intel.com>
Tue, 28 Dec 2021 08:20:47 +0000 (10:20 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 30 Dec 2021 13:12:16 +0000 (14:12 +0100)
Don't blindly copy status value received from the firmware
into internal client status field,
It may be positive and ERR_PTR(ret) will translate it
into an invalid address and the caller will crash.

Put the error code into the client status on failure.

Fixes: 369aea845951 ("mei: implement client dma setup.")
Cc: <stable@vger.kernel.org> # v5.11+
Reported-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Tested-by: : Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Acked-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com>
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Link: https://lore.kernel.org/r/20211228082047.378115-1-tomas.winkler@intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/mei/hbm.c

index be41843..cebcca6 100644 (file)
@@ -672,10 +672,14 @@ static void mei_hbm_cl_dma_map_res(struct mei_device *dev,
        if (!cl)
                return;
 
-       dev_dbg(dev->dev, "cl dma map result = %d\n", res->status);
-       cl->status = res->status;
-       if (!cl->status)
+       if (res->status) {
+               dev_err(dev->dev, "cl dma map failed %d\n", res->status);
+               cl->status = -EFAULT;
+       } else {
+               dev_dbg(dev->dev, "cl dma map succeeded\n");
                cl->dma_mapped = 1;
+               cl->status = 0;
+       }
        wake_up(&cl->wait);
 }
 
@@ -698,10 +702,14 @@ static void mei_hbm_cl_dma_unmap_res(struct mei_device *dev,
        if (!cl)
                return;
 
-       dev_dbg(dev->dev, "cl dma unmap result = %d\n", res->status);
-       cl->status = res->status;
-       if (!cl->status)
+       if (res->status) {
+               dev_err(dev->dev, "cl dma unmap failed %d\n", res->status);
+               cl->status = -EFAULT;
+       } else {
+               dev_dbg(dev->dev, "cl dma unmap succeeded\n");
                cl->dma_mapped = 0;
+               cl->status = 0;
+       }
        wake_up(&cl->wait);
 }