]> git.ipfire.org Git - thirdparty/libnl.git/commitdiff
Fix memory leak when parsing netlink messages into caches
authorThomas Graf <tgr@deb.localdomain>
Mon, 17 Dec 2007 15:52:41 +0000 (16:52 +0100)
committerThomas Graf <tgr@deb.localdomain>
Mon, 17 Dec 2007 15:52:41 +0000 (16:52 +0100)
The reference created by the parsers was never given back.

14 files changed:
lib/fib_lookup/lookup.c
lib/genl/ctrl.c
lib/netfilter/ct.c
lib/netfilter/log.c
lib/route/addr.c
lib/route/class.c
lib/route/classifier.c
lib/route/link.c
lib/route/neigh.c
lib/route/neightbl.c
lib/route/qdisc.c
lib/route/route.c
lib/route/rule.c
lib/socket.c

index d076ef9272acff07b676f23abc7c706f895a2258..576603518cd20052532fad1d05e216c4c6280f8c 100644 (file)
@@ -114,7 +114,7 @@ static int result_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who,
        /* REAL HACK, fib_lookup doesn't support ACK nor does it
         * send a DONE message, enforce end of message stream
         * after just the first message */
-       return NL_STOP;
+       err = NL_STOP;
 
 errout:
        flnl_result_put(res);
index b4dc4896021acf713b9d379a1380267aa41fb10d..9948a57f19da98447f4a7b81d3e46147eb0064f6 100644 (file)
@@ -131,7 +131,7 @@ static int ctrl_msg_parser(struct nl_cache_ops *ops, struct genl_cmd *cmd,
        if (err < 0)
                goto errout;
 
-       return P_ACCEPT;
+       err = P_ACCEPT;
 
 errout:
        genl_family_put(family);
index 195c98f385b34acba1b760c02930cb0791a4e722..e9df9246fb8a06f07e2d7ea59b83317332cd555e 100644 (file)
@@ -366,13 +366,15 @@ static int ct_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who,
        if (err < 0)
                goto errout;
 
-       return P_ACCEPT;
+       err = P_ACCEPT;
 
-errout_errno:
-       err = nl_get_errno();
 errout:
        nfnl_ct_put(ct);
        return err;
+
+errout_errno:
+       err = nl_get_errno();
+       goto errout;
 }
 
 int nfnl_ct_dump_request(struct nl_handle *h)
index d8b35215bf135ce5036f229d89a115f8e270cca7..a6bf3d5a942c4d781cc06abc68be0cd58c868075 100644 (file)
@@ -174,13 +174,15 @@ static int log_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who,
        if (err < 0)
                goto errout;
 
-       return P_ACCEPT;
+       err = P_ACCEPT;
 
-errout_errno:
-       err = nl_get_errno();
 errout:
        nfnl_log_put(log);
        return err;
+
+errout_errno:
+       err = nl_get_errno();
+       goto errout;
 }
 
 /**
index b1fa7d0c86f2b9300534400a6e10ca4c683e14f7..b8ec56cc481f363c49fbee718c020c4418956ead 100644 (file)
@@ -288,7 +288,7 @@ static int addr_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who,
        if (err < 0)
                goto errout_free;
 
-       return P_ACCEPT;
+       err = P_ACCEPT;
 
 errout_free:
        rtnl_addr_put(addr);
index efa8cb4098ac3de67c8b004c45ac9ee7addee4e1..7966b09a9da954ca22df7555ca357a71c6e2c689 100644 (file)
@@ -56,7 +56,7 @@ static int class_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who,
        if (err < 0)
                goto errout_free;
 
-       return P_ACCEPT;
+       err = P_ACCEPT;
 
 errout_free:
        rtnl_class_put(class);
index a661d9b2ac6cb80c422aee6c65abe74ff885921b..df6d3ae6e3cf06e86cbaded359d5feecdca1990c 100644 (file)
@@ -67,7 +67,7 @@ static int cls_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who,
        if (err < 0)
                goto errout_free;
 
-       return P_ACCEPT;
+       err = P_ACCEPT;
 
 errout_free:
        rtnl_cls_put(cls);
index 4774a585012f6fbe5cea1b417ec26a2e227b3f1b..d3c204f5bf19974eae9def44e4fee97b206175e6 100644 (file)
@@ -327,7 +327,7 @@ static int link_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who,
        if (err < 0)
                goto errout;
 
-       return P_ACCEPT;
+       err = P_ACCEPT;
 
 errout:
        rtnl_link_put(link);
index 5d6bf7a669b97322d8b0d30b060df6cd6b5ecd25..6f2f0d3fd9ce15180bb009d91f40afc42fae3828 100644 (file)
@@ -318,7 +318,7 @@ static int neigh_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who,
        if (err < 0)
                goto errout;
 
-       return P_ACCEPT;
+       err = P_ACCEPT;
 
 errout:
        rtnl_neigh_put(neigh);
index 38c345d23174acfe3251421742d989e7485ea443..3191b5b1397eefb706f64fd075871a8b87a87fe5 100644 (file)
@@ -220,7 +220,7 @@ static int neightbl_msg_parser(struct nl_cache_ops *ops,
        if (err < 0)
                goto errout;
 
-       return P_ACCEPT;
+       err = P_ACCEPT;
 errout:
        rtnl_neightbl_put(ntbl);
        return err;
index 19bf12af7c278cc86625dc09a1dbd56996b79d33..8eda51bfe6997a831f37fc1da4f59e4e4e4a4949 100644 (file)
@@ -125,7 +125,7 @@ static int qdisc_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who,
        if (err < 0)
                goto errout_free;
 
-       return P_ACCEPT;
+       err = P_ACCEPT;
 
 errout_free:
        rtnl_qdisc_put(qdisc);
index 1254b36029c4d6817cb976638560c8c0a852ebe1..2fc25f730f0c43647dff20dead65862c398bb798 100644 (file)
@@ -203,14 +203,15 @@ static int route_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who,
        if (err < 0)
                goto errout;
 
-       return P_ACCEPT;
+       err = P_ACCEPT;
 
-errout_errno:
-       err = nl_get_errno();
 errout:
        rtnl_route_put(route);
        return err;
 
+errout_errno:
+       err = nl_get_errno();
+       goto errout;
 }
 
 static int route_request_update(struct nl_cache *c, struct nl_handle *h)
index 85a431bfedae57a6fb645b0b3f56e6cc5ea58b88..60defd74701229958da2deee0338b138f6025c4a 100644 (file)
@@ -162,7 +162,7 @@ static int rule_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who,
        if (err < 0)
                goto errout;
 
-       return P_ACCEPT;
+       err = P_ACCEPT;
 
 errout:
        rtnl_rule_put(rule);
index 4e24c4536f4dff7ab4062859e3e4e8444d6b258d..dccfbeccb91c30da70a59b765c8b071198e50031 100644 (file)
@@ -159,7 +159,7 @@ static struct nl_handle *__alloc_handle(struct nl_cb *cb)
        handle->h_local.nl_pid = generate_local_port();
        if (handle->h_local.nl_pid == UINT_MAX) {
                nl_handle_destroy(handle);
-               nl_error(ENOBUFS, "Out of sequence numbers");
+               nl_error(ENOBUFS, "Out of local ports");
                return NULL;
        }