[PATCH 2/2] route: make rtnl_tc_clone() more robust agaoins NLE_NOMEM

Thomas Haller thaller at redhat.com
Mon Nov 24 08:19:54 PST 2014


When oo_clone() fails, the new object is freed. Make sure dst
does not owns parts of src.

Signed-off-by: Thomas Haller <thaller at redhat.com>
---
 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) {
-- 
1.9.3




More information about the libnl mailing list