]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
parser_json: Fix error reporting for invalid syntax
authorPhil Sutter <phil@nwl.cc>
Wed, 1 Sep 2021 14:41:44 +0000 (16:41 +0200)
committerPhil Sutter <phil@nwl.cc>
Wed, 1 Sep 2021 15:22:17 +0000 (17:22 +0200)
Errors emitted by the JSON parser caused BUG() in erec_print() due to
input descriptor values being bogus.

Due to lack of 'include' support, JSON parser uses a single input
descriptor only and it lived inside the json_ctx object on stack of
nft_parse_json_*() functions.

By the time errors are printed though, that scope is not valid anymore.
Move the static input descriptor object to avoid this.

Fixes: 586ad210368b7 ("libnftables: Implement JSON parser")
Signed-off-by: Phil Sutter <phil@nwl.cc>
src/parser_json.c

index 666aa2fcc9ec34043bd85d3bfc84ce62eea4dabc..3cd21175b2364af79977d02304adaa1bdbfc6b50 100644 (file)
@@ -44,7 +44,6 @@
 #define CTX_F_CONCAT   (1 << 8)        /* inside concat_expr */
 
 struct json_ctx {
-       struct input_descriptor indesc;
        struct nft_ctx *nft;
        struct list_head *msgs;
        struct list_head *cmds;
@@ -107,11 +106,12 @@ static struct stmt *json_parse_stmt(struct json_ctx *ctx, json_t *root);
 /* parsing helpers */
 
 const struct location *int_loc = &internal_location;
+static struct input_descriptor json_indesc;
 
 static void json_lib_error(struct json_ctx *ctx, json_error_t *err)
 {
        struct location loc = {
-               .indesc = &ctx->indesc,
+               .indesc = &json_indesc,
                .line_offset = err->position - err->column,
                .first_line = err->line,
                .last_line = err->line,
@@ -3923,16 +3923,15 @@ int nft_parse_json_buffer(struct nft_ctx *nft, const char *buf,
                          struct list_head *msgs, struct list_head *cmds)
 {
        struct json_ctx ctx = {
-               .indesc = {
-                       .type = INDESC_BUFFER,
-                       .data = buf,
-               },
                .nft = nft,
                .msgs = msgs,
                .cmds = cmds,
        };
        int ret;
 
+       json_indesc.type = INDESC_BUFFER;
+       json_indesc.data = buf;
+
        parser_init(nft, nft->state, msgs, cmds, nft->top_scope);
        nft->json_root = json_loads(buf, 0, NULL);
        if (!nft->json_root)
@@ -3951,10 +3950,6 @@ int nft_parse_json_filename(struct nft_ctx *nft, const char *filename,
                            struct list_head *msgs, struct list_head *cmds)
 {
        struct json_ctx ctx = {
-               .indesc = {
-                       .type = INDESC_FILE,
-                       .name = filename,
-               },
                .nft = nft,
                .msgs = msgs,
                .cmds = cmds,
@@ -3962,6 +3957,9 @@ int nft_parse_json_filename(struct nft_ctx *nft, const char *filename,
        json_error_t err;
        int ret;
 
+       json_indesc.type = INDESC_FILE;
+       json_indesc.name = filename;
+
        parser_init(nft, nft->state, msgs, cmds, nft->top_scope);
        nft->json_root = json_load_file(filename, 0, &err);
        if (!nft->json_root)