]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
xt: Fall back to generic printing from translation
authorPhil Sutter <phil@nwl.cc>
Thu, 24 Nov 2022 15:16:41 +0000 (16:16 +0100)
committerPhil Sutter <phil@nwl.cc>
Tue, 13 Dec 2022 13:59:55 +0000 (14:59 +0100)
If translation is not available or fails, print the generic format
instead of calling the print callback (which does not respect
output_fp) or silently failing.

Signed-off-by: Phil Sutter <phil@nwl.cc>
src/xt.c

index 12b52aa33bc300550b3ee0a9af8719d98f75ea34..b75c94e856ca74ea38b67e47f18b3b1c525d9777 100644 (file)
--- a/src/xt.c
+++ b/src/xt.c
@@ -34,6 +34,12 @@ static void *xt_entry_alloc(const struct xt_stmt *xt, uint32_t af);
 
 void xt_stmt_xlate(const struct stmt *stmt, struct output_ctx *octx)
 {
+       static const char *typename[NFT_XT_MAX] = {
+               [NFT_XT_MATCH]          = "match",
+               [NFT_XT_TARGET]         = "target",
+               [NFT_XT_WATCHER]        = "watcher",
+       };
+       int rc = 0;
 #ifdef HAVE_LIBXTABLES
        struct xt_xlate *xl = xt_xlate_alloc(10240);
        struct xtables_target *tg;
@@ -69,11 +75,7 @@ void xt_stmt_xlate(const struct stmt *stmt, struct output_ctx *octx)
                                .numeric        = 1,
                        };
 
-                       mt->xlate(xl, &params);
-                       nft_print(octx, "%s", xt_xlate_get(xl));
-               } else if (mt->print) {
-                       printf("#");
-                       mt->print(&entry, m, 0);
+                       rc = mt->xlate(xl, &params);
                }
                xfree(m);
                break;
@@ -102,27 +104,20 @@ void xt_stmt_xlate(const struct stmt *stmt, struct output_ctx *octx)
                                .numeric        = 1,
                        };
 
-                       tg->xlate(xl, &params);
-                       nft_print(octx, "%s", xt_xlate_get(xl));
-               } else if (tg->print) {
-                       printf("#");
-                       tg->print(NULL, t, 0);
+                       rc = tg->xlate(xl, &params);
                }
                xfree(t);
                break;
        }
 
+       if (rc == 1)
+               nft_print(octx, "%s", xt_xlate_get(xl));
        xt_xlate_free(xl);
        xfree(entry);
-#else
-       static const char *typename[NFT_XT_MAX] = {
-               [NFT_XT_MATCH]          = "match",
-               [NFT_XT_TARGET]         = "target",
-               [NFT_XT_WATCHER]        = "watcher",
-       };
-
-       nft_print(octx, "xt %s %s", typename[stmt->xt.type], stmt->xt.name);
 #endif
+       if (!rc)
+               nft_print(octx, "xt %s %s",
+                         typename[stmt->xt.type], stmt->xt.name);
 }
 
 void xt_stmt_destroy(struct stmt *stmt)