All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH nft,v2 1/2] datatype: reject rate in quota statement
@ 2024-08-14 11:51 Pablo Neira Ayuso
  2024-08-14 11:51 ` [PATCH nft,v2 2/2] datatype: improve error reporting when time unit is not correct Pablo Neira Ayuso
  2024-08-14 16:00 ` [PATCH nft,v2 1/2] datatype: reject rate in quota statement Phil Sutter
  0 siblings, 2 replies; 9+ messages in thread
From: Pablo Neira Ayuso @ 2024-08-14 11:51 UTC (permalink / raw)
  To: netfilter-devel

Bail out if rate are used:

 ruleset.nft:5:77-106: Error: Wrong rate format, expecting bytes or kbytes or mbytes
 add rule netdev firewall PROTECTED_IPS update @quota_temp_before { ip daddr quota over 45000 mbytes/second } add @quota_trigger { ip daddr }
                                                                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

improve error reporting while at this.

Fixes: 6615676d825e ("src: add per-bytes limit")
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
v2: - change patch subject
    - use strndup() to fetch units in rate_parse() so limit rate does not break.

 src/datatype.c | 20 +++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

diff --git a/src/datatype.c b/src/datatype.c
index d398a9c8c618..297c5d0409d5 100644
--- a/src/datatype.c
+++ b/src/datatype.c
@@ -1485,14 +1485,14 @@ static struct error_record *time_unit_parse(const struct location *loc,
 struct error_record *data_unit_parse(const struct location *loc,
 				     const char *str, uint64_t *rate)
 {
-	if (strncmp(str, "bytes", strlen("bytes")) == 0)
+	if (strcmp(str, "bytes") == 0)
 		*rate = 1ULL;
-	else if (strncmp(str, "kbytes", strlen("kbytes")) == 0)
+	else if (strcmp(str, "kbytes") == 0)
 		*rate = 1024;
-	else if (strncmp(str, "mbytes", strlen("mbytes")) == 0)
+	else if (strcmp(str, "mbytes") == 0)
 		*rate = 1024 * 1024;
 	else
-		return error(loc, "Wrong rate format");
+		return error(loc, "Wrong unit format, expecting bytes, kbytes or mbytes");
 
 	return NULL;
 }
@@ -1500,14 +1500,20 @@ struct error_record *data_unit_parse(const struct location *loc,
 struct error_record *rate_parse(const struct location *loc, const char *str,
 				uint64_t *rate, uint64_t *unit)
 {
+	const char *slash, *rate_str;
 	struct error_record *erec;
-	const char *slash;
 
 	slash = strchr(str, '/');
 	if (!slash)
-		return error(loc, "wrong rate format");
+		return error(loc, "wrong rate format, expecting {bytes,kbytes,mbytes}/{second,minute,hour,day,week}");
+
+	rate_str = strndup(str, slash - str);
+	if (!rate_str)
+		memory_allocation_error();
+
+	erec = data_unit_parse(loc, rate_str, rate);
+	free_const(rate_str);
 
-	erec = data_unit_parse(loc, str, rate);
 	if (erec != NULL)
 		return erec;
 
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2024-08-19 15:57 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-08-14 11:51 [PATCH nft,v2 1/2] datatype: reject rate in quota statement Pablo Neira Ayuso
2024-08-14 11:51 ` [PATCH nft,v2 2/2] datatype: improve error reporting when time unit is not correct Pablo Neira Ayuso
2024-08-14 16:00 ` [PATCH nft,v2 1/2] datatype: reject rate in quota statement Phil Sutter
2024-08-14 16:09   ` Pablo Neira Ayuso
2024-08-14 19:26     ` Phil Sutter
2024-08-16 12:25       ` Phil Sutter
2024-08-19 10:47         ` Pablo Neira Ayuso
2024-08-19 15:18           ` Phil Sutter
2024-08-19 15:57             ` Pablo Neira Ayuso

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.