]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
iproute2: optimize code and fix some mem-leak risk
authorzhaoshuang <zhaoshuang@uniontech.com>
Thu, 11 May 2023 00:37:26 +0000 (08:37 +0800)
committerStephen Hemminger <stephen@networkplumber.org>
Thu, 11 May 2023 21:15:12 +0000 (14:15 -0700)
Signed-off-by: zhaoshuang <izhaoshuang@163.com>
Reviewed-by: Pawel Chmielewski <pawel.chmielewski@intel.com>
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
14 files changed:
bridge/mdb.c
devlink/devlink.c
ip/ipaddrlabel.c
ip/ipfou.c
ip/ipila.c
ip/ipnetconf.c
ip/ipnexthop.c
ip/iproute.c
ip/iprule.c
ip/iptuntap.c
ip/tunnel.c
tc/tc_class.c
tc/tc_filter.c
tc/tc_qdisc.c

index dcc0823535144b29d2033ffd3f043b271bea9bba..fbb4f7040aa28d76c0ccad6aa0aba76c4b4e6d25 100644 (file)
@@ -466,12 +466,14 @@ static int mdb_show(int argc, char **argv)
        /* get mdb entries */
        if (rtnl_mdbdump_req(&rth, PF_BRIDGE) < 0) {
                perror("Cannot send dump request");
+               delete_json_obj();
                return -1;
        }
 
        open_json_array(PRINT_JSON, "mdb");
        if (rtnl_dump_filter(&rth, print_mdbs, stdout) < 0) {
                fprintf(stderr, "Dump terminated\n");
+               delete_json_obj();
                return -1;
        }
        close_json_array(PRINT_JSON, NULL);
@@ -479,12 +481,14 @@ static int mdb_show(int argc, char **argv)
        /* get router ports */
        if (rtnl_mdbdump_req(&rth, PF_BRIDGE) < 0) {
                perror("Cannot send dump request");
+               delete_json_obj();
                return -1;
        }
 
        open_json_object("router");
        if (rtnl_dump_filter(&rth, print_rtrs, stdout) < 0) {
                fprintf(stderr, "Dump terminated\n");
+               delete_json_obj();
                return -1;
        }
        close_json_object();
index 019ffc23e76618a59b18e8095b998b4ce53e2c26..26513142f90048902c222cc8d1d5156b1602b0a2 100644 (file)
@@ -205,6 +205,14 @@ struct ifname_map {
        char *ifname;
 };
 
+static void ifname_map_free(struct ifname_map *ifname_map)
+{
+       free(ifname_map->ifname);
+       free(ifname_map->dev_name);
+       free(ifname_map->bus_name);
+       free(ifname_map);
+}
+
 static struct ifname_map *ifname_map_alloc(const char *bus_name,
                                           const char *dev_name,
                                           uint32_t port_index,
@@ -221,23 +229,12 @@ static struct ifname_map *ifname_map_alloc(const char *bus_name,
        ifname_map->ifname = strdup(ifname);
        if (!ifname_map->bus_name || !ifname_map->dev_name ||
            !ifname_map->ifname) {
-               free(ifname_map->ifname);
-               free(ifname_map->dev_name);
-               free(ifname_map->bus_name);
-               free(ifname_map);
+               ifname_map_free(ifname_map);
                return NULL;
        }
        return ifname_map;
 }
 
-static void ifname_map_free(struct ifname_map *ifname_map)
-{
-       free(ifname_map->ifname);
-       free(ifname_map->dev_name);
-       free(ifname_map->bus_name);
-       free(ifname_map);
-}
-
 static int ifname_map_update(struct ifname_map *ifname_map, const char *ifname)
 {
        char *new_ifname;
index 46f68c41130c7c27fd8ad62b80561f0e96e288fd..b045827a03ea7d4bce5612e77c5b6b04233a79bd 100644 (file)
@@ -113,6 +113,7 @@ static int ipaddrlabel_list(int argc, char **argv)
        new_json_obj(json);
        if (rtnl_dump_filter(&rth, print_addrlabel, stdout) < 0) {
                fprintf(stderr, "Dump terminated\n");
+               delete_json_obj();
                return 1;
        }
        delete_json_obj();
index ed99a548412e3af021c44693eef604ec8896c8a1..760cfee277dc9394d442e38bd41b596a40c90024 100644 (file)
@@ -318,6 +318,7 @@ static int do_show(int argc, char **argv)
        new_json_obj(json);
        if (rtnl_dump_filter(&genl_rth, print_fou_mapping, stdout) < 0) {
                fprintf(stderr, "Dump terminated\n");
+               delete_json_obj();
                return 1;
        }
        delete_json_obj();
index 335d15f68bae5fe3a20659733d6286271de47400..4f6d578f24ae7ff378abd4867658c666785ae085 100644 (file)
@@ -150,6 +150,7 @@ static int do_list(int argc, char **argv)
        new_json_obj(json);
        if (rtnl_dump_filter(&genl_rth, print_ila_mapping, stdout) < 0) {
                fprintf(stderr, "Dump terminated\n");
+               delete_json_obj();
                return 1;
        }
        delete_json_obj();
index 7ddaefb407ed8d54d68acefa5b6726267df9304d..9ae6c45e7fd157d6b06d09f951f5f5977f9e01e4 100644 (file)
@@ -209,6 +209,7 @@ dump:
                         */
                        if (errno == EOPNOTSUPP &&
                            filter.family == AF_UNSPEC) {
+                               delete_json_obj();
                                filter.family = AF_INET;
                                goto dump;
                        }
index 894f2a126f401512540c0e706cadcc95088c4b1d..e946d6f94d48543f3c87dfb5b3abab5ec0b8c4a0 100644 (file)
@@ -1018,6 +1018,7 @@ static int ipnh_get_id(__u32 id)
        new_json_obj(json);
 
        if (print_nexthop_nocache(answer, (void *)stdout) < 0) {
+               delete_json_obj();
                free(answer);
                return -1;
        }
@@ -1103,6 +1104,7 @@ static int ipnh_list_flush(int argc, char **argv, int action)
        new_json_obj(json);
 
        if (rtnl_dump_filter(&rth, print_nexthop_nocache, stdout) < 0) {
+               delete_json_obj();
                fprintf(stderr, "Dump terminated\n");
                return -2;
        }
@@ -1178,6 +1180,7 @@ static int ipnh_bucket_list(int argc, char **argv)
        new_json_obj(json);
 
        if (rtnl_dump_filter(&rth, print_nexthop_bucket, stdout) < 0) {
+               delete_json_obj();
                fprintf(stderr, "Dump terminated\n");
                return -2;
        }
@@ -1218,6 +1221,7 @@ static int ipnh_bucket_get_id(__u32 id, __u16 bucket_index)
        new_json_obj(json);
 
        if (print_nexthop_bucket(answer, (void *)stdout) < 0) {
+               delete_json_obj();
                free(answer);
                return -1;
        }
index a7cd9543af810797400f9569c57d3a600d3d9ff3..7909c4a210cc13b643b2d9a8609283460e646607 100644 (file)
@@ -1977,6 +1977,7 @@ static int iproute_list_flush_or_save(int argc, char **argv, int action)
        if (rtnl_dump_filter_errhndlr(&rth, filter_fn, stdout,
                                      save_route_errhndlr, NULL) < 0) {
                fprintf(stderr, "Dump terminated\n");
+               delete_json_obj();
                return -2;
        }
 
@@ -2172,18 +2173,21 @@ static int iproute_get(int argc, char **argv)
 
                if (print_route(answer, (void *)stdout) < 0) {
                        fprintf(stderr, "An error :-)\n");
+                       delete_json_obj();
                        free(answer);
                        return -1;
                }
 
                if (answer->nlmsg_type != RTM_NEWROUTE) {
                        fprintf(stderr, "Not a route?\n");
+                       delete_json_obj();
                        free(answer);
                        return -1;
                }
                len -= NLMSG_LENGTH(sizeof(*r));
                if (len < 0) {
                        fprintf(stderr, "Wrong len %d\n", len);
+                       delete_json_obj();
                        free(answer);
                        return -1;
                }
@@ -2195,6 +2199,7 @@ static int iproute_get(int argc, char **argv)
                        r->rtm_src_len = 8*RTA_PAYLOAD(tb[RTA_PREFSRC]);
                } else if (!tb[RTA_SRC]) {
                        fprintf(stderr, "Failed to connect the route\n");
+                       delete_json_obj();
                        free(answer);
                        return -1;
                }
@@ -2217,6 +2222,7 @@ static int iproute_get(int argc, char **argv)
 
        if (print_route(answer, (void *)stdout) < 0) {
                fprintf(stderr, "An error :-)\n");
+               delete_json_obj();
                free(answer);
                return -1;
        }
index 458607efd93f30bd7075542546b2dc12c845c6df..e503e5c68cd3342794d22d565520347e60da9433 100644 (file)
@@ -714,6 +714,7 @@ static int iprule_list_flush_or_save(int argc, char **argv, int action)
        new_json_obj(json);
        if (rtnl_dump_filter(&rth, filter_fn, stdout) < 0) {
                fprintf(stderr, "Dump terminated\n");
+               delete_json_obj();
                return 1;
        }
        delete_json_obj();
index ab7d5d87a02d0aef3959455cd82eb509db8cc613..552599e9fa5c8032721073c379e33699c7fde721 100644 (file)
@@ -441,6 +441,7 @@ static int do_show(int argc, char **argv)
 
        if (rtnl_dump_filter(&rth, print_tuntap, NULL) < 0) {
                fprintf(stderr, "Dump terminated\n");
+               delete_json_obj();
                return -1;
        }
 
index 75cb0b51e4c053ae669f6de7cc9ca9046a7e5d83..c5c7a31faefb068a21987d62fe890afb01ff001b 100644 (file)
@@ -419,11 +419,13 @@ int do_tunnels_list(struct tnl_print_nlmsg_info *info)
        new_json_obj(json);
        if (rtnl_linkdump_req(&rth, preferred_family) < 0) {
                perror("Cannot send dump request\n");
+               delete_json_obj();
                return -1;
        }
 
        if (rtnl_dump_filter(&rth, print_nlmsg_tunnel, info) < 0) {
                fprintf(stderr, "Dump terminated\n");
+               delete_json_obj();
                return -1;
        }
        delete_json_obj();
index 096fa2ecd9cdd225623a940255cb9215f918ddc3..657761806dfd680fab132a3727ff3b5e48ffcb7b 100644 (file)
@@ -453,6 +453,7 @@ static int tc_class_list(int argc, char **argv)
        new_json_obj(json);
        if (rtnl_dump_filter(&rth, print_class, stdout) < 0) {
                fprintf(stderr, "Dump terminated\n");
+               delete_json_obj();
                return 1;
        }
        delete_json_obj();
index 700a09f628820bf55528785421db3707bad2a7df..12a21433d3bfb634ae35ac890f91db58c3700fb8 100644 (file)
@@ -734,6 +734,7 @@ static int tc_filter_list(int cmd, int argc, char **argv)
        new_json_obj(json);
        if (rtnl_dump_filter(&rth, print_filter, stdout) < 0) {
                fprintf(stderr, "Dump terminated\n");
+               delete_json_obj();
                return 1;
        }
        delete_json_obj();
index 129ad9d96f8d27736a98bab253aeb5e84fc8d504..56086c43b7fac0daff8e641f8839198529785fba 100644 (file)
@@ -432,6 +432,7 @@ static int tc_qdisc_list(int argc, char **argv)
        new_json_obj(json);
        if (rtnl_dump_filter(&rth, print_qdisc, stdout) < 0) {
                fprintf(stderr, "Dump terminated\n");
+               delete_json_obj();
                return 1;
        }
        delete_json_obj();