All of lore.kernel.org
 help / color / mirror / Atom feed
From: Thomas Haller <thaller@redhat.com>
To: NetFilter <netfilter-devel@vger.kernel.org>
Cc: Thomas Haller <thaller@redhat.com>
Subject: [PATCH nft 1/3] parser: don't mark "string" as const
Date: Thu,  9 Nov 2023 19:59:47 +0100	[thread overview]
Message-ID: <20231109190032.669575-1-thaller@redhat.com> (raw)

The "string" field is allocated, and the bison actions are expected to
take/free them. It's not const, and it should not be freed with free_const().

Signed-off-by: Thomas Haller <thaller@redhat.com>
---
 src/parser_bison.y | 148 ++++++++++++++++++++++-----------------------
 1 file changed, 74 insertions(+), 74 deletions(-)

diff --git a/src/parser_bison.y b/src/parser_bison.y
index 1e8169c44f62..ca0851c915d2 100644
--- a/src/parser_bison.y
+++ b/src/parser_bison.y
@@ -148,19 +148,19 @@ static bool already_set(const void *attr, const struct location *loc,
 
 static struct expr *ifname_expr_alloc(const struct location *location,
 				      struct list_head *queue,
-				      const char *name)
+				      char *name)
 {
 	unsigned int length = strlen(name);
 	struct expr *expr;
 
 	if (length == 0) {
-		free_const(name);
+		free(name);
 		erec_queue(error(location, "empty interface name"), queue);
 		return NULL;
 	}
 
 	if (length >= IFNAMSIZ) {
-		free_const(name);
+		free(name);
 		erec_queue(error(location, "interface name too long"), queue);
 		return NULL;
 	}
@@ -168,7 +168,7 @@ static struct expr *ifname_expr_alloc(const struct location *location,
 	expr = constant_expr_alloc(location, &ifname_type, BYTEORDER_HOST_ENDIAN,
 				   length * BITS_PER_BYTE, name);
 
-	free_const(name);
+	free(name);
 
 	return expr;
 }
@@ -207,7 +207,7 @@ int nft_lex(void *, void *, void *);
 	uint64_t		val;
 	uint32_t		val32;
 	uint8_t			val8;
-	const char *		string;
+	char *			string;
 
 	struct list_head	*list;
 	struct cmd		*cmd;
@@ -358,7 +358,7 @@ int nft_lex(void *, void *, void *);
 %token <string> STRING		"string"
 %token <string> QUOTED_STRING	"quoted string"
 %token <string> ASTERISK_STRING	"string with a trailing asterisk"
-%destructor { free_const($$); }	STRING QUOTED_STRING ASTERISK_STRING
+%destructor { free($$); }	STRING QUOTED_STRING ASTERISK_STRING
 
 %token LL_HDR			"ll"
 %token NETWORK_HDR		"nh"
@@ -674,7 +674,7 @@ int nft_lex(void *, void *, void *);
 %type <limit_rate>		limit_rate_bytes
 
 %type <string>			identifier type_identifier string comment_spec
-%destructor { free_const($$); }	identifier type_identifier string comment_spec
+%destructor { free($$); }	identifier type_identifier string comment_spec
 
 %type <val>			time_spec time_spec_or_num_s quota_used
 
@@ -709,7 +709,7 @@ int nft_lex(void *, void *, void *);
 %type <val32>			int_num	chain_policy
 %type <prio_spec>		extended_prio_spec prio_spec
 %type <string>			extended_prio_name quota_unit	basehook_device_name
-%destructor { free_const($$); }	extended_prio_name quota_unit	basehook_device_name
+%destructor { free($$); }	extended_prio_name quota_unit	basehook_device_name
 
 %type <expr>			dev_spec
 %destructor { free($$); }	dev_spec
@@ -928,7 +928,7 @@ int nft_lex(void *, void *, void *);
 
 %type <val>			markup_format
 %type <string>			monitor_event
-%destructor { free_const($$); }	monitor_event
+%destructor { free($$); }	monitor_event
 %type <val>			monitor_object	monitor_format
 
 %type <val>			synproxy_ts	synproxy_sack
@@ -1053,10 +1053,10 @@ close_scope_xt		: { scanner_pop_start_cond(nft->scanner, PARSER_SC_XT); }
 common_block		:	INCLUDE		QUOTED_STRING	stmt_separator
 			{
 				if (scanner_include_file(nft, scanner, $2, &@$) < 0) {
-					free_const($2);
+					free($2);
 					YYERROR;
 				}
-				free_const($2);
+				free($2);
 			}
 			|	DEFINE		identifier	'='	initializer_expr	stmt_separator
 			{
@@ -1066,19 +1066,19 @@ common_block		:	INCLUDE		QUOTED_STRING	stmt_separator
 					erec_queue(error(&@2, "redefinition of symbol '%s'", $2),
 						   state->msgs);
 					expr_free($4);
-					free_const($2);
+					free($2);
 					YYERROR;
 				}
 
 				symbol_bind(scope, $2, $4);
-				free_const($2);
+				free($2);
 			}
 			|	REDEFINE	identifier	'='	initializer_expr	stmt_separator
 			{
 				struct scope *scope = current_scope(state);
 
 				symbol_bind(scope, $2, $4);
-				free_const($2);
+				free($2);
 			}
 			|	UNDEFINE	identifier	stmt_separator
 			{
@@ -1087,10 +1087,10 @@ common_block		:	INCLUDE		QUOTED_STRING	stmt_separator
 				if (symbol_unbind(scope, $2) < 0) {
 					erec_queue(error(&@2, "undefined symbol '%s'", $2),
 						   state->msgs);
-					free_const($2);
+					free($2);
 					YYERROR;
 				}
-				free_const($2);
+				free($2);
 			}
 			|	error		stmt_separator
 			{
@@ -1879,21 +1879,21 @@ table_options		:	FLAGS		STRING
 			{
 				if (strcmp($2, "dormant") == 0) {
 					$<table>0->flags |= TABLE_F_DORMANT;
-					free_const($2);
+					free($2);
 				} else if (strcmp($2, "owner") == 0) {
 					$<table>0->flags |= TABLE_F_OWNER;
-					free_const($2);
+					free($2);
 				} else {
 					erec_queue(error(&@2, "unknown table option %s", $2),
 						   state->msgs);
-					free_const($2);
+					free($2);
 					YYERROR;
 				}
 			}
 			|	comment_spec
 			{
 				if (already_set($<table>0->comment, &@$, state)) {
-					free_const($1);
+					free($1);
 					YYERROR;
 				}
 				$<table>0->comment = $1;
@@ -2064,7 +2064,7 @@ chain_block		:	/* empty */	{ $$ = $<chain>-1; }
 			|	chain_block	comment_spec	stmt_separator
 			{
 				if (already_set($1->comment, &@2, state)) {
-					free_const($2);
+					free($2);
 					YYERROR;
 				}
 				$1->comment = $2;
@@ -2190,7 +2190,7 @@ set_block		:	/* empty */	{ $$ = $<set>-1; }
 			|	set_block	comment_spec	stmt_separator
 			{
 				if (already_set($1->comment, &@2, state)) {
-					free_const($2);
+					free($2);
 					YYERROR;
 				}
 				$1->comment = $2;
@@ -2307,7 +2307,7 @@ map_block		:	/* empty */	{ $$ = $<set>-1; }
 			|	map_block	comment_spec	stmt_separator
 			{
 				if (already_set($1->comment, &@2, state)) {
-					free_const($2);
+					free($2);
 					YYERROR;
 				}
 				$1->comment = $2;
@@ -2346,10 +2346,10 @@ flowtable_block		:	/* empty */	{ $$ = $<flowtable>-1; }
 				if ($$->hook.name == NULL) {
 					erec_queue(error(&@3, "unknown chain hook"),
 						   state->msgs);
-					free_const($3);
+					free($3);
 					YYERROR;
 				}
-				free_const($3);
+				free($3);
 
 				$$->priority = $4;
 			}
@@ -2423,12 +2423,12 @@ data_type_atom_expr	:	type_identifier
 				if (dtype == NULL) {
 					erec_queue(error(&@1, "unknown datatype %s", $1),
 						   state->msgs);
-					free_const($1);
+					free($1);
 					YYERROR;
 				}
 				$$ = constant_expr_alloc(&@1, dtype, dtype->byteorder,
 							 dtype->size, NULL);
-				free_const($1);
+				free($1);
 			}
 			|	TIME
 			{
@@ -2465,7 +2465,7 @@ counter_block		:	/* empty */	{ $$ = $<obj>-1; }
 			|	counter_block	  comment_spec
 			{
 				if (already_set($<obj>1->comment, &@2, state)) {
-					free_const($2);
+					free($2);
 					YYERROR;
 				}
 				$<obj>1->comment = $2;
@@ -2482,7 +2482,7 @@ quota_block		:	/* empty */	{ $$ = $<obj>-1; }
 			|	quota_block	comment_spec
 			{
 				if (already_set($<obj>1->comment, &@2, state)) {
-					free_const($2);
+					free($2);
 					YYERROR;
 				}
 				$<obj>1->comment = $2;
@@ -2499,7 +2499,7 @@ ct_helper_block		:	/* empty */	{ $$ = $<obj>-1; }
 			|       ct_helper_block     comment_spec
 			{
 				if (already_set($<obj>1->comment, &@2, state)) {
-					free_const($2);
+					free($2);
 					YYERROR;
 				}
 				$<obj>1->comment = $2;
@@ -2520,7 +2520,7 @@ ct_timeout_block	:	/*empty */
 			|       ct_timeout_block     comment_spec
 			{
 				if (already_set($<obj>1->comment, &@2, state)) {
-					free_const($2);
+					free($2);
 					YYERROR;
 				}
 				$<obj>1->comment = $2;
@@ -2537,7 +2537,7 @@ ct_expect_block		:	/*empty */	{ $$ = $<obj>-1; }
 			|       ct_expect_block     comment_spec
 			{
 				if (already_set($<obj>1->comment, &@2, state)) {
-					free_const($2);
+					free($2);
 					YYERROR;
 				}
 				$<obj>1->comment = $2;
@@ -2554,7 +2554,7 @@ limit_block		:	/* empty */	{ $$ = $<obj>-1; }
 			|       limit_block     comment_spec
 			{
 				if (already_set($<obj>1->comment, &@2, state)) {
-					free_const($2);
+					free($2);
 					YYERROR;
 				}
 				$<obj>1->comment = $2;
@@ -2571,7 +2571,7 @@ secmark_block		:	/* empty */	{ $$ = $<obj>-1; }
 			|       secmark_block     comment_spec
 			{
 				if (already_set($<obj>1->comment, &@2, state)) {
-					free_const($2);
+					free($2);
 					YYERROR;
 				}
 				$<obj>1->comment = $2;
@@ -2588,7 +2588,7 @@ synproxy_block		:	/* empty */	{ $$ = $<obj>-1; }
 			|       synproxy_block     comment_spec
 			{
 				if (already_set($<obj>1->comment, &@2, state)) {
-					free_const($2);
+					free($2);
 					YYERROR;
 				}
 				$<obj>1->comment = $2;
@@ -2609,12 +2609,12 @@ hook_spec		:	TYPE		close_scope_type	STRING		HOOK		STRING		dev_spec	prio_spec
 				if (chain_type == NULL) {
 					erec_queue(error(&@3, "unknown chain type"),
 						   state->msgs);
-					free_const($3);
+					free($3);
 					YYERROR;
 				}
 				$<chain>0->type.loc = @3;
 				$<chain>0->type.str = xstrdup(chain_type);
-				free_const($3);
+				free($3);
 
 				$<chain>0->loc = @$;
 				$<chain>0->hook.loc = @5;
@@ -2622,10 +2622,10 @@ hook_spec		:	TYPE		close_scope_type	STRING		HOOK		STRING		dev_spec	prio_spec
 				if ($<chain>0->hook.name == NULL) {
 					erec_queue(error(&@5, "unknown chain hook"),
 						   state->msgs);
-					free_const($5);
+					free($5);
 					YYERROR;
 				}
-				free_const($5);
+				free($5);
 
 				$<chain>0->dev_expr	= $6;
 				$<chain>0->priority	= $7;
@@ -2672,7 +2672,7 @@ extended_prio_spec	:	int_num
 								BYTEORDER_HOST_ENDIAN,
 								strlen($1) * BITS_PER_BYTE,
 								$1);
-				free_const($1);
+				free($1);
 				$$ = spec;
 			}
 			|	extended_prio_name PLUS NUM
@@ -2685,7 +2685,7 @@ extended_prio_spec	:	int_num
 								BYTEORDER_HOST_ENDIAN,
 								strlen(str) * BITS_PER_BYTE,
 								str);
-				free_const($1);
+				free($1);
 				$$ = spec;
 			}
 			|	extended_prio_name DASH NUM
@@ -2698,7 +2698,7 @@ extended_prio_spec	:	int_num
 								BYTEORDER_HOST_ENDIAN,
 								strlen(str) * BITS_PER_BYTE,
 								str);
-				free_const($1);
+				free($1);
 				$$ = spec;
 			}
 			;
@@ -2783,7 +2783,7 @@ time_spec		:	STRING
 				uint64_t res;
 
 				erec = time_parse(&@1, $1, &res);
-				free_const($1);
+				free($1);
 				if (erec != NULL) {
 					erec_queue(erec, state->msgs);
 					YYERROR;
@@ -2984,7 +2984,7 @@ comment_spec		:	COMMENT		string
 					erec_queue(error(&@2, "comment too long, %d characters maximum allowed",
 							 NFTNL_UDATA_COMMENT_MAXLEN),
 						   state->msgs);
-					free_const($2);
+					free($2);
 					YYERROR;
 				}
 				$$ = $2;
@@ -3085,8 +3085,8 @@ stmt			:	verdict_stmt
 xt_stmt			:	XT	STRING	string
 			{
 				$$ = NULL;
-				free_const($2);
-				free_const($3);
+				free($2);
+				free($3);
 				erec_queue(error(&@$, "unsupported xtables compat expression, use iptables-nft with this ruleset"),
 					   state->msgs);
 				YYERROR;
@@ -3244,7 +3244,7 @@ log_arg			:	PREFIX			string
 					expr = constant_expr_alloc(&@$, &string_type,
 								   BYTEORDER_HOST_ENDIAN,
 								   (strlen($2) + 1) * BITS_PER_BYTE, $2);
-					free_const($2);
+					free($2);
 					$<stmt>0->log.prefix = expr;
 					$<stmt>0->log.flags |= STMT_LOG_PREFIX;
 					break;
@@ -3318,7 +3318,7 @@ log_arg			:	PREFIX			string
 									   state->msgs);
 							}
 							expr_free(expr);
-							free_const($2);
+							free($2);
 							YYERROR;
 						}
 						item = variable_expr_alloc(&@$, scope, sym);
@@ -3348,7 +3348,7 @@ log_arg			:	PREFIX			string
 					}
 				}
 
-				free_const($2);
+				free($2);
 				$<stmt>0->log.prefix	 = expr;
 				$<stmt>0->log.flags 	|= STMT_LOG_PREFIX;
 			}
@@ -3401,10 +3401,10 @@ level_type		:	string
 				else {
 					erec_queue(error(&@1, "invalid log level"),
 						   state->msgs);
-					free_const($1);
+					free($1);
 					YYERROR;
 				}
-				free_const($1);
+				free($1);
 			}
 			;
 
@@ -3494,7 +3494,7 @@ quota_used		:	/* empty */	{ $$ = 0; }
 				uint64_t rate;
 
 				erec = data_unit_parse(&@$, $3, &rate);
-				free_const($3);
+				free($3);
 				if (erec != NULL) {
 					erec_queue(erec, state->msgs);
 					YYERROR;
@@ -3509,7 +3509,7 @@ quota_stmt		:	QUOTA	quota_mode NUM quota_unit quota_used	close_scope_quota
 				uint64_t rate;
 
 				erec = data_unit_parse(&@$, $4, &rate);
-				free_const($4);
+				free($4);
 				if (erec != NULL) {
 					erec_queue(erec, state->msgs);
 					YYERROR;
@@ -3553,7 +3553,7 @@ limit_rate_bytes	:	NUM     STRING
 				uint64_t rate, unit;
 
 				erec = rate_parse(&@$, $2, &rate, &unit);
-				free_const($2);
+				free($2);
 				if (erec != NULL) {
 					erec_queue(erec, state->msgs);
 					YYERROR;
@@ -3575,7 +3575,7 @@ limit_bytes		:	NUM	BYTES		{ $$ = $1; }
 				uint64_t rate;
 
 				erec = data_unit_parse(&@$, $2, &rate);
-				free_const($2);
+				free($2);
 				if (erec != NULL) {
 					erec_queue(erec, state->msgs);
 					YYERROR;
@@ -3604,7 +3604,7 @@ reject_with_expr	:	STRING
 			{
 				$$ = symbol_expr_alloc(&@$, SYMBOL_VALUE,
 						       current_scope(state), $1);
-				free_const($1);
+				free($1);
 			}
 			|	integer_expr	{ $$ = $1; }
 			;
@@ -4268,12 +4268,12 @@ variable_expr		:	'$'	identifier
 						erec_queue(error(&@2, "unknown identifier '%s'", $2),
 							   state->msgs);
 					}
-					free_const($2);
+					free($2);
 					YYERROR;
 				}
 
 				$$ = variable_expr_alloc(&@$, scope, sym);
-				free_const($2);
+				free($2);
 			}
 			;
 
@@ -4283,7 +4283,7 @@ symbol_expr		:	variable_expr
 				$$ = symbol_expr_alloc(&@$, SYMBOL_VALUE,
 						       current_scope(state),
 						       $1);
-				free_const($1);
+				free($1);
 			}
 			;
 
@@ -4296,7 +4296,7 @@ set_ref_symbol_expr	:	AT	identifier	close_scope_at
 				$$ = symbol_expr_alloc(&@$, SYMBOL_SET,
 						       current_scope(state),
 						       $2);
-				free_const($2);
+				free($2);
 			}
 			;
 
@@ -4393,10 +4393,10 @@ osf_ttl			:	/* empty */
 				else {
 					erec_queue(error(&@2, "invalid ttl option"),
 						   state->msgs);
-					free_const($2);
+					free($2);
 					YYERROR;
 				}
-				free_const($2);
+				free($2);
 			}
 			;
 
@@ -4566,7 +4566,7 @@ set_elem_option		:	TIMEOUT			time_spec
 			|	comment_spec
 			{
 				if (already_set($<expr>0->comment, &@1, state)) {
-					free_const($1);
+					free($1);
 					YYERROR;
 				}
 				$<expr>0->comment = $1;
@@ -4648,7 +4648,7 @@ set_elem_stmt		:	COUNTER	close_scope_counter
 				uint64_t rate;
 
 				erec = data_unit_parse(&@$, $4, &rate);
-				free_const($4);
+				free($4);
 				if (erec != NULL) {
 					erec_queue(erec, state->msgs);
 					YYERROR;
@@ -4681,7 +4681,7 @@ set_elem_expr_option	:	TIMEOUT			time_spec
 			|	comment_spec
 			{
 				if (already_set($<expr>0->comment, &@1, state)) {
-					free_const($1);
+					free($1);
 					YYERROR;
 				}
 				$<expr>0->comment = $1;
@@ -4733,7 +4733,7 @@ quota_config		:	quota_mode NUM quota_unit quota_used
 				uint64_t rate;
 
 				erec = data_unit_parse(&@$, $3, &rate);
-				free_const($3);
+				free($3);
 				if (erec != NULL) {
 					erec_queue(erec, state->msgs);
 					YYERROR;
@@ -4762,10 +4762,10 @@ secmark_config		:	string
 				ret = snprintf(secmark->ctx, sizeof(secmark->ctx), "%s", $1);
 				if (ret <= 0 || ret >= (int)sizeof(secmark->ctx)) {
 					erec_queue(error(&@1, "invalid context '%s', max length is %u\n", $1, (int)sizeof(secmark->ctx)), state->msgs);
-					free_const($1);
+					free($1);
 					YYERROR;
 				}
-				free_const($1);
+				free($1);
 			}
 			;
 
@@ -4802,7 +4802,7 @@ ct_helper_config		:	TYPE	QUOTED_STRING	PROTOCOL	ct_l4protoname	stmt_separator	cl
 					erec_queue(error(&@2, "invalid name '%s', max length is %u\n", $2, (int)sizeof(ct->name)), state->msgs);
 					YYERROR;
 				}
-				free_const($2);
+				free($2);
 
 				ct->l4proto = $4;
 			}
@@ -5197,7 +5197,7 @@ chain_expr		:	variable_expr
 							 BYTEORDER_HOST_ENDIAN,
 							 strlen($1) * BITS_PER_BYTE,
 							 $1);
-				free_const($1);
+				free($1);
 			}
 			;
 
@@ -5215,7 +5215,7 @@ meta_expr		:	META	meta_key	close_scope_meta
 				unsigned int key;
 
 				erec = meta_key_parse(&@$, $2, &key);
-				free_const($2);
+				free($2);
 				if (erec != NULL) {
 					erec_queue(erec, state->msgs);
 					YYERROR;
@@ -5292,7 +5292,7 @@ meta_stmt		:	META	meta_key	SET	stmt_expr	close_scope_meta
 				unsigned int key;
 
 				erec = meta_key_parse(&@$, $2, &key);
-				free_const($2);
+				free($2);
 				if (erec != NULL) {
 					erec_queue(erec, state->msgs);
 					YYERROR;
@@ -5603,10 +5603,10 @@ payload_base_spec	:	LL_HDR		{ $$ = PROTO_BASE_LL_HDR; }
 					$$ = PROTO_BASE_INNER_HDR;
 				} else {
 					erec_queue(error(&@1, "unknown raw payload base"), state->msgs);
-					free_const($1);
+					free($1);
 					YYERROR;
 				}
-				free_const($1);
+				free($1);
 			}
 			;
 
-- 
2.41.0


             reply	other threads:[~2023-11-09 19:01 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-09 18:59 Thomas Haller [this message]
2023-11-09 18:59 ` [PATCH nft 2/3] parser: remove "const" from argument of input_descriptor_destroy() Thomas Haller
2023-11-15  9:42   ` Florian Westphal
2023-11-09 18:59 ` [PATCH nft 3/3] parser: use size_t type for strlen() results Thomas Haller
2023-11-15  9:41   ` Florian Westphal
2023-11-09 19:22 ` [PATCH nft 1/3] parser: don't mark "string" as const Pablo Neira Ayuso
2023-11-09 20:34   ` Thomas Haller
2023-11-09 23:10     ` Florian Westphal
2023-11-10  8:09       ` Thomas Haller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20231109190032.669575-1-thaller@redhat.com \
    --to=thaller@redhat.com \
    --cc=netfilter-devel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.