]> git.ipfire.org Git - thirdparty/libnftnl.git/commitdiff
chain: dynamically allocate name
authorPablo Neira Ayuso <pablo@netfilter.org>
Fri, 10 Jun 2016 12:34:10 +0000 (14:34 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Wed, 15 Jun 2016 11:44:59 +0000 (13:44 +0200)
Just in case we ever support chain with larger names in the future,
this will ensure the library doesn't break. Although I don't expect
allocating more bytes for this anytime soon, but let's be conservative
here.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/chain.c

index 8cb3cf8a07dd611eadce659cabafab1d39d6a20f..f55dfa14eb0d59de438c02b864884ec83fced079 100644 (file)
@@ -32,7 +32,7 @@
 struct nftnl_chain {
        struct list_head head;
 
-       char            name[NFT_CHAIN_MAXNAMELEN];
+       const char      *name;
        const char      *type;
        const char      *table;
        const char      *dev;
@@ -95,13 +95,14 @@ EXPORT_SYMBOL_ALIAS(nftnl_chain_alloc, nft_chain_alloc);
 
 void nftnl_chain_free(const struct nftnl_chain *c)
 {
+       if (c->flags & (1 << NFTNL_CHAIN_NAME))
+               xfree(c->name);
        if (c->flags & (1 << NFTNL_CHAIN_TABLE))
                xfree(c->table);
        if (c->flags & (1 << NFTNL_CHAIN_TYPE))
                xfree(c->type);
        if (c->flags & (1 << NFTNL_CHAIN_DEV))
                xfree(c->dev);
-
        xfree(c);
 }
 EXPORT_SYMBOL_ALIAS(nftnl_chain_free, nft_chain_free);
@@ -118,6 +119,9 @@ void nftnl_chain_unset(struct nftnl_chain *c, uint16_t attr)
                return;
 
        switch (attr) {
+       case NFTNL_CHAIN_NAME:
+               xfree(c->name);
+               break;
        case NFTNL_CHAIN_TABLE:
                xfree(c->table);
                break;
@@ -126,7 +130,6 @@ void nftnl_chain_unset(struct nftnl_chain *c, uint16_t attr)
        case NFTNL_CHAIN_TYPE:
                xfree(c->type);
                break;
-       case NFTNL_CHAIN_NAME:
        case NFTNL_CHAIN_HOOKNUM:
        case NFTNL_CHAIN_PRIO:
        case NFTNL_CHAIN_POLICY:
@@ -164,7 +167,12 @@ int nftnl_chain_set_data(struct nftnl_chain *c, uint16_t attr,
 
        switch(attr) {
        case NFTNL_CHAIN_NAME:
-               strncpy(c->name, data, NFT_CHAIN_MAXNAMELEN);
+               if (c->flags & (1 << NFTNL_CHAIN_NAME))
+                       xfree(c->name);
+
+               c->name = strdup(data);
+               if (!c->name)
+                       return -1;
                break;
        case NFTNL_CHAIN_TABLE:
                if (c->flags & (1 << NFTNL_CHAIN_TABLE))
@@ -528,8 +536,11 @@ int nftnl_chain_nlmsg_parse(const struct nlmsghdr *nlh, struct nftnl_chain *c)
                return -1;
 
        if (tb[NFTA_CHAIN_NAME]) {
-               strncpy(c->name, mnl_attr_get_str(tb[NFTA_CHAIN_NAME]),
-                       NFT_CHAIN_MAXNAMELEN);
+               if (c->flags & (1 << NFTNL_CHAIN_NAME))
+                       xfree(c->name);
+               c->name = strdup(mnl_attr_get_str(tb[NFTA_CHAIN_NAME]));
+               if (!c->name)
+                       return -1;
                c->flags |= (1 << NFTNL_CHAIN_NAME);
        }
        if (tb[NFTA_CHAIN_TABLE]) {