summaryrefslogtreecommitdiffstats
path: root/net/core
diff options
context:
space:
mode:
authorPhil Sutter <phil@nwl.cc>2023-10-17 11:39:06 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2023-11-20 11:59:01 +0100
commit7802db1dd578adcf5bef23ba3a3a9d396292dd2f (patch)
tree26aecf55a9a657e79652c2c93252c0b162a0c8e0 /net/core
parentba36bc0edad84e490c6a8d96dbca2c58c41dd8e8 (diff)
downloadlinux-stable-7802db1dd578adcf5bef23ba3a3a9d396292dd2f.tar.gz
linux-stable-7802db1dd578adcf5bef23ba3a3a9d396292dd2f.tar.bz2
linux-stable-7802db1dd578adcf5bef23ba3a3a9d396292dd2f.zip
net: skb_find_text: Ignore patterns extending past 'to'
[ Upstream commit c4eee56e14fe001e1cff54f0b438a5e2d0dd7454 ] Assume that caller's 'to' offset really represents an upper boundary for the pattern search, so patterns extending past this offset are to be rejected. The old behaviour also was kind of inconsistent when it comes to fragmentation (or otherwise non-linear skbs): If the pattern started in between 'to' and 'from' offsets but extended to the next fragment, it was not found if 'to' offset was still within the current fragment. Test the new behaviour in a kselftest using iptables' string match. Suggested-by: Pablo Neira Ayuso <pablo@netfilter.org> Fixes: f72b948dcbb8 ("[NET]: skb_find_text ignores to argument") Signed-off-by: Phil Sutter <phil@nwl.cc> Reviewed-by: Florian Westphal <fw@strlen.de> Reviewed-by: Pablo Neira Ayuso <pablo@netfilter.org> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'net/core')
-rw-r--r--net/core/skbuff.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 4eaf7ed0d1f4..97b4a42e6e34 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -4254,6 +4254,7 @@ static void skb_ts_finish(struct ts_config *conf, struct ts_state *state)
unsigned int skb_find_text(struct sk_buff *skb, unsigned int from,
unsigned int to, struct ts_config *config)
{
+ unsigned int patlen = config->ops->get_pattern_len(config);
struct ts_state state;
unsigned int ret;
@@ -4265,7 +4266,7 @@ unsigned int skb_find_text(struct sk_buff *skb, unsigned int from,
skb_prepare_seq_read(skb, from, to, TS_SKB_CB(&state));
ret = textsearch_find(config, &state);
- return (ret <= to - from ? ret : UINT_MAX);
+ return (ret + patlen <= to - from ? ret : UINT_MAX);
}
EXPORT_SYMBOL(skb_find_text);