]> git.ipfire.org Git - thirdparty/libnftnl.git/commitdiff
flowtable: device array dynamic allocation
authorPablo Neira Ayuso <pablo@netfilter.org>
Tue, 15 Oct 2019 12:08:52 +0000 (14:08 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 28 Oct 2019 10:02:41 +0000 (11:02 +0100)
Remove artificial upper limit of 8 devices per flowtable.

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

index 1f7ba3052d4fc822a10819a8f653f34f791baa9d..020f102896442774202e904747ddde4dc2af47d6 100644 (file)
@@ -358,30 +358,33 @@ static int nftnl_flowtable_parse_hook_cb(const struct nlattr *attr, void *data)
 static int nftnl_flowtable_parse_devs(struct nlattr *nest,
                                      struct nftnl_flowtable *c)
 {
+       const char **dev_array;
+       int len = 0, size = 8;
        struct nlattr *attr;
-       char *dev_array[8];
-       int len = 0, i;
+
+       dev_array = calloc(8, sizeof(char *));
+       if (!dev_array)
+               return -1;
 
        mnl_attr_for_each_nested(attr, nest) {
                if (mnl_attr_get_type(attr) != NFTA_DEVICE_NAME)
                        goto err;
                dev_array[len++] = strdup(mnl_attr_get_str(attr));
-               if (len >= 8)
-                       break;
+               if (len >= size) {
+                       dev_array = realloc(dev_array,
+                                           size * 2 * sizeof(char *));
+                       if (!dev_array)
+                               goto err;
+
+                       size *= 2;
+                       memset(&dev_array[len], 0,
+                              (size - len) * sizeof(char *));
+               }
        }
 
-       if (!len)
-               return -1;
-
-       c->dev_array = calloc(len + 1, sizeof(char *));
-       if (!c->dev_array)
-               goto err;
-
+       c->dev_array = dev_array;
        c->dev_array_len = len;
 
-       for (i = 0; i < len; i++)
-               c->dev_array[i] = dev_array[i];
-
        return 0;
 err:
        while (len--)