]> git.ipfire.org Git - thirdparty/libnftnl.git/commitdiff
set_elem: Fix printing of verdict map elements
authorPhil Sutter <phil@nwl.cc>
Sat, 26 Dec 2020 18:44:48 +0000 (19:44 +0100)
committerPhil Sutter <phil@nwl.cc>
Tue, 9 Mar 2021 15:24:46 +0000 (16:24 +0100)
Elements' data was printed as type DATA_VALUE no matter the actual type.
For verdicts, this meant no printing at all (because reg->len is either
zero or garbage).

To fix this, nftnl_set_elem_snprintf_default() needs type info held in
struct nftnl_set. Pass it via parameter to that function, make it
non-static and call it from nftnl_set_snprintf_default() instead of the
generic nftnl_set_elem_snprintf(). This way no changes have to be done
to exported functions, also the output type is already defined when
nftnl_set_snprintf_default() runs so checking type value again is
pointless.

Signed-off-by: Phil Sutter <phil@nwl.cc>
include/set_elem.h
src/set.c
src/set_elem.c

index 9239557469feb6fc0afbdc32fa69f1ffb1df2cb8..503dcede2c0d212dec54e43570755c2ae020bfcd 100644 (file)
@@ -20,4 +20,8 @@ struct nftnl_set_elem {
        } user;
 };
 
+int nftnl_set_elem_snprintf_default(char *buf, size_t size,
+                                   const struct nftnl_set_elem *e,
+                                   enum nft_data_types dtype);
+
 #endif
index 8c5025d16206b7b67eea62df5c69eabc662bc853..a21df1fa50f414e6ddad444a0b8844d67e29c5a1 100644 (file)
--- a/src/set.c
+++ b/src/set.c
@@ -829,8 +829,8 @@ static int nftnl_set_snprintf_default(char *buf, size_t size,
                ret = snprintf(buf + offset, remain, "\t");
                SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
-               ret = nftnl_set_elem_snprintf(buf + offset, remain, elem, type,
-                                             flags);
+               ret = nftnl_set_elem_snprintf_default(buf + offset, remain,
+                                                     elem, s->data_type);
                SNPRINTF_BUFFER_SIZE(ret, remain, offset);
        }
 
index 8f634e756a1b90eed97554c360d02fc66d4d1fdf..ad528e28475a783982af924798f1f4fdde0c91aa 100644 (file)
@@ -698,9 +698,12 @@ int nftnl_set_elem_parse_file(struct nftnl_set_elem *e, enum nftnl_parse_type ty
        return -1;
 }
 
-static int nftnl_set_elem_snprintf_default(char *buf, size_t size,
-                                          const struct nftnl_set_elem *e)
+int nftnl_set_elem_snprintf_default(char *buf, size_t size,
+                                   const struct nftnl_set_elem *e,
+                                   enum nft_data_types dtype)
 {
+       int dregtype = (dtype == NFT_DATA_VERDICT) ? DATA_VERDICT : DATA_VALUE;
+
        int ret, remain = size, offset = 0, i;
 
        ret = snprintf(buf, remain, "element ");
@@ -726,7 +729,7 @@ static int nftnl_set_elem_snprintf_default(char *buf, size_t size,
 
        ret = nftnl_data_reg_snprintf(buf + offset, remain, &e->data,
                                      NFTNL_OUTPUT_DEFAULT,
-                                     DATA_F_NOPFX, DATA_VALUE);
+                                     DATA_F_NOPFX, dregtype);
        SNPRINTF_BUFFER_SIZE(ret, remain, offset);
 
        ret = snprintf(buf + offset, remain, "%u [end]", e->set_elem_flags);
@@ -760,7 +763,8 @@ static int nftnl_set_elem_cmd_snprintf(char *buf, size_t size,
 
        switch(type) {
        case NFTNL_OUTPUT_DEFAULT:
-               ret = nftnl_set_elem_snprintf_default(buf + offset, remain, e);
+               ret = nftnl_set_elem_snprintf_default(buf + offset, remain, e,
+                                                     NFT_DATA_VALUE);
                SNPRINTF_BUFFER_SIZE(ret, remain, offset);
                break;
        case NFTNL_OUTPUT_XML: