media: platform: mtk-mdp3: release node reference before returning
authorDeepak R Varma <drv@mailo.com>
Sat, 11 Feb 2023 11:09:50 +0000 (16:39 +0530)
committerHans Verkuil <hverkuil-cisco@xs4all.nl>
Thu, 25 May 2023 14:21:19 +0000 (16:21 +0200)
The iterator for_each_child_of_node() increments the refcount of the
child node it is processing. Release such a reference when the loop
needs to break due to an error during its execution.
Issue identified using for_each_child.cocci Coccinelle semantic patch.

Signed-off-by: Deepak R Varma <drv@mailo.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
drivers/media/platform/mediatek/mdp3/mtk-mdp3-comp.c

index 19a4a085f73a1dc540e92da8a08c91f718981cda..a605e80c7dc366b3032793dbb8250d5ec25d00d3 100644 (file)
@@ -1035,6 +1035,7 @@ static int mdp_comp_sub_create(struct mdp_dev *mdp)
 {
        struct device *dev = &mdp->pdev->dev;
        struct device_node *node, *parent;
+       int ret = 0;
 
        parent = dev->of_node->parent;
 
@@ -1060,16 +1061,22 @@ static int mdp_comp_sub_create(struct mdp_dev *mdp)
                        dev_err(dev,
                                "Fail to get sub comp. id: type %d alias %d\n",
                                type, alias_id);
-                       return -EINVAL;
+                       ret = -EINVAL;
+                       goto err_free_node;
                }
                mdp_comp_alias_id[type]++;
 
                comp = mdp_comp_create(mdp, node, id);
-               if (IS_ERR(comp))
-                       return PTR_ERR(comp);
+               if (IS_ERR(comp)) {
+                       ret = PTR_ERR(comp);
+                       goto err_free_node;
+               }
        }
+       return ret;
 
-       return 0;
+err_free_node:
+       of_node_put(node);
+       return ret;
 }
 
 void mdp_comp_destroy(struct mdp_dev *mdp)