Remove artificial upper limit of 8 devices per flowtable.

Signed-off-by: Pablo Neira Ayuso <pa...@netfilter.org>
---
 src/flowtable.c | 29 +++++++++++++++--------------
 1 file changed, 15 insertions(+), 14 deletions(-)

diff --git a/src/flowtable.c b/src/flowtable.c
index 1f7ba3052d4f..54e1bea25775 100644
--- a/src/flowtable.c
+++ b/src/flowtable.c
@@ -358,30 +358,31 @@ 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);
+                       if (!dev_array)
+                               goto err;
 
-       if (!len)
-               return -1;
-
-       c->dev_array = calloc(len + 1, sizeof(char *));
-       if (!c->dev_array)
-               goto err;
+                       size *= 2;
+                       memset(&dev_array[len], 0, size - len);
+               }
+       }
 
+       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--)
-- 
2.11.0

Reply via email to