]> git.ipfire.org Git - thirdparty/libnftnl.git/commitdiff
json: fixed some leaks in the json parsing function
authorÁlvaro Neira Ayuso <alvaroneay@gmail.com>
Wed, 14 Aug 2013 10:19:19 +0000 (12:19 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Sat, 17 Aug 2013 10:49:54 +0000 (12:49 +0200)
This patch fixes some leaks in the json parsing function. After this patch,
we use nft_jansson_free_root. This function uses json_decref and it
decrements the reference count and it releases the node if needed.

Signed-off-by: Alvaro Neira Ayuso <alvaroneay@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/chain.c
src/internal.h
src/jansson.c
src/table.c

index da0299fdde4f72ed9a9dfa36b65c025993955f37..ac6e7ad209c8280ece73ed24b4e79254e6ad3773 100644 (file)
@@ -482,14 +482,18 @@ static inline int nft_str2hooknum(const char *hook)
 static int nft_chain_json_parse(struct nft_chain *c, char *json)
 {
 #ifdef JSON_PARSING
-       json_t *root;
+       json_t *root, *node;
        json_error_t error;
        uint64_t uval64;
        uint32_t policy;
        int32_t val32;
        const char *valstr;
 
-       root = nft_jansson_get_root(json, "chain", &error);
+       node = nft_jansson_create_root(json, &error);
+       if (node == NULL)
+               return -1;
+
+       root = nft_jansson_get_node(node, "chain");
        if (root == NULL)
                return -1;
 
@@ -497,7 +501,7 @@ static int nft_chain_json_parse(struct nft_chain *c, char *json)
        if (valstr == NULL)
                goto err;
 
-       nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_NAME, strdup(valstr));
+       nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_NAME, valstr);
 
        if (nft_jansson_value_parse_val(root, "handle", NFT_TYPE_U64,
                                        &uval64) == -1)
@@ -518,7 +522,7 @@ static int nft_chain_json_parse(struct nft_chain *c, char *json)
        nft_chain_attr_set_u64(c, NFT_CHAIN_ATTR_PACKETS, uval64);
 
        if (nft_jansson_parse_family(root, &val32) != 0)
-               return -1;
+               goto err;
 
        nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_FAMILY, val32);
 
@@ -527,7 +531,7 @@ static int nft_chain_json_parse(struct nft_chain *c, char *json)
        if (valstr == NULL)
                goto err;
 
-       nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_TABLE, strdup(valstr));
+       nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_TABLE, valstr);
 
        if (nft_jansson_node_exist(root, "hooknum")) {
                valstr = nft_jansson_value_parse_str(root, "type");
@@ -535,7 +539,7 @@ static int nft_chain_json_parse(struct nft_chain *c, char *json)
                if (valstr == NULL)
                        goto err;
 
-               nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_TYPE, strdup(valstr));
+               nft_chain_attr_set_str(c, NFT_CHAIN_ATTR_TYPE, valstr);
 
                if (nft_jansson_value_parse_val(root, "prio", NFT_TYPE_S32,
                                                &val32) == -1)
@@ -564,11 +568,11 @@ static int nft_chain_json_parse(struct nft_chain *c, char *json)
                nft_chain_attr_set_u32(c, NFT_CHAIN_ATTR_POLICY, policy);
        }
 
-       xfree(root);
+       nft_jansson_free_root(node);
        return 0;
 
 err:
-       xfree(root);
+       nft_jansson_free_root(node);
        return -1;
 #else
        errno = EOPNOTSUPP;
index 62eb3c5223d988f2e301117e037f9b8bf4e876e6..5ca2288250b8f38225a683b575bdd002e4bd0518 100644 (file)
@@ -48,7 +48,9 @@ int nft_jansson_value_parse_val(json_t *root, const char *tag,
                                  int type, void *out);
 const char *nft_jansson_value_parse_str(json_t *root, const char *tag);
 bool nft_jansson_node_exist(json_t *root, const char *tag);
-json_t *nft_jansson_get_root(char *json, const char *tag, json_error_t *err);
+json_t *nft_jansson_create_root(char *json, json_error_t *err);
+json_t *nft_jansson_get_node(json_t *root, const char *tag);
+void nft_jansson_free_root(json_t *root);
 int nft_jansson_parse_family(json_t *root, void *out);
 #endif
 
index cc3ab23256133b0c638d81d1a6444af0b6a979e0..ca29863eca800a1780c061e2e505bf44bdf70f02 100644 (file)
@@ -72,7 +72,7 @@ bool nft_jansson_node_exist(json_t *root, const char *tag)
        return json_object_get(root, tag) != NULL;
 }
 
-json_t *nft_jansson_get_root(char *json, const char *tag, json_error_t *err)
+json_t *nft_jansson_create_root(char *json, json_error_t *err)
 {
        json_t *root;
 
@@ -82,14 +82,27 @@ json_t *nft_jansson_get_root(char *json, const char *tag, json_error_t *err)
                return NULL;
        }
 
-       root = json_object_get(root, tag);
-       if (root == NULL) {
+       return root;
+}
+
+json_t *nft_jansson_get_node(json_t *root, const char *tag)
+{
+       json_t *node;
+
+       node = json_object_get(root, tag);
+       if (node == NULL) {
                errno = EINVAL;
                return NULL;
        }
 
-       return root;
+       return node;
 }
+
+void nft_jansson_free_root(json_t *root)
+{
+       json_decref(root);
+}
+
 int nft_jansson_parse_family(json_t *root, void *out)
 {
        const char *str;
index 26bf60d7ef3056a02fa05b29b1433200a1b4dadd..b51a3837a293c610b73acb30487db3de0c7d317e 100644 (file)
@@ -269,13 +269,17 @@ err:
 static int nft_table_json_parse(struct nft_table *t, char *json)
 {
 #ifdef JSON_PARSING
-       json_t *root;
+       json_t *root, *node;
        json_error_t error;
        uint32_t table_flag;
        const char *str;
        int family;
 
-       root = nft_jansson_get_root(json, "table", &error);
+       node = nft_jansson_create_root(json, &error);
+       if (node == NULL)
+               return -1;
+
+       root = nft_jansson_get_node(node, "table");
        if (root == NULL)
                return -1;
 
@@ -283,10 +287,10 @@ static int nft_table_json_parse(struct nft_table *t, char *json)
        if (str == NULL)
                goto err;
 
-       nft_table_attr_set_str(t, NFT_TABLE_ATTR_NAME, strdup(str));
+       nft_table_attr_set_str(t, NFT_TABLE_ATTR_NAME, str);
 
        if (nft_jansson_parse_family(root, &family) != 0)
-               return -1;
+               goto err;
 
        nft_table_attr_set_u32(t, NFT_TABLE_ATTR_FAMILY, family);
 
@@ -296,10 +300,10 @@ static int nft_table_json_parse(struct nft_table *t, char *json)
 
        nft_table_attr_set_u32(t, NFT_TABLE_ATTR_FLAGS, table_flag);
 
-       xfree(root);
+       nft_jansson_free_root(node);
        return 0;
 err:
-       xfree(root);
+       nft_jansson_free_root(node);
        return -1;
 #else
        errno = EOPNOTSUPP;