This prevents a static allocation of file descriptors array, thus allows more flexibility. Signed-off-by: Laurent Fasnacht <fasnacht@xxxxxxxxxxxxx> --- include/nftables.h | 3 ++- src/scanner.l | 17 ++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/include/nftables.h b/include/nftables.h index 90d33196..ca0fbcaf 100644 --- a/include/nftables.h +++ b/include/nftables.h @@ -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; diff --git a/src/scanner.l b/src/scanner.l index 99ee8355..2016acd5 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -691,13 +691,13 @@ 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 +706,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 +732,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 +944,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 +959,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); -- 2.20.1