Byte-rate limits using long time units (e.g. bytes/week) can overflow priv->nsecs * skb->len in the packet-path cost calculation, silently defeating the configured rate limit. Reject such configurations at rule-add time instead, using the GRO maximum packet size as a conservative bound on skb length for the multiplication check. Fixes: d2168e849ebf ("netfilter: nft_limit: add per-byte limiting") Signed-off-by: SaifAllah benMassaoud diff --git a/net/netfilter/nft_limit.c b/net/netfilter/nft_limit.c index d92455fc8665..07dc5c55b0a0 100644 --- a/net/netfilter/nft_limit.c +++ b/net/netfilter/nft_limit.c @@ -13,7 +13,7 @@ #include #include #include -#include +#include struct nft_limit { spinlock_t lock; @@ -59,7 +59,7 @@ static inline bool nft_limit_eval(struct nft_limit_priv *priv, u64 cost) static int nft_limit_init(struct nft_limit_priv *priv, const struct nlattr * const tb[], bool pkts) { - u64 unit, tmp, tokens, rate_with_burst; + u64 unit, tokens, rate_with_burst; bool invert = false; if (tb[NFTA_LIMIT_RATE] == NULL || @@ -74,8 +74,7 @@ static int nft_limit_init(struct nft_limit_priv *priv, if (check_mul_overflow(unit, NSEC_PER_SEC, &priv->nsecs)) return -EOVERFLOW; - if (!pkts && - check_mul_overflow(priv->nsecs, GRO_MAX_SIZE, &tmp)) + if (!pkts && priv->nsecs > U64_MAX / GRO_MAX_SIZE) return -EOVERFLOW; if (tb[NFTA_LIMIT_BURST])