]> git.ipfire.org Git - thirdparty/libnl.git/commitdiff
Fix memory leaks when sending of message failed
authorThomas Graf <tgr@lsx.localdomain>
Thu, 15 May 2008 11:45:41 +0000 (13:45 +0200)
committerThomas Graf <tgr@lsx.localdomain>
Thu, 15 May 2008 11:45:41 +0000 (13:45 +0200)
Various callers of nl_send_auto_complete() failed to
free the allocated message when an error was reported.

lib/route/class.c
lib/route/classifier.c
lib/route/link.c
lib/route/neigh.c
lib/route/neightbl.c
lib/route/qdisc.c

index cdf4232dedce907443d058900fe2cce55573840b..20b59eea1ea3f4843a69cd37410899ea4a7658cd 100644 (file)
@@ -154,10 +154,11 @@ int rtnl_class_add(struct nl_sock *sk, struct rtnl_class *class, int flags)
        if ((err = rtnl_class_build_add_request(class, flags, &msg)) < 0)
                return err;
 
-       if ((err = nl_send_auto_complete(sk, msg)) < 0)
+       err = nl_send_auto_complete(sk, msg);
+       nlmsg_free(msg);
+       if (err < 0)
                return err;
 
-       nlmsg_free(msg);
        return nl_wait_for_ack(sk);
 }
 
index 0f603587a5a93f38a68fbc2e09de2a036ababc88..9a2a9ac27fb40ac79949b0807a13e63c95e001bc 100644 (file)
@@ -169,10 +169,11 @@ int rtnl_cls_add(struct nl_sock *sk, struct rtnl_cls *cls, int flags)
        if ((err = rtnl_cls_build_add_request(cls, flags, &msg)) < 0)
                return err;
        
-       if ((err = nl_send_auto_complete(sk, msg)) < 0)
+       err = nl_send_auto_complete(sk, msg);
+       nlmsg_free(msg);
+       if (err < 0)
                return err;
 
-       nlmsg_free(msg);
        return nl_wait_for_ack(sk);
 }
 
@@ -215,10 +216,11 @@ int rtnl_cls_change(struct nl_sock *sk, struct rtnl_cls *cls, int flags)
        if ((err = rtnl_cls_build_change_request(cls, flags, &msg)) < 0)
                return err;
        
-       if ((err = nl_send_auto_complete(sk, msg)) < 0)
+       err = nl_send_auto_complete(sk, msg);
+       nlmsg_free(msg);
+       if (err < 0)
                return err;
 
-       nlmsg_free(msg);
        return nl_wait_for_ack(sk);
 }
 
@@ -262,10 +264,11 @@ int rtnl_cls_delete(struct nl_sock *sk, struct rtnl_cls *cls, int flags)
        if ((err = rtnl_cls_build_delete_request(cls, flags, &msg)) < 0)
                return err;
        
-       if ((err = nl_send_auto_complete(sk, msg)) < 0)
+       err = nl_send_auto_complete(sk, msg);
+       nlmsg_free(msg);
+       if (err < 0)
                return err;
 
-       nlmsg_free(msg);
        return nl_wait_for_ack(sk);
 }
 
index 34bc83b472ec3a1cf3ba9819354f8d5e611cf491..b894cabb90542ae204205eb353f1c3dac4bc51d9 100644 (file)
@@ -1047,10 +1047,11 @@ int rtnl_link_change(struct nl_sock *sk, struct rtnl_link *old,
        if ((err = rtnl_link_build_change_request(old, tmpl, flags, &msg)) < 0)
                return err;
        
-       if ((err = nl_send_auto_complete(sk, msg)) < 0)
+       err = nl_send_auto_complete(sk, msg);
+       nlmsg_free(msg);
+       if (err < 0)
                return err;
 
-       nlmsg_free(msg);
        return nl_wait_for_ack(sk);
 }
 
index adb159620abd0d77b0808ee1309754f0cd362349..9541f20d8b9331b03a07212c602c68d01bd1204f 100644 (file)
@@ -653,10 +653,11 @@ int rtnl_neigh_add(struct nl_sock *sk, struct rtnl_neigh *tmpl, int flags)
        if ((err = rtnl_neigh_build_add_request(tmpl, flags, &msg)) < 0)
                return err;
 
-       if ((err = nl_send_auto_complete(sk, msg)) < 0)
+       err = nl_send_auto_complete(sk, msg);
+       nlmsg_free(msg);
+       if (err < 0)
                return err;
 
-       nlmsg_free(msg);
        return nl_wait_for_ack(sk);
 }
 
@@ -708,10 +709,11 @@ int rtnl_neigh_delete(struct nl_sock *sk, struct rtnl_neigh *neigh,
        if ((err = rtnl_neigh_build_delete_request(neigh, flags, &msg)) < 0)
                return err;
 
-       if ((err = nl_send_auto_complete(sk, msg)) < 0)
+       err = nl_send_auto_complete(sk, msg);
+       nlmsg_free(msg);
+       if (err < 0)
                return err;
 
-       nlmsg_free(msg);
        return nl_wait_for_ack(sk);
 }
 
@@ -767,10 +769,11 @@ int rtnl_neigh_change(struct nl_sock *sk, struct rtnl_neigh *neigh, int flags)
        if ((err = rtnl_neigh_build_change_request(neigh, flags, &msg)) < 0)
                return err;
 
-       if ((err = nl_send_auto_complete(sk, msg)) < 0)
+       err = nl_send_auto_complete(sk, msg);
+       nlmsg_free(msg);
+       if (err < 0)
                return err;
 
-       nlmsg_free(msg);
        return nl_wait_for_ack(sk);
 }
 
index e58aef67d7436721a73d818f9a478ca9a796ba3b..d34205a252345a568b783b5d0b3e29a893d3a83f 100644 (file)
@@ -590,10 +590,11 @@ int rtnl_neightbl_change(struct nl_sock *sk, struct rtnl_neightbl *old,
        if ((err = rtnl_neightbl_build_change_request(old, tmpl, &msg)) < 0)
                return err;
 
-       if ((err = nl_send_auto_complete(sk, msg)) < 0)
+       err = nl_send_auto_complete(sk, msg);
+       nlmsg_free(msg);
+       if (err < 0)
                return err;
 
-       nlmsg_free(msg);
        return nl_wait_for_ack(sk);
 }
 
index b23d72d03f021d79f284affaa8959ee9837489ce..c8dd4d50a810c8bac8f3ca050195b565f1a2fe72 100644 (file)
@@ -233,10 +233,11 @@ int rtnl_qdisc_add(struct nl_sock *sk, struct rtnl_qdisc *qdisc,
        if ((err = rtnl_qdisc_build_add_request(qdisc, flags, &msg)) < 0)
                return err;
 
-       if ((err = nl_send_auto_complete(sk, msg)) < 0)
+       err = nl_send_auto_complete(sk, msg);
+       nlmsg_free(msg);
+       if (err < 0)
                return err;
 
-       nlmsg_free(msg);
        return nl_wait_for_ack(sk);
 }
 
@@ -288,10 +289,11 @@ int rtnl_qdisc_change(struct nl_sock *sk, struct rtnl_qdisc *qdisc,
        if ((err = rtnl_qdisc_build_change_request(qdisc, new, &msg)) < 0)
                return err;
 
-       if ((err = nl_send_auto_complete(sk, msg)) < 0)
+       err = nl_send_auto_complete(sk, msg);
+       nlmsg_free(msg);
+       if (err < 0)
                return err;
 
-       nlmsg_free(msg);
        return nl_wait_for_ack(sk);
 }
 
@@ -360,10 +362,11 @@ int rtnl_qdisc_delete(struct nl_sock *sk, struct rtnl_qdisc *qdisc)
        if ((err = rtnl_qdisc_build_delete_request(qdisc, &msg)) < 0)
                return err;
 
-       if ((err = nl_send_auto_complete(sk, msg)) < 0)
+       err = nl_send_auto_complete(sk, msg);
+       nlmsg_free(msg);
+       if (err < 0)
                return err;
 
-       nlmsg_free(msg);
        return nl_wait_for_ack(sk);
 }