]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
scanner: move the file descriptor to be in the input_descriptor structure
authorLaurent Fasnacht <fasnacht@protonmail.ch>
Mon, 10 Feb 2020 10:17:21 +0000 (10:17 +0000)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 10 Feb 2020 23:25:18 +0000 (00:25 +0100)
This prevents a static allocation of file descriptors array, thus allows
more flexibility.

Signed-off-by: Laurent Fasnacht <fasnacht@protonmail.ch>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/nftables.h
src/scanner.l

index 90d331960ef29d25c2e05caeb49d4553f7f7fbe9..07726e4dd5a40883b19b2654a49bbbf289621f2e 100644 (file)
@@ -122,7 +122,6 @@ struct nft_ctx {
        void                    *scanner;
        struct scope            *top_scope;
        void                    *json_root;
-       FILE                    *f[MAX_INCLUDE_DEPTH];
 };
 
 enum nftables_exit_codes {
@@ -176,6 +175,7 @@ enum input_descriptor_types {
  * struct input_descriptor
  *
  * @location:          location, used for include statements
+ * @f:                 file descriptor
  * @type:              input descriptor type
  * @name:              name describing the input
  * @union:             buffer or file descriptor, depending on type
@@ -186,6 +186,7 @@ enum input_descriptor_types {
  */
 struct input_descriptor {
        struct list_head                list;
+       FILE                            *f;
        struct location                 location;
        enum input_descriptor_types     type;
        const char                      *name;
index 20a59de51d1ff73ef07b2cac8cf3f8f023841cce..625bf27caabe7c63a7f25488d2d72d7a308cfb58 100644 (file)
@@ -691,13 +691,14 @@ static void scanner_pop_buffer(yyscan_t scanner)
 }
 
 static void scanner_push_file(struct nft_ctx *nft, void *scanner,
-                             const char *filename, const struct location *loc)
+                             FILE *f, const char *filename,
+                             const struct location *loc)
 {
        struct parser_state *state = yyget_extra(scanner);
        struct input_descriptor *indesc;
        YY_BUFFER_STATE b;
 
-       b = yy_create_buffer(nft->f[state->indesc_idx], YY_BUF_SIZE, scanner);
+       b = yy_create_buffer(f, YY_BUF_SIZE, scanner);
        yypush_buffer_state(b, scanner);
 
        indesc = xzalloc(sizeof(struct input_descriptor));
@@ -706,6 +707,7 @@ static void scanner_push_file(struct nft_ctx *nft, void *scanner,
                indesc->location = *loc;
        indesc->type    = INDESC_FILE;
        indesc->name    = xstrdup(filename);
+       indesc->f       = f;
        init_pos(indesc);
 
        scanner_push_indesc(state, indesc);
@@ -731,8 +733,7 @@ static int include_file(struct nft_ctx *nft, void *scanner,
                             filename, strerror(errno));
                goto err;
        }
-       nft->f[state->indesc_idx] = f;
-       scanner_push_file(nft, scanner, filename, loc);
+       scanner_push_file(nft, scanner, f, filename, loc);
        return 0;
 err:
        erec_queue(erec, state->msgs);
@@ -944,6 +945,10 @@ static void input_descriptor_list_destroy(struct parser_state *state)
        struct input_descriptor *indesc, *next;
 
        list_for_each_entry_safe(indesc, next, &state->indesc_list, list) {
+               if (indesc->f) {
+                       fclose(indesc->f);
+                       indesc->f = NULL;
+               }
                list_del(&indesc->list);
                input_descriptor_destroy(indesc);
        }
@@ -955,11 +960,6 @@ void scanner_destroy(struct nft_ctx *nft)
 
        do {
                yypop_buffer_state(nft->scanner);
-
-               if (nft->f[state->indesc_idx]) {
-                       fclose(nft->f[state->indesc_idx]);
-                       nft->f[state->indesc_idx] = NULL;
-               }
        } while (state->indesc_idx--);
 
        input_descriptor_list_destroy(state);