310 lines
8.7 KiB
Diff
310 lines
8.7 KiB
Diff
From 7e8cdfa2eac57c8c1c469681d5ee016fc432ee4d Mon Sep 17 00:00:00 2001
|
|
From: zhaoshuang <zhaoshuang@uniontech.com>
|
|
Date: Thu, 11 May 2023 08:37:26 +0800
|
|
Subject: [PATCH] iproute2: optimize code and fix some mem-leak risk
|
|
|
|
Conflict:contaxt adapt in devlink/devlink.c ip/ipnexthop.c,and remove modify in tc/tc_class.c because it
|
|
does not have leak
|
|
Reference:https://git.kernel.org/pub/scm/network/iproute2/iproute2.git/commit?id=7e8cdfa2eac57c8c1c469681d5ee016fc432ee4d
|
|
|
|
Signed-off-by: zhaoshuang <izhaoshuang@163.com>
|
|
Reviewed-by: Pawel Chmielewski <pawel.chmielewski@intel.com>
|
|
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
|
|
---
|
|
bridge/mdb.c | 4 ++++
|
|
devlink/devlink.c | 21 +++++++++------------
|
|
ip/ipaddrlabel.c | 1 +
|
|
ip/ipfou.c | 1 +
|
|
ip/ipila.c | 1 +
|
|
ip/ipnetconf.c | 1 +
|
|
ip/ipnexthop.c | 4 ++++
|
|
ip/iproute.c | 6 ++++++
|
|
ip/iprule.c | 1 +
|
|
ip/iptuntap.c | 1 +
|
|
ip/tunnel.c | 2 ++
|
|
tc/tc_filter.c | 1 +
|
|
tc/tc_qdisc.c | 1 +
|
|
13 files changed, 33 insertions(+), 12 deletions(-)
|
|
|
|
diff --git a/bridge/mdb.c b/bridge/mdb.c
|
|
index b427d87..c5f23d0 100644
|
|
--- a/bridge/mdb.c
|
|
+++ b/bridge/mdb.c
|
|
@@ -423,12 +423,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);
|
|
@@ -436,12 +438,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();
|
|
diff --git a/devlink/devlink.c b/devlink/devlink.c
|
|
index 765e90d..9275ee5 100644
|
|
--- a/devlink/devlink.c
|
|
+++ b/devlink/devlink.c
|
|
@@ -209,6 +209,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,
|
|
@@ -225,23 +233,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);
|
|
-}
|
|
-
|
|
#define DL_OPT_HANDLE BIT(0)
|
|
#define DL_OPT_HANDLEP BIT(1)
|
|
#define DL_OPT_PORT_TYPE BIT(2)
|
|
diff --git a/ip/ipaddrlabel.c b/ip/ipaddrlabel.c
|
|
index beb08da..9e468b0 100644
|
|
--- a/ip/ipaddrlabel.c
|
|
+++ b/ip/ipaddrlabel.c
|
|
@@ -127,6 +127,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();
|
|
diff --git a/ip/ipfou.c b/ip/ipfou.c
|
|
index 9c69777..5db137d 100644
|
|
--- a/ip/ipfou.c
|
|
+++ b/ip/ipfou.c
|
|
@@ -322,6 +322,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();
|
|
diff --git a/ip/ipila.c b/ip/ipila.c
|
|
index 475c35b..cbc3dd3 100644
|
|
--- a/ip/ipila.c
|
|
+++ b/ip/ipila.c
|
|
@@ -154,6 +154,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();
|
|
diff --git a/ip/ipnetconf.c b/ip/ipnetconf.c
|
|
index bb0ebe1..f5ebb1a 100644
|
|
--- a/ip/ipnetconf.c
|
|
+++ b/ip/ipnetconf.c
|
|
@@ -214,6 +214,7 @@ dump:
|
|
*/
|
|
if (errno == EOPNOTSUPP &&
|
|
filter.family == AF_UNSPEC) {
|
|
+ delete_json_obj();
|
|
filter.family = AF_INET;
|
|
goto dump;
|
|
}
|
|
diff --git a/ip/ipnexthop.c b/ip/ipnexthop.c
|
|
index 9478aa5..36dafa1 100644
|
|
--- a/ip/ipnexthop.c
|
|
+++ b/ip/ipnexthop.c
|
|
@@ -732,6 +732,7 @@ static int ipnh_get_id(__u32 id)
|
|
new_json_obj(json);
|
|
|
|
if (print_nexthop(answer, (void *)stdout) < 0) {
|
|
+ delete_json_obj();
|
|
free(answer);
|
|
return -1;
|
|
}
|
|
@@ -817,6 +818,7 @@ static int ipnh_list_flush(int argc, char **argv, int action)
|
|
new_json_obj(json);
|
|
|
|
if (rtnl_dump_filter(&rth, print_nexthop, stdout) < 0) {
|
|
+ delete_json_obj();
|
|
fprintf(stderr, "Dump terminated\n");
|
|
return -2;
|
|
}
|
|
@@ -892,6 +894,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;
|
|
}
|
|
@@ -932,6 +935,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;
|
|
}
|
|
diff --git a/ip/iproute.c b/ip/iproute.c
|
|
index 9922cb0..6e359fa 100644
|
|
--- a/ip/iproute.c
|
|
+++ b/ip/iproute.c
|
|
@@ -1962,6 +1962,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;
|
|
}
|
|
|
|
@@ -2157,18 +2158,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;
|
|
}
|
|
@@ -2180,6 +2184,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;
|
|
}
|
|
@@ -2202,6 +2207,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;
|
|
}
|
|
diff --git a/ip/iprule.c b/ip/iprule.c
|
|
index 4166073..7307908 100644
|
|
--- a/ip/iprule.c
|
|
+++ b/ip/iprule.c
|
|
@@ -718,6 +718,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();
|
|
diff --git a/ip/iptuntap.c b/ip/iptuntap.c
|
|
index 385d2bd..ff88844 100644
|
|
--- a/ip/iptuntap.c
|
|
+++ b/ip/iptuntap.c
|
|
@@ -444,6 +444,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;
|
|
}
|
|
|
|
diff --git a/ip/tunnel.c b/ip/tunnel.c
|
|
index 88585cf..51a0016 100644
|
|
--- a/ip/tunnel.c
|
|
+++ b/ip/tunnel.c
|
|
@@ -439,11 +439,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();
|
|
diff --git a/tc/tc_filter.c b/tc/tc_filter.c
|
|
index 71be2e8..5a2a6ba 100644
|
|
--- a/tc/tc_filter.c
|
|
+++ b/tc/tc_filter.c
|
|
@@ -738,6 +738,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();
|
|
diff --git a/tc/tc_qdisc.c b/tc/tc_qdisc.c
|
|
index b79029d..77f4d97 100644
|
|
--- a/tc/tc_qdisc.c
|
|
+++ b/tc/tc_qdisc.c
|
|
@@ -435,6 +435,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();
|
|
--
|
|
2.27.0
|
|
|