From 24ad51518f5678d83423e7f446751d8a3c1961c2 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 24 Nov 2014 17:19:53 +0100 Subject: [PATCH 1/2] route: set missing TCA_ATTR_XSTATS changes flags in rtnl_tc_msg_parse() Acked-by: Thomas Graf Signed-off-by: Thomas Haller --- lib/route/tc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/route/tc.c b/lib/route/tc.c index 53b69d5..4c92822 100644 --- a/lib/route/tc.c +++ b/lib/route/tc.c @@ -137,6 +137,7 @@ int rtnl_tc_msg_parse(struct nlmsghdr *n, struct rtnl_tc *tc) tc->tc_xstats = nl_data_alloc_attr(tbs[TCA_STATS_APP]); if (tc->tc_xstats == NULL) return -NLE_NOMEM; + tc->ce_mask |= TCA_ATTR_XSTATS; } else goto compat_xstats; } else { From 703989eb12185471d6e494105f91470ea74d822d Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 24 Nov 2014 17:19:54 +0100 Subject: [PATCH 2/2] route: make rtnl_tc_clone() more robust against NLE_NOMEM When oo_clone() fails, the new object is freed. Make sure 'dst' does not own parts of 'src'. Acked-by: Thomas Graf Signed-off-by: Thomas Haller --- lib/route/tc.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/route/tc.c b/lib/route/tc.c index 4c92822..1dcb986 100644 --- a/lib/route/tc.c +++ b/lib/route/tc.c @@ -760,16 +760,24 @@ int rtnl_tc_clone(struct nl_object *dstobj, struct nl_object *srcobj) dst->tc_link = src->tc_link; } + dst->tc_opts = NULL; + dst->tc_xstats = NULL; + dst->tc_subdata = NULL; + dst->ce_mask &= ~(TCA_ATTR_OPTS | + TCA_ATTR_XSTATS); + if (src->tc_opts) { dst->tc_opts = nl_data_clone(src->tc_opts); if (!dst->tc_opts) return -NLE_NOMEM; + dst->ce_mask |= TCA_ATTR_OPTS; } - + if (src->tc_xstats) { dst->tc_xstats = nl_data_clone(src->tc_xstats); if (!dst->tc_xstats) return -NLE_NOMEM; + dst->ce_mask |= TCA_ATTR_XSTATS; } if (src->tc_subdata) {