* [PATCH bpf-next 1/2] bpf: add bpf_strcasecmp kfunc [not found] <cover.1756793624.git.rongtao@cestc.cn> @ 2025-09-02 6:17 ` Rong Tao 2025-09-02 7:08 ` Viktor Malik 2025-09-02 6:18 ` [PATCH bpf-next 2/2] selftests/bpf: Test kfunc bpf_strcasecmp Rong Tao 1 sibling, 1 reply; 5+ messages in thread From: Rong Tao @ 2025-09-02 6:17 UTC (permalink / raw) To: andrii, ast, vmalik Cc: rtoax, Rong Tao, Daniel Borkmann, 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> bpf_strcasecmp() function performs same like bpf_strcmp() except ignoring the case of the characters. Signed-off-by: Rong Tao <rongtao@cestc.cn> --- kernel/bpf/helpers.c | 56 +++++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c index 401b4932cc49..e807a708e5fc 100644 --- a/kernel/bpf/helpers.c +++ b/kernel/bpf/helpers.c @@ -3349,20 +3349,7 @@ __bpf_kfunc void __bpf_trap(void) * __get_kernel_nofault instead of plain dereference to make them safe. */ -/** - * bpf_strcmp - Compare two strings - * @s1__ign: One string - * @s2__ign: Another string - * - * Return: - * * %0 - Strings are equal - * * %-1 - @s1__ign is smaller - * * %1 - @s2__ign is smaller - * * %-EFAULT - Cannot read one of the strings - * * %-E2BIG - One of strings is too large - * * %-ERANGE - One of strings is outside of kernel address space - */ -__bpf_kfunc int bpf_strcmp(const char *s1__ign, const char *s2__ign) +int __bpf_strcasecmp(const char *s1__ign, const char *s2__ign, bool ignore_case) { char c1, c2; int i; @@ -3376,6 +3363,10 @@ __bpf_kfunc int bpf_strcmp(const char *s1__ign, const char *s2__ign) for (i = 0; i < XATTR_SIZE_MAX; i++) { __get_kernel_nofault(&c1, s1__ign, char, err_out); __get_kernel_nofault(&c2, s2__ign, char, err_out); + if (ignore_case) { + c1 = tolower(c1); + c2 = tolower(c2); + } if (c1 != c2) return c1 < c2 ? -1 : 1; if (c1 == '\0') @@ -3388,6 +3379,42 @@ __bpf_kfunc int bpf_strcmp(const char *s1__ign, const char *s2__ign) return -EFAULT; } +/** + * bpf_strcmp - Compare two strings + * @s1__ign: One string + * @s2__ign: Another string + * + * Return: + * * %0 - Strings are equal + * * %-1 - @s1__ign is smaller + * * %1 - @s2__ign is smaller + * * %-EFAULT - Cannot read one of the strings + * * %-E2BIG - One of strings is too large + * * %-ERANGE - One of strings is outside of kernel address space + */ +__bpf_kfunc int bpf_strcmp(const char *s1__ign, const char *s2__ign) +{ + return __bpf_strcasecmp(s1__ign, s2__ign, false); +} + +/** + * bpf_strcasecmp - Compare two strings, ignoring the case of the characters + * @s1__ign: One string + * @s2__ign: Another string + * + * Return: + * * %0 - Strings are equal + * * %-1 - @s1__ign is smaller + * * %1 - @s2__ign is smaller + * * %-EFAULT - Cannot read one of the strings + * * %-E2BIG - One of strings is too large + * * %-ERANGE - One of strings is outside of kernel address space + */ +__bpf_kfunc int bpf_strcasecmp(const char *s1__ign, const char *s2__ign) +{ + return __bpf_strcasecmp(s1__ign, s2__ign, true); +} + /** * bpf_strnchr - Find a character in a length limited string * @s__ign: The string to be searched @@ -3832,6 +3859,7 @@ BTF_ID_FLAGS(func, bpf_iter_dmabuf_destroy, KF_ITER_DESTROY | KF_SLEEPABLE) #endif BTF_ID_FLAGS(func, __bpf_trap) BTF_ID_FLAGS(func, bpf_strcmp); +BTF_ID_FLAGS(func, bpf_strcasecmp); BTF_ID_FLAGS(func, bpf_strchr); BTF_ID_FLAGS(func, bpf_strchrnul); BTF_ID_FLAGS(func, bpf_strnchr); -- 2.51.0 ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH bpf-next 1/2] bpf: add bpf_strcasecmp kfunc 2025-09-02 6:17 ` [PATCH bpf-next 1/2] bpf: add bpf_strcasecmp kfunc Rong Tao @ 2025-09-02 7:08 ` Viktor Malik 2025-09-02 7:14 ` Rong Tao 0 siblings, 1 reply; 5+ messages in thread From: Viktor Malik @ 2025-09-02 7:08 UTC (permalink / raw) To: Rong Tao, andrii, ast Cc: Rong Tao, Daniel Borkmann, 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 9/2/25 08:17, Rong Tao wrote: > From: Rong Tao <rongtao@cestc.cn> > > bpf_strcasecmp() function performs same like bpf_strcmp() except ignoring > the case of the characters. > > Signed-off-by: Rong Tao <rongtao@cestc.cn> > --- > kernel/bpf/helpers.c | 56 +++++++++++++++++++++++++++++++++----------- > 1 file changed, 42 insertions(+), 14 deletions(-) > > diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c > index 401b4932cc49..e807a708e5fc 100644 > --- a/kernel/bpf/helpers.c > +++ b/kernel/bpf/helpers.c > @@ -3349,20 +3349,7 @@ __bpf_kfunc void __bpf_trap(void) > * __get_kernel_nofault instead of plain dereference to make them safe. > */ > > -/** > - * bpf_strcmp - Compare two strings > - * @s1__ign: One string > - * @s2__ign: Another string > - * > - * Return: > - * * %0 - Strings are equal > - * * %-1 - @s1__ign is smaller > - * * %1 - @s2__ign is smaller > - * * %-EFAULT - Cannot read one of the strings > - * * %-E2BIG - One of strings is too large > - * * %-ERANGE - One of strings is outside of kernel address space > - */ > -__bpf_kfunc int bpf_strcmp(const char *s1__ign, const char *s2__ign) > +int __bpf_strcasecmp(const char *s1__ign, const char *s2__ign, bool ignore_case) No need to use the `__ign` suffix here. Otherwise LGTM. I guess that it could be useful in some applications. Viktor > { > char c1, c2; > int i; > @@ -3376,6 +3363,10 @@ __bpf_kfunc int bpf_strcmp(const char *s1__ign, const char *s2__ign) > for (i = 0; i < XATTR_SIZE_MAX; i++) { > __get_kernel_nofault(&c1, s1__ign, char, err_out); > __get_kernel_nofault(&c2, s2__ign, char, err_out); > + if (ignore_case) { > + c1 = tolower(c1); > + c2 = tolower(c2); > + } > if (c1 != c2) > return c1 < c2 ? -1 : 1; > if (c1 == '\0') > @@ -3388,6 +3379,42 @@ __bpf_kfunc int bpf_strcmp(const char *s1__ign, const char *s2__ign) > return -EFAULT; > } > > +/** > + * bpf_strcmp - Compare two strings > + * @s1__ign: One string > + * @s2__ign: Another string > + * > + * Return: > + * * %0 - Strings are equal > + * * %-1 - @s1__ign is smaller > + * * %1 - @s2__ign is smaller > + * * %-EFAULT - Cannot read one of the strings > + * * %-E2BIG - One of strings is too large > + * * %-ERANGE - One of strings is outside of kernel address space > + */ > +__bpf_kfunc int bpf_strcmp(const char *s1__ign, const char *s2__ign) > +{ > + return __bpf_strcasecmp(s1__ign, s2__ign, false); > +} > + > +/** > + * bpf_strcasecmp - Compare two strings, ignoring the case of the characters > + * @s1__ign: One string > + * @s2__ign: Another string > + * > + * Return: > + * * %0 - Strings are equal > + * * %-1 - @s1__ign is smaller > + * * %1 - @s2__ign is smaller > + * * %-EFAULT - Cannot read one of the strings > + * * %-E2BIG - One of strings is too large > + * * %-ERANGE - One of strings is outside of kernel address space > + */ > +__bpf_kfunc int bpf_strcasecmp(const char *s1__ign, const char *s2__ign) > +{ > + return __bpf_strcasecmp(s1__ign, s2__ign, true); > +} > + > /** > * bpf_strnchr - Find a character in a length limited string > * @s__ign: The string to be searched > @@ -3832,6 +3859,7 @@ BTF_ID_FLAGS(func, bpf_iter_dmabuf_destroy, KF_ITER_DESTROY | KF_SLEEPABLE) > #endif > BTF_ID_FLAGS(func, __bpf_trap) > BTF_ID_FLAGS(func, bpf_strcmp); > +BTF_ID_FLAGS(func, bpf_strcasecmp); > BTF_ID_FLAGS(func, bpf_strchr); > BTF_ID_FLAGS(func, bpf_strchrnul); > BTF_ID_FLAGS(func, bpf_strnchr); ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH bpf-next 1/2] bpf: add bpf_strcasecmp kfunc 2025-09-02 7:08 ` Viktor Malik @ 2025-09-02 7:14 ` Rong Tao 0 siblings, 0 replies; 5+ messages in thread From: Rong Tao @ 2025-09-02 7:14 UTC (permalink / raw) To: Viktor Malik, andrii, ast Cc: Rong Tao, Daniel Borkmann, 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 9/2/25 15:08, Viktor Malik wrote: > On 9/2/25 08:17, Rong Tao wrote: >> From: Rong Tao <rongtao@cestc.cn> >> >> bpf_strcasecmp() function performs same like bpf_strcmp() except ignoring >> the case of the characters. >> >> Signed-off-by: Rong Tao <rongtao@cestc.cn> >> --- >> kernel/bpf/helpers.c | 56 +++++++++++++++++++++++++++++++++----------- >> 1 file changed, 42 insertions(+), 14 deletions(-) >> >> diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c >> index 401b4932cc49..e807a708e5fc 100644 >> --- a/kernel/bpf/helpers.c >> +++ b/kernel/bpf/helpers.c >> @@ -3349,20 +3349,7 @@ __bpf_kfunc void __bpf_trap(void) >> * __get_kernel_nofault instead of plain dereference to make them safe. >> */ >> >> -/** >> - * bpf_strcmp - Compare two strings >> - * @s1__ign: One string >> - * @s2__ign: Another string >> - * >> - * Return: >> - * * %0 - Strings are equal >> - * * %-1 - @s1__ign is smaller >> - * * %1 - @s2__ign is smaller >> - * * %-EFAULT - Cannot read one of the strings >> - * * %-E2BIG - One of strings is too large >> - * * %-ERANGE - One of strings is outside of kernel address space >> - */ >> -__bpf_kfunc int bpf_strcmp(const char *s1__ign, const char *s2__ign) >> +int __bpf_strcasecmp(const char *s1__ign, const char *s2__ign, bool ignore_case) > No need to use the `__ign` suffix here. Viktor, Thanks for your review, i'll submit v2 soon. Rong Tao > > Otherwise LGTM. I guess that it could be useful in some applications. > > Viktor > >> { >> char c1, c2; >> int i; >> @@ -3376,6 +3363,10 @@ __bpf_kfunc int bpf_strcmp(const char *s1__ign, const char *s2__ign) >> for (i = 0; i < XATTR_SIZE_MAX; i++) { >> __get_kernel_nofault(&c1, s1__ign, char, err_out); >> __get_kernel_nofault(&c2, s2__ign, char, err_out); >> + if (ignore_case) { >> + c1 = tolower(c1); >> + c2 = tolower(c2); >> + } >> if (c1 != c2) >> return c1 < c2 ? -1 : 1; >> if (c1 == '\0') >> @@ -3388,6 +3379,42 @@ __bpf_kfunc int bpf_strcmp(const char *s1__ign, const char *s2__ign) >> return -EFAULT; >> } >> >> +/** >> + * bpf_strcmp - Compare two strings >> + * @s1__ign: One string >> + * @s2__ign: Another string >> + * >> + * Return: >> + * * %0 - Strings are equal >> + * * %-1 - @s1__ign is smaller >> + * * %1 - @s2__ign is smaller >> + * * %-EFAULT - Cannot read one of the strings >> + * * %-E2BIG - One of strings is too large >> + * * %-ERANGE - One of strings is outside of kernel address space >> + */ >> +__bpf_kfunc int bpf_strcmp(const char *s1__ign, const char *s2__ign) >> +{ >> + return __bpf_strcasecmp(s1__ign, s2__ign, false); >> +} >> + >> +/** >> + * bpf_strcasecmp - Compare two strings, ignoring the case of the characters >> + * @s1__ign: One string >> + * @s2__ign: Another string >> + * >> + * Return: >> + * * %0 - Strings are equal >> + * * %-1 - @s1__ign is smaller >> + * * %1 - @s2__ign is smaller >> + * * %-EFAULT - Cannot read one of the strings >> + * * %-E2BIG - One of strings is too large >> + * * %-ERANGE - One of strings is outside of kernel address space >> + */ >> +__bpf_kfunc int bpf_strcasecmp(const char *s1__ign, const char *s2__ign) >> +{ >> + return __bpf_strcasecmp(s1__ign, s2__ign, true); >> +} >> + >> /** >> * bpf_strnchr - Find a character in a length limited string >> * @s__ign: The string to be searched >> @@ -3832,6 +3859,7 @@ BTF_ID_FLAGS(func, bpf_iter_dmabuf_destroy, KF_ITER_DESTROY | KF_SLEEPABLE) >> #endif >> BTF_ID_FLAGS(func, __bpf_trap) >> BTF_ID_FLAGS(func, bpf_strcmp); >> +BTF_ID_FLAGS(func, bpf_strcasecmp); >> BTF_ID_FLAGS(func, bpf_strchr); >> BTF_ID_FLAGS(func, bpf_strchrnul); >> BTF_ID_FLAGS(func, bpf_strnchr); ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH bpf-next 2/2] selftests/bpf: Test kfunc bpf_strcasecmp [not found] <cover.1756793624.git.rongtao@cestc.cn> 2025-09-02 6:17 ` [PATCH bpf-next 1/2] bpf: add bpf_strcasecmp kfunc Rong Tao @ 2025-09-02 6:18 ` Rong Tao 2025-09-02 7:12 ` Viktor Malik 1 sibling, 1 reply; 5+ messages in thread From: Rong Tao @ 2025-09-02 6:18 UTC (permalink / raw) To: andrii, ast, vmalik Cc: rtoax, Rong Tao, Daniel Borkmann, 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 testsuites for kfunc bpf_strcasecmp. Signed-off-by: Rong Tao <rongtao@cestc.cn> --- tools/testing/selftests/bpf/progs/string_kfuncs_failure1.c | 6 ++++++ tools/testing/selftests/bpf/progs/string_kfuncs_success.c | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/tools/testing/selftests/bpf/progs/string_kfuncs_failure1.c b/tools/testing/selftests/bpf/progs/string_kfuncs_failure1.c index 53af438bd998..99d72c68f76a 100644 --- a/tools/testing/selftests/bpf/progs/string_kfuncs_failure1.c +++ b/tools/testing/selftests/bpf/progs/string_kfuncs_failure1.c @@ -31,6 +31,8 @@ char *invalid_kern_ptr = (char *)-1; /* Passing NULL to string kfuncs (treated as a userspace ptr) */ SEC("syscall") __retval(USER_PTR_ERR) int test_strcmp_null1(void *ctx) { return bpf_strcmp(NULL, "hello"); } SEC("syscall") __retval(USER_PTR_ERR)int test_strcmp_null2(void *ctx) { return bpf_strcmp("hello", NULL); } +SEC("syscall") __retval(USER_PTR_ERR) int test_strcasecmp_null1(void *ctx) { return bpf_strcasecmp(NULL, "HELLO"); } +SEC("syscall") __retval(USER_PTR_ERR)int test_strcasecmp_null2(void *ctx) { return bpf_strcasecmp("HELLO", NULL); } SEC("syscall") __retval(USER_PTR_ERR)int test_strchr_null(void *ctx) { return bpf_strchr(NULL, 'a'); } SEC("syscall") __retval(USER_PTR_ERR)int test_strchrnul_null(void *ctx) { return bpf_strchrnul(NULL, 'a'); } SEC("syscall") __retval(USER_PTR_ERR)int test_strnchr_null(void *ctx) { return bpf_strnchr(NULL, 1, 'a'); } @@ -49,6 +51,8 @@ SEC("syscall") __retval(USER_PTR_ERR)int test_strnstr_null2(void *ctx) { return /* Passing userspace ptr to string kfuncs */ SEC("syscall") __retval(USER_PTR_ERR) int test_strcmp_user_ptr1(void *ctx) { return bpf_strcmp(user_ptr, "hello"); } SEC("syscall") __retval(USER_PTR_ERR) int test_strcmp_user_ptr2(void *ctx) { return bpf_strcmp("hello", user_ptr); } +SEC("syscall") __retval(USER_PTR_ERR) int test_strcasecmp_user_ptr1(void *ctx) { return bpf_strcasecmp(user_ptr, "HELLO"); } +SEC("syscall") __retval(USER_PTR_ERR) int test_strcasecmp_user_ptr2(void *ctx) { return bpf_strcasecmp("HELLO", user_ptr); } SEC("syscall") __retval(USER_PTR_ERR) int test_strchr_user_ptr(void *ctx) { return bpf_strchr(user_ptr, 'a'); } SEC("syscall") __retval(USER_PTR_ERR) int test_strchrnul_user_ptr(void *ctx) { return bpf_strchrnul(user_ptr, 'a'); } SEC("syscall") __retval(USER_PTR_ERR) int test_strnchr_user_ptr(void *ctx) { return bpf_strnchr(user_ptr, 1, 'a'); } @@ -69,6 +73,8 @@ SEC("syscall") __retval(USER_PTR_ERR) int test_strnstr_user_ptr2(void *ctx) { re /* Passing invalid kernel ptr to string kfuncs should always return -EFAULT */ SEC("syscall") __retval(-EFAULT) int test_strcmp_pagefault1(void *ctx) { return bpf_strcmp(invalid_kern_ptr, "hello"); } SEC("syscall") __retval(-EFAULT) int test_strcmp_pagefault2(void *ctx) { return bpf_strcmp("hello", invalid_kern_ptr); } +SEC("syscall") __retval(-EFAULT) int test_strcasecmp_pagefault1(void *ctx) { return bpf_strcasecmp(invalid_kern_ptr, "HELLO"); } +SEC("syscall") __retval(-EFAULT) int test_strcasecmp_pagefault2(void *ctx) { return bpf_strcasecmp("HELLO", invalid_kern_ptr); } SEC("syscall") __retval(-EFAULT) int test_strchr_pagefault(void *ctx) { return bpf_strchr(invalid_kern_ptr, 'a'); } SEC("syscall") __retval(-EFAULT) int test_strchrnul_pagefault(void *ctx) { return bpf_strchrnul(invalid_kern_ptr, 'a'); } SEC("syscall") __retval(-EFAULT) int test_strnchr_pagefault(void *ctx) { return bpf_strnchr(invalid_kern_ptr, 1, 'a'); } diff --git a/tools/testing/selftests/bpf/progs/string_kfuncs_success.c b/tools/testing/selftests/bpf/progs/string_kfuncs_success.c index 46697f381878..67830456637b 100644 --- a/tools/testing/selftests/bpf/progs/string_kfuncs_success.c +++ b/tools/testing/selftests/bpf/progs/string_kfuncs_success.c @@ -12,6 +12,11 @@ char str[] = "hello world"; /* Functional tests */ __test(0) int test_strcmp_eq(void *ctx) { return bpf_strcmp(str, "hello world"); } __test(1) int test_strcmp_neq(void *ctx) { return bpf_strcmp(str, "hello"); } +__test(0) int test_strcasecmp_eq1(void *ctx) { return bpf_strcasecmp(str, "hello world"); } +__test(0) int test_strcasecmp_eq2(void *ctx) { return bpf_strcasecmp(str, "HELLO WORLD"); } +__test(0) int test_strcasecmp_eq3(void *ctx) { return bpf_strcasecmp(str, "HELLO world"); } +__test(1) int test_strcasecmp_neq1(void *ctx) { return bpf_strcasecmp(str, "hello"); } +__test(1) int test_strcasecmp_neq2(void *ctx) { return bpf_strcasecmp(str, "HELLO"); } __test(1) int test_strchr_found(void *ctx) { return bpf_strchr(str, 'e'); } __test(11) int test_strchr_null(void *ctx) { return bpf_strchr(str, '\0'); } __test(-ENOENT) int test_strchr_notfound(void *ctx) { return bpf_strchr(str, 'x'); } -- 2.51.0 ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH bpf-next 2/2] selftests/bpf: Test kfunc bpf_strcasecmp 2025-09-02 6:18 ` [PATCH bpf-next 2/2] selftests/bpf: Test kfunc bpf_strcasecmp Rong Tao @ 2025-09-02 7:12 ` Viktor Malik 0 siblings, 0 replies; 5+ messages in thread From: Viktor Malik @ 2025-09-02 7:12 UTC (permalink / raw) To: Rong Tao, andrii, ast Cc: Rong Tao, Daniel Borkmann, 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 9/2/25 08:18, Rong Tao wrote: > From: Rong Tao <rongtao@cestc.cn> > > Add testsuites for kfunc bpf_strcasecmp. > > Signed-off-by: Rong Tao <rongtao@cestc.cn> > --- > tools/testing/selftests/bpf/progs/string_kfuncs_failure1.c | 6 ++++++ > tools/testing/selftests/bpf/progs/string_kfuncs_success.c | 5 +++++ > 2 files changed, 11 insertions(+) > > diff --git a/tools/testing/selftests/bpf/progs/string_kfuncs_failure1.c b/tools/testing/selftests/bpf/progs/string_kfuncs_failure1.c > index 53af438bd998..99d72c68f76a 100644 > --- a/tools/testing/selftests/bpf/progs/string_kfuncs_failure1.c > +++ b/tools/testing/selftests/bpf/progs/string_kfuncs_failure1.c > @@ -31,6 +31,8 @@ char *invalid_kern_ptr = (char *)-1; > /* Passing NULL to string kfuncs (treated as a userspace ptr) */ > SEC("syscall") __retval(USER_PTR_ERR) int test_strcmp_null1(void *ctx) { return bpf_strcmp(NULL, "hello"); } > SEC("syscall") __retval(USER_PTR_ERR)int test_strcmp_null2(void *ctx) { return bpf_strcmp("hello", NULL); } > +SEC("syscall") __retval(USER_PTR_ERR) int test_strcasecmp_null1(void *ctx) { return bpf_strcasecmp(NULL, "HELLO"); } > +SEC("syscall") __retval(USER_PTR_ERR)int test_strcasecmp_null2(void *ctx) { return bpf_strcasecmp("HELLO", NULL); } > SEC("syscall") __retval(USER_PTR_ERR)int test_strchr_null(void *ctx) { return bpf_strchr(NULL, 'a'); } > SEC("syscall") __retval(USER_PTR_ERR)int test_strchrnul_null(void *ctx) { return bpf_strchrnul(NULL, 'a'); } > SEC("syscall") __retval(USER_PTR_ERR)int test_strnchr_null(void *ctx) { return bpf_strnchr(NULL, 1, 'a'); } > @@ -49,6 +51,8 @@ SEC("syscall") __retval(USER_PTR_ERR)int test_strnstr_null2(void *ctx) { return > /* Passing userspace ptr to string kfuncs */ > SEC("syscall") __retval(USER_PTR_ERR) int test_strcmp_user_ptr1(void *ctx) { return bpf_strcmp(user_ptr, "hello"); } > SEC("syscall") __retval(USER_PTR_ERR) int test_strcmp_user_ptr2(void *ctx) { return bpf_strcmp("hello", user_ptr); } > +SEC("syscall") __retval(USER_PTR_ERR) int test_strcasecmp_user_ptr1(void *ctx) { return bpf_strcasecmp(user_ptr, "HELLO"); } > +SEC("syscall") __retval(USER_PTR_ERR) int test_strcasecmp_user_ptr2(void *ctx) { return bpf_strcasecmp("HELLO", user_ptr); } > SEC("syscall") __retval(USER_PTR_ERR) int test_strchr_user_ptr(void *ctx) { return bpf_strchr(user_ptr, 'a'); } > SEC("syscall") __retval(USER_PTR_ERR) int test_strchrnul_user_ptr(void *ctx) { return bpf_strchrnul(user_ptr, 'a'); } > SEC("syscall") __retval(USER_PTR_ERR) int test_strnchr_user_ptr(void *ctx) { return bpf_strnchr(user_ptr, 1, 'a'); } > @@ -69,6 +73,8 @@ SEC("syscall") __retval(USER_PTR_ERR) int test_strnstr_user_ptr2(void *ctx) { re > /* Passing invalid kernel ptr to string kfuncs should always return -EFAULT */ > SEC("syscall") __retval(-EFAULT) int test_strcmp_pagefault1(void *ctx) { return bpf_strcmp(invalid_kern_ptr, "hello"); } > SEC("syscall") __retval(-EFAULT) int test_strcmp_pagefault2(void *ctx) { return bpf_strcmp("hello", invalid_kern_ptr); } > +SEC("syscall") __retval(-EFAULT) int test_strcasecmp_pagefault1(void *ctx) { return bpf_strcasecmp(invalid_kern_ptr, "HELLO"); } > +SEC("syscall") __retval(-EFAULT) int test_strcasecmp_pagefault2(void *ctx) { return bpf_strcasecmp("HELLO", invalid_kern_ptr); } > SEC("syscall") __retval(-EFAULT) int test_strchr_pagefault(void *ctx) { return bpf_strchr(invalid_kern_ptr, 'a'); } > SEC("syscall") __retval(-EFAULT) int test_strchrnul_pagefault(void *ctx) { return bpf_strchrnul(invalid_kern_ptr, 'a'); } > SEC("syscall") __retval(-EFAULT) int test_strnchr_pagefault(void *ctx) { return bpf_strnchr(invalid_kern_ptr, 1, 'a'); } > diff --git a/tools/testing/selftests/bpf/progs/string_kfuncs_success.c b/tools/testing/selftests/bpf/progs/string_kfuncs_success.c > index 46697f381878..67830456637b 100644 > --- a/tools/testing/selftests/bpf/progs/string_kfuncs_success.c > +++ b/tools/testing/selftests/bpf/progs/string_kfuncs_success.c > @@ -12,6 +12,11 @@ char str[] = "hello world"; > /* Functional tests */ > __test(0) int test_strcmp_eq(void *ctx) { return bpf_strcmp(str, "hello world"); } > __test(1) int test_strcmp_neq(void *ctx) { return bpf_strcmp(str, "hello"); } > +__test(0) int test_strcasecmp_eq1(void *ctx) { return bpf_strcasecmp(str, "hello world"); } > +__test(0) int test_strcasecmp_eq2(void *ctx) { return bpf_strcasecmp(str, "HELLO WORLD"); } > +__test(0) int test_strcasecmp_eq3(void *ctx) { return bpf_strcasecmp(str, "HELLO world"); } > +__test(1) int test_strcasecmp_neq1(void *ctx) { return bpf_strcasecmp(str, "hello"); } > +__test(1) int test_strcasecmp_neq2(void *ctx) { return bpf_strcasecmp(str, "HELLO"); } > __test(1) int test_strchr_found(void *ctx) { return bpf_strchr(str, 'e'); } > __test(11) int test_strchr_null(void *ctx) { return bpf_strchr(str, '\0'); } > __test(-ENOENT) int test_strchr_notfound(void *ctx) { return bpf_strchr(str, 'x'); } Missing a test for returning -E2BIG in tools/testing/selftests/bpf/progs/string_kfuncs_failure2.c. Viktor ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-09-02 7:14 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <cover.1756793624.git.rongtao@cestc.cn>
2025-09-02 6:17 ` [PATCH bpf-next 1/2] bpf: add bpf_strcasecmp kfunc Rong Tao
2025-09-02 7:08 ` Viktor Malik
2025-09-02 7:14 ` Rong Tao
2025-09-02 6:18 ` [PATCH bpf-next 2/2] selftests/bpf: Test kfunc bpf_strcasecmp Rong Tao
2025-09-02 7:12 ` Viktor Malik
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®