diff options
author | Florian Westphal <fw@strlen.de> | 2023-12-12 13:32:24 +0100 |
---|---|---|
committer | Florian Westphal <fw@strlen.de> | 2023-12-22 14:44:38 +0100 |
commit | 86a496928420046e9d32317f09db050e8351b10e (patch) | |
tree | 1c47cf8302e5a2da2776d740ff5f90af39f182d2 /src/parser_bison.y | |
parent | dcb199544563ded462cb7151134278f82a9e6cfd (diff) |
parser_bison: ensure all timeout policy names are released
We need to add a custom destructor for this structure, it
contains the dynamically allocated names.
a:5:55-55: Error: syntax error, unexpected '}', expecting string
policy = { estabQisheestablished : 2m3s, cd : 2m3s, }
==562373==ERROR: LeakSanitizer: detected memory leaks
Indirect leak of 160 byte(s) in 2 object(s) allocated from:
#1 0x5a565b in xmalloc src/utils.c:31:8
#2 0x5a565b in xzalloc src/utils.c:70:8
#3 0x3d9352 in nft_parse_bison_filename src/libnftables.c:520:8
[..]
Fixes: c7c94802679c ("src: add ct timeout support")
Signed-off-by: Florian Westphal <fw@strlen.de>
Diffstat (limited to 'src/parser_bison.y')
-rw-r--r-- | src/parser_bison.y | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/src/parser_bison.y b/src/parser_bison.y index c948447d..86fb9f07 100644 --- a/src/parser_bison.y +++ b/src/parser_bison.y @@ -173,6 +173,24 @@ static struct expr *ifname_expr_alloc(const struct location *location, return expr; } +static void timeout_state_free(struct timeout_state *s) +{ + free_const(s->timeout_str); + free(s); +} + +static void timeout_states_free(struct list_head *list) +{ + struct timeout_state *ts, *next; + + list_for_each_entry_safe(ts, next, list, head) { + list_del(&ts->head); + timeout_state_free(ts); + } + + free(list); +} + #define YYLLOC_DEFAULT(Current, Rhs, N) location_update(&Current, Rhs, N) #define symbol_value(loc, str) \ @@ -230,6 +248,7 @@ int nft_lex(void *, void *, void *); uint16_t kind; /* must allow > 255 for SACK1, 2.. hack */ uint8_t field; } tcp_kind_field; + struct timeout_state *timeout_state; } %token TOKEN_EOF 0 "end of file" @@ -969,8 +988,11 @@ int nft_lex(void *, void *, void *); %type <val> ct_l4protoname ct_obj_type ct_cmd_type -%type <list> timeout_states timeout_state -%destructor { free($$); } timeout_states timeout_state +%type <timeout_state> timeout_state +%destructor { timeout_state_free($$); } timeout_state + +%type <list> timeout_states +%destructor { timeout_states_free($$); } timeout_states %type <val> xfrm_state_key xfrm_state_proto_key xfrm_dir xfrm_spnum %type <expr> xfrm_expr @@ -4902,11 +4924,11 @@ timeout_states : timeout_state { $$ = xmalloc(sizeof(*$$)); init_list_head($$); - list_add_tail($1, $$); + list_add_tail(&$1->head, $$); } | timeout_states COMMA timeout_state { - list_add_tail($3, $1); + list_add_tail(&$3->head, $1); $$ = $1; } ; @@ -4920,7 +4942,7 @@ timeout_state : STRING COLON time_spec_or_num_s ts->timeout_value = $3; ts->location = @1; init_list_head(&ts->head); - $$ = &ts->head; + $$ = ts; } ; |