]> git.ipfire.org Git - thirdparty/libnftnl.git/commitdiff
utils: Introduce and use nftnl_set_str_attr()
authorPhil Sutter <phil@nwl.cc>
Thu, 7 Mar 2024 13:07:21 +0000 (14:07 +0100)
committerPhil Sutter <phil@nwl.cc>
Wed, 10 Apr 2024 23:27:07 +0000 (01:27 +0200)
The function consolidates the necessary code when assigning to string
pointer attributes, namely:

* Conditional free of the previous value
* Allocation of new value
* Checking for memory allocation errors
* Setting respective flag bit

A new feature previously missing in all call sites is respecting
data_len in case the buffer up to that point did not contain a NUL-char.

Signed-off-by: Phil Sutter <phil@nwl.cc>
src/chain.c
src/flowtable.c
src/object.c
src/rule.c
src/set.c
src/table.c
src/utils.c

index e0b1eaf6d73bca2abd593abcd4456f0bc06f44a8..c7026f486b10467ce9d61c6201de6e4ebd6f42f8 100644 (file)
@@ -217,21 +217,11 @@ int nftnl_chain_set_data(struct nftnl_chain *c, uint16_t attr,
 
        switch(attr) {
        case NFTNL_CHAIN_NAME:
-               if (c->flags & (1 << NFTNL_CHAIN_NAME))
-                       xfree(c->name);
-
-               c->name = strdup(data);
-               if (!c->name)
-                       return -1;
-               break;
+               return nftnl_set_str_attr(&c->name, &c->flags,
+                                         attr, data, data_len);
        case NFTNL_CHAIN_TABLE:
-               if (c->flags & (1 << NFTNL_CHAIN_TABLE))
-                       xfree(c->table);
-
-               c->table = strdup(data);
-               if (!c->table)
-                       return -1;
-               break;
+               return nftnl_set_str_attr(&c->table, &c->flags,
+                                         attr, data, data_len);
        case NFTNL_CHAIN_HOOKNUM:
                memcpy(&c->hooknum, data, sizeof(c->hooknum));
                break;
@@ -257,21 +247,11 @@ int nftnl_chain_set_data(struct nftnl_chain *c, uint16_t attr,
                memcpy(&c->family, data, sizeof(c->family));
                break;
        case NFTNL_CHAIN_TYPE:
-               if (c->flags & (1 << NFTNL_CHAIN_TYPE))
-                       xfree(c->type);
-
-               c->type = strdup(data);
-               if (!c->type)
-                       return -1;
-               break;
+               return nftnl_set_str_attr(&c->type, &c->flags,
+                                         attr, data, data_len);
        case NFTNL_CHAIN_DEV:
-               if (c->flags & (1 << NFTNL_CHAIN_DEV))
-                       xfree(c->dev);
-
-               c->dev = strdup(data);
-               if (!c->dev)
-                       return -1;
-               break;
+               return nftnl_set_str_attr(&c->dev, &c->flags,
+                                         attr, data, data_len);
        case NFTNL_CHAIN_DEVICES:
                dev_array = (const char **)data;
                while (dev_array[len] != NULL)
index 2f37cd4c7f04a659c7e7ec5a2475707bb18bd081..41a1456bb19b2d09673a1490c8206179fae4d6d3 100644 (file)
@@ -119,20 +119,11 @@ int nftnl_flowtable_set_data(struct nftnl_flowtable *c, uint16_t attr,
 
        switch(attr) {
        case NFTNL_FLOWTABLE_NAME:
-               if (c->flags & (1 << NFTNL_FLOWTABLE_NAME))
-                       xfree(c->name);
-
-               c->name = strdup(data);
-               if (!c->name)
-                       return -1;
-               break;
+               return nftnl_set_str_attr(&c->name, &c->flags,
+                                         attr, data, data_len);
        case NFTNL_FLOWTABLE_TABLE:
-               if (c->flags & (1 << NFTNL_FLOWTABLE_TABLE))
-                       xfree(c->table);
-
-               c->table = strdup(data);
-               if (!c->table)
-                       return -1;
+               return nftnl_set_str_attr(&c->table, &c->flags,
+                                         attr, data, data_len);
                break;
        case NFTNL_FLOWTABLE_HOOKNUM:
                memcpy(&c->hooknum, data, sizeof(c->hooknum));
index 2ddaa29cda0bedbe10c612c00515ce6a24f348a2..19cb7d0dbf73d9e0e98178b38fe0ef8c1875ffe1 100644 (file)
@@ -113,17 +113,12 @@ int nftnl_obj_set_data(struct nftnl_obj *obj, uint16_t attr,
 
        switch (attr) {
        case NFTNL_OBJ_TABLE:
-               xfree(obj->table);
-               obj->table = strdup(data);
-               if (!obj->table)
-                       return -1;
+               return nftnl_set_str_attr(&obj->table, &obj->flags,
+                                         attr, data, data_len);
                break;
        case NFTNL_OBJ_NAME:
-               xfree(obj->name);
-               obj->name = strdup(data);
-               if (!obj->name)
-                       return -1;
-               break;
+               return nftnl_set_str_attr(&obj->name, &obj->flags,
+                                         attr, data, data_len);
        case NFTNL_OBJ_TYPE:
                obj->ops = nftnl_obj_ops_lookup(*((uint32_t *)data));
                if (!obj->ops)
index a52012b2177bbc84b41b3afef429cbdd6ca9983e..e16e2c1aa5bf8f30de45a92348b473427d80e922 100644 (file)
@@ -115,21 +115,11 @@ int nftnl_rule_set_data(struct nftnl_rule *r, uint16_t attr,
 
        switch(attr) {
        case NFTNL_RULE_TABLE:
-               if (r->flags & (1 << NFTNL_RULE_TABLE))
-                       xfree(r->table);
-
-               r->table = strdup(data);
-               if (!r->table)
-                       return -1;
-               break;
+               return nftnl_set_str_attr(&r->table, &r->flags,
+                                         attr, data, data_len);
        case NFTNL_RULE_CHAIN:
-               if (r->flags & (1 << NFTNL_RULE_CHAIN))
-                       xfree(r->chain);
-
-               r->chain = strdup(data);
-               if (!r->chain)
-                       return -1;
-               break;
+               return nftnl_set_str_attr(&r->chain, &r->flags,
+                                         attr, data, data_len);
        case NFTNL_RULE_HANDLE:
                memcpy(&r->handle, data, sizeof(r->handle));
                break;
index a732bc032267aa7c76ce2b0c648176ac6a0aca23..07e332dcd67322c11ff8cf8371ec316b44295eb0 100644 (file)
--- a/src/set.c
+++ b/src/set.c
@@ -146,21 +146,11 @@ int nftnl_set_set_data(struct nftnl_set *s, uint16_t attr, const void *data,
 
        switch(attr) {
        case NFTNL_SET_TABLE:
-               if (s->flags & (1 << NFTNL_SET_TABLE))
-                       xfree(s->table);
-
-               s->table = strdup(data);
-               if (!s->table)
-                       return -1;
-               break;
+               return nftnl_set_str_attr(&s->table, &s->flags,
+                                         attr, data, data_len);
        case NFTNL_SET_NAME:
-               if (s->flags & (1 << NFTNL_SET_NAME))
-                       xfree(s->name);
-
-               s->name = strdup(data);
-               if (!s->name)
-                       return -1;
-               break;
+               return nftnl_set_str_attr(&s->name, &s->flags,
+                                         attr, data, data_len);
        case NFTNL_SET_HANDLE:
                memcpy(&s->handle, data, sizeof(s->handle));
                break;
index 4f48e8c9e73e10e73433887cf404b07df8c8b917..13f01cfbf1e6f82e077696342de99a5c2fb8963c 100644 (file)
@@ -101,13 +101,8 @@ int nftnl_table_set_data(struct nftnl_table *t, uint16_t attr,
 
        switch (attr) {
        case NFTNL_TABLE_NAME:
-               if (t->flags & (1 << NFTNL_TABLE_NAME))
-                       xfree(t->name);
-
-               t->name = strdup(data);
-               if (!t->name)
-                       return -1;
-               break;
+               return nftnl_set_str_attr(&t->name, &t->flags,
+                                         attr, data, data_len);
        case NFTNL_TABLE_HANDLE:
                memcpy(&t->handle, data, sizeof(t->handle));
                break;
index ffbad89a0dade37dd8546e2747169f4193661d7b..2f1ffd62275834c8fcf07ac575f01725398d9295 100644 (file)
@@ -136,3 +136,17 @@ void __noreturn __abi_breakage(const char *file, int line, const char *reason)
                       "%s:%d reason: %s\n", file, line, reason);
        exit(EXIT_FAILURE);
 }
+
+int nftnl_set_str_attr(const char **dptr, uint32_t *flags,
+                      uint16_t attr, const void *data, uint32_t data_len)
+{
+       if (*flags & (1 << attr))
+               xfree(*dptr);
+
+       *dptr = strndup(data, data_len);
+       if (!*dptr)
+               return -1;
+
+       *flags |= (1 << attr);
+       return 0;
+}