rpmsg: core: Clean up resources on announce_create failure.
authorArnaud Pouliquen <arnaud.pouliquen@foss.st.com>
Mon, 6 Dec 2021 19:07:58 +0000 (20:07 +0100)
committerMathieu Poirier <mathieu.poirier@linaro.org>
Wed, 8 Dec 2021 17:16:50 +0000 (10:16 -0700)
During the rpmsg_dev_probe, if rpdev->ops->announce_create returns an
error, the rpmsg device and default endpoint should be freed before
exiting the function.

Fixes: 5e619b48677c ("rpmsg: Split rpmsg core and virtio backend")
Suggested-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Signed-off-by: Arnaud Pouliquen <arnaud.pouliquen@foss.st.com>
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Cc: stable <stable@vger.kernel.org>
Link: https://lore.kernel.org/r/20211206190758.10004-1-arnaud.pouliquen@foss.st.com
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
drivers/rpmsg/rpmsg_core.c

index f031b2b..d9e612f 100644 (file)
@@ -540,13 +540,25 @@ static int rpmsg_dev_probe(struct device *dev)
        err = rpdrv->probe(rpdev);
        if (err) {
                dev_err(dev, "%s: failed: %d\n", __func__, err);
-               if (ept)
-                       rpmsg_destroy_ept(ept);
-               goto out;
+               goto destroy_ept;
        }
 
-       if (ept && rpdev->ops->announce_create)
+       if (ept && rpdev->ops->announce_create) {
                err = rpdev->ops->announce_create(rpdev);
+               if (err) {
+                       dev_err(dev, "failed to announce creation\n");
+                       goto remove_rpdev;
+               }
+       }
+
+       return 0;
+
+remove_rpdev:
+       if (rpdrv->remove)
+               rpdrv->remove(rpdev);
+destroy_ept:
+       if (ept)
+               rpmsg_destroy_ept(ept);
 out:
        return err;
 }