]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
lantiq: fix mtdparsers refcount leak and memory leak
authorShiji Yang <yangshiji66@outlook.com>
Fri, 6 Mar 2026 00:36:01 +0000 (08:36 +0800)
committerRobert Marko <robimarko@gmail.com>
Sun, 22 Mar 2026 11:00:31 +0000 (12:00 +0100)
Release previously allocated memory and OF node before return.

Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
Link: https://github.com/openwrt/openwrt/pull/22276
Signed-off-by: Robert Marko <robimarko@gmail.com>
target/linux/lantiq/patches-6.12/101-find_active_root.patch

index 99e187a012b4cd1d69125fbd0eb73afb3b594694..b5fefbae096ab6ab3e98b2ee5d991e0fe4faa1bb 100644 (file)
@@ -5,8 +5,8 @@ Subject: [PATCH] find active root
 
 Signed-off-by: Mathias Kresin <openwrt@kresin.me>
 ---
- drivers/mtd/parsers/ofpart_core.c | 49 ++++++++++++++++++++++++++++++-
- 1 file changed, 48 insertions(+), 1 deletion(-)
+ drivers/mtd/parsers/ofpart_core.c | 53 +++++++++++++++++++++++++++++++
+ 1 file changed, 53 insertions(+)
 
 --- a/drivers/mtd/parsers/ofpart_core.c
 +++ b/drivers/mtd/parsers/ofpart_core.c
@@ -58,18 +58,22 @@ Signed-off-by: Mathias Kresin <openwrt@kresin.me>
  
        /* Pull of_node from the master device node */
        mtd_node = mtd_get_of_node(master);
-@@ -95,7 +129,9 @@ static int parse_fixed_partitions(struct
-               return 0;
+@@ -98,6 +132,14 @@ static int parse_fixed_partitions(struct
+       if (!parts)
+               return -ENOMEM;
  
-       parts = kcalloc(nr_parts, sizeof(*parts), GFP_KERNEL);
--      if (!parts)
 +      part_nodes = kcalloc(nr_parts, sizeof(*part_nodes), GFP_KERNEL);
++      if (!part_nodes) {
++              if (dedicated)
++                      of_node_put(ofpart_node);
++              kfree(parts);
++              return -ENOMEM;
++      }
 +
-+      if (!parts || !part_nodes)
-               return -ENOMEM;
        i = 0;
-@@ -166,6 +202,11 @@ static int parse_fixed_partitions(struct
+       for_each_child_of_node(ofpart_node,  pp) {
+               const __be32 *reg;
+@@ -166,6 +208,11 @@ static int parse_fixed_partitions(struct
                if (of_property_read_bool(pp, "slc-mode"))
                        parts[i].add_flags |= MTD_SLC_ON_MLC_EMULATION;
  
@@ -81,7 +85,7 @@ Signed-off-by: Mathias Kresin <openwrt@kresin.me>
                i++;
        }
  
-@@ -175,6 +216,11 @@ static int parse_fixed_partitions(struct
+@@ -175,6 +222,11 @@ static int parse_fixed_partitions(struct
        if (quirks && quirks->post_parse)
                quirks->post_parse(master, parts, nr_parts);
  
@@ -93,7 +97,7 @@ Signed-off-by: Mathias Kresin <openwrt@kresin.me>
        *pparts = parts;
        return nr_parts;
  
-@@ -185,6 +231,7 @@ ofpart_fail:
+@@ -185,6 +237,7 @@ ofpart_fail:
  ofpart_none:
        of_node_put(pp);
        kfree(parts);