* [PATCH bpf-next v3 1/2] bpf/helpers: bpf_strnstr: Exact match length [not found] <cover.1756378974.git.rtoax@foxmail.com> @ 2025-08-28 11:07 ` Rong Tao 2025-08-28 17:04 ` Andrii Nakryiko 2025-08-28 11:07 ` [PATCH bpf-next v3 2/2] selftests/bpf: Add tests for bpf_strnstr Rong Tao 1 sibling, 1 reply; 4+ messages in thread From: Rong Tao @ 2025-08-28 11:07 UTC (permalink / raw) To: andrii.nakryiko, ast, daniel, vmalik Cc: Rong Tao, Andrii Nakryiko, Martin KaFai Lau, Eduard Zingerman, Song Liu, Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa, Mykola Lysenko, Shuah Khan, open list:BPF [GENERAL] (Safe Dynamic Programs and Tools), open list, open list:KERNEL SELFTEST FRAMEWORK From: Rong Tao <rongtao@cestc.cn> strnstr should not treat the ending '\0' of s2 as a matching character, otherwise the parameter 'len' will be meaningless, for example: 1. bpf_strnstr("openat", "open", 4) = -ENOENT 2. bpf_strnstr("openat", "open", 5) = 0 This patch makes (1) return 0, indicating a successful match. Signed-off-by: Rong Tao <rongtao@cestc.cn> --- kernel/bpf/helpers.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c index 401b4932cc49..ced7132980fe 100644 --- a/kernel/bpf/helpers.c +++ b/kernel/bpf/helpers.c @@ -3672,10 +3672,12 @@ __bpf_kfunc int bpf_strnstr(const char *s1__ign, const char *s2__ign, size_t len guard(pagefault)(); for (i = 0; i < XATTR_SIZE_MAX; i++) { - for (j = 0; i + j < len && j < XATTR_SIZE_MAX; j++) { + for (j = 0; i + j <= len && j < XATTR_SIZE_MAX; j++) { __get_kernel_nofault(&c2, s2__ign + j, char, err_out); if (c2 == '\0') return i; + if (i + j == len) + break; __get_kernel_nofault(&c1, s1__ign + j, char, err_out); if (c1 == '\0') return -ENOENT; -- 2.51.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH bpf-next v3 1/2] bpf/helpers: bpf_strnstr: Exact match length 2025-08-28 11:07 ` [PATCH bpf-next v3 1/2] bpf/helpers: bpf_strnstr: Exact match length Rong Tao @ 2025-08-28 17:04 ` Andrii Nakryiko 0 siblings, 0 replies; 4+ messages in thread From: Andrii Nakryiko @ 2025-08-28 17:04 UTC (permalink / raw) To: Rong Tao Cc: ast, daniel, vmalik, Rong Tao, Andrii Nakryiko, Martin KaFai Lau, Eduard Zingerman, Song Liu, Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa, Mykola Lysenko, Shuah Khan, open list:BPF [GENERAL] (Safe Dynamic Programs and Tools), open list, open list:KERNEL SELFTEST FRAMEWORK On Thu, Aug 28, 2025 at 4:07 AM Rong Tao <rtoax@foxmail.com> wrote: > > From: Rong Tao <rongtao@cestc.cn> > > strnstr should not treat the ending '\0' of s2 as a matching character, > otherwise the parameter 'len' will be meaningless, for example: > > 1. bpf_strnstr("openat", "open", 4) = -ENOENT > 2. bpf_strnstr("openat", "open", 5) = 0 > > This patch makes (1) return 0, indicating a successful match. > > Signed-off-by: Rong Tao <rongtao@cestc.cn> > --- > kernel/bpf/helpers.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > Add Fixes: tag? > diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c > index 401b4932cc49..ced7132980fe 100644 > --- a/kernel/bpf/helpers.c > +++ b/kernel/bpf/helpers.c > @@ -3672,10 +3672,12 @@ __bpf_kfunc int bpf_strnstr(const char *s1__ign, const char *s2__ign, size_t len > > guard(pagefault)(); > for (i = 0; i < XATTR_SIZE_MAX; i++) { > - for (j = 0; i + j < len && j < XATTR_SIZE_MAX; j++) { > + for (j = 0; i + j <= len && j < XATTR_SIZE_MAX; j++) { that <= is a bit subtle, and combined with extra i+j==len check below is a bit confusing, so I think it would be good to add a short comment explaining this corner case you caught and that we are doing this to ensure that we matched entire s2 (and thus we need to find NUL to confirm). > __get_kernel_nofault(&c2, s2__ign + j, char, err_out); > if (c2 == '\0') > return i; > + if (i + j == len) > + break; > __get_kernel_nofault(&c1, s1__ign + j, char, err_out); > if (c1 == '\0') > return -ENOENT; > -- > 2.51.0 > ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH bpf-next v3 2/2] selftests/bpf: Add tests for bpf_strnstr [not found] <cover.1756378974.git.rtoax@foxmail.com> 2025-08-28 11:07 ` [PATCH bpf-next v3 1/2] bpf/helpers: bpf_strnstr: Exact match length Rong Tao @ 2025-08-28 11:07 ` Rong Tao 2025-08-28 17:02 ` Andrii Nakryiko 1 sibling, 1 reply; 4+ messages in thread From: Rong Tao @ 2025-08-28 11:07 UTC (permalink / raw) To: andrii.nakryiko, ast, daniel, vmalik Cc: Rong Tao, Andrii Nakryiko, Martin KaFai Lau, Eduard Zingerman, Song Liu, Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa, Mykola Lysenko, Shuah Khan, open list:BPF [GENERAL] (Safe Dynamic Programs and Tools), open list, open list:KERNEL SELFTEST FRAMEWORK From: Rong Tao <rongtao@cestc.cn> Add two tests for bpf_strnstr(): bpf_strnstr("", "", 0) = 0 bpf_strnstr("hello world", "hello", 5) = 0 Signed-off-by: Rong Tao <rongtao@cestc.cn> --- tools/testing/selftests/bpf/progs/string_kfuncs_success.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/bpf/progs/string_kfuncs_success.c b/tools/testing/selftests/bpf/progs/string_kfuncs_success.c index 46697f381878..1b56bd5860e9 100644 --- a/tools/testing/selftests/bpf/progs/string_kfuncs_success.c +++ b/tools/testing/selftests/bpf/progs/string_kfuncs_success.c @@ -30,7 +30,9 @@ __test(2) int test_strcspn(void *ctx) { return bpf_strcspn(str, "lo"); } __test(6) int test_strstr_found(void *ctx) { return bpf_strstr(str, "world"); } __test(-ENOENT) int test_strstr_notfound(void *ctx) { return bpf_strstr(str, "hi"); } __test(0) int test_strstr_empty(void *ctx) { return bpf_strstr(str, ""); } -__test(0) int test_strnstr_found(void *ctx) { return bpf_strnstr(str, "hello", 6); } +__test(0) int test_strnstr_found1(void *ctx) { return bpf_strnstr("", "", 0); } +__test(0) int test_strnstr_found2(void *ctx) { return bpf_strnstr(str, "hello", 5); } +__test(0) int test_strnstr_found3(void *ctx) { return bpf_strnstr(str, "hello", 6); } __test(-ENOENT) int test_strnstr_notfound(void *ctx) { return bpf_strnstr(str, "hi", 10); } __test(0) int test_strnstr_empty(void *ctx) { return bpf_strnstr(str, "", 1); } -- 2.51.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH bpf-next v3 2/2] selftests/bpf: Add tests for bpf_strnstr 2025-08-28 11:07 ` [PATCH bpf-next v3 2/2] selftests/bpf: Add tests for bpf_strnstr Rong Tao @ 2025-08-28 17:02 ` Andrii Nakryiko 0 siblings, 0 replies; 4+ messages in thread From: Andrii Nakryiko @ 2025-08-28 17:02 UTC (permalink / raw) To: Rong Tao Cc: ast, daniel, vmalik, Rong Tao, Andrii Nakryiko, Martin KaFai Lau, Eduard Zingerman, Song Liu, Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa, Mykola Lysenko, Shuah Khan, open list:BPF [GENERAL] (Safe Dynamic Programs and Tools), open list, open list:KERNEL SELFTEST FRAMEWORK On Thu, Aug 28, 2025 at 4:08 AM Rong Tao <rtoax@foxmail.com> wrote: > > From: Rong Tao <rongtao@cestc.cn> > > Add two tests for bpf_strnstr(): > > bpf_strnstr("", "", 0) = 0 > bpf_strnstr("hello world", "hello", 5) = 0 > > Signed-off-by: Rong Tao <rongtao@cestc.cn> > --- > tools/testing/selftests/bpf/progs/string_kfuncs_success.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/tools/testing/selftests/bpf/progs/string_kfuncs_success.c b/tools/testing/selftests/bpf/progs/string_kfuncs_success.c > index 46697f381878..1b56bd5860e9 100644 > --- a/tools/testing/selftests/bpf/progs/string_kfuncs_success.c > +++ b/tools/testing/selftests/bpf/progs/string_kfuncs_success.c > @@ -30,7 +30,9 @@ __test(2) int test_strcspn(void *ctx) { return bpf_strcspn(str, "lo"); } > __test(6) int test_strstr_found(void *ctx) { return bpf_strstr(str, "world"); } > __test(-ENOENT) int test_strstr_notfound(void *ctx) { return bpf_strstr(str, "hi"); } > __test(0) int test_strstr_empty(void *ctx) { return bpf_strstr(str, ""); } > -__test(0) int test_strnstr_found(void *ctx) { return bpf_strnstr(str, "hello", 6); } > +__test(0) int test_strnstr_found1(void *ctx) { return bpf_strnstr("", "", 0); } > +__test(0) int test_strnstr_found2(void *ctx) { return bpf_strnstr(str, "hello", 5); } add (str, "hello", 4) == -ENOENT case? Also let's add negative ("", "a", 0) == -ENOENT case? pw-bot: cr > +__test(0) int test_strnstr_found3(void *ctx) { return bpf_strnstr(str, "hello", 6); } > __test(-ENOENT) int test_strnstr_notfound(void *ctx) { return bpf_strnstr(str, "hi", 10); } > __test(0) int test_strnstr_empty(void *ctx) { return bpf_strnstr(str, "", 1); } > > -- > 2.51.0 > ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2025-08-28 17:04 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <cover.1756378974.git.rtoax@foxmail.com> 2025-08-28 11:07 ` [PATCH bpf-next v3 1/2] bpf/helpers: bpf_strnstr: Exact match length Rong Tao 2025-08-28 17:04 ` Andrii Nakryiko 2025-08-28 11:07 ` [PATCH bpf-next v3 2/2] selftests/bpf: Add tests for bpf_strnstr Rong Tao 2025-08-28 17:02 ` Andrii Nakryiko
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).