On 7/16/26 11:34, Rong Tao wrote:
> From: Rong Tao <[email protected]>
> 
> Add tests for new kfuncs bpf_strcat() and bpf_strncat().
> 
> Signed-off-by: Rong Tao <[email protected]>
> ---
>  .../testing/selftests/bpf/prog_tests/string_kfuncs.c  |  2 ++
>  .../selftests/bpf/progs/string_kfuncs_failure1.c      | 11 +++++++++++
>  .../selftests/bpf/progs/string_kfuncs_failure2.c      |  2 ++
>  .../selftests/bpf/progs/string_kfuncs_success.c       |  4 ++++
>  4 files changed, 19 insertions(+)
> 
> diff --git a/tools/testing/selftests/bpf/prog_tests/string_kfuncs.c 
> b/tools/testing/selftests/bpf/prog_tests/string_kfuncs.c
> index 300032a19445..460567ef622a 100644
> --- a/tools/testing/selftests/bpf/prog_tests/string_kfuncs.c
> +++ b/tools/testing/selftests/bpf/prog_tests/string_kfuncs.c
> @@ -24,6 +24,8 @@ static const char * const test_cases[] = {
>       "strcasestr",
>       "strnstr",
>       "strncasestr",
> +     "strcat",
> +     "strncat",
>  };
>  
>  void run_too_long_tests(void)
> diff --git a/tools/testing/selftests/bpf/progs/string_kfuncs_failure1.c 
> b/tools/testing/selftests/bpf/progs/string_kfuncs_failure1.c
> index bddc4e8579d2..973a6ba643d4 100644
> --- a/tools/testing/selftests/bpf/progs/string_kfuncs_failure1.c
> +++ b/tools/testing/selftests/bpf/progs/string_kfuncs_failure1.c
> @@ -8,6 +8,7 @@
>  
>  char *user_ptr = (char *)1;
>  char *invalid_kern_ptr = (char *)-1;
> +char kern_buf[32] = { "hello" };
>  
>  /*
>   * When passing userspace pointers, the error code differs based on arch:
> @@ -53,6 +54,8 @@ SEC("syscall")  __retval(USER_PTR_ERR)int 
> test_strnstr_null1(void *ctx) { return
>  SEC("syscall")  __retval(USER_PTR_ERR)int test_strnstr_null2(void *ctx) { 
> return bpf_strnstr("hello", NULL, 1); }
>  SEC("syscall")  __retval(USER_PTR_ERR)int test_strncasestr_null1(void *ctx) 
> { return bpf_strncasestr(NULL, "hello", 1); }
>  SEC("syscall")  __retval(USER_PTR_ERR)int test_strncasestr_null2(void *ctx) 
> { return bpf_strncasestr("hello", NULL, 1); }
> +SEC("syscall")  __retval(USER_PTR_ERR)int test_strcat_null1(void *ctx) { 
> return bpf_strcat(kern_buf, sizeof(kern_buf), NULL); }
> +SEC("syscall")  __retval(USER_PTR_ERR)int test_strncat_null1(void *ctx) { 
> return bpf_strncat(kern_buf, sizeof(kern_buf), NULL, 2); }
>  
>  /* 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"); }
> @@ -79,6 +82,10 @@ SEC("syscall") __retval(USER_PTR_ERR) int 
> test_strnstr_user_ptr1(void *ctx) { re
>  SEC("syscall") __retval(USER_PTR_ERR) int test_strnstr_user_ptr2(void *ctx) 
> { return bpf_strnstr("hello", user_ptr, 1); }
>  SEC("syscall") __retval(USER_PTR_ERR) int test_strncasestr_user_ptr1(void 
> *ctx) { return bpf_strncasestr(user_ptr, "hello", 1); }
>  SEC("syscall") __retval(USER_PTR_ERR) int test_strncasestr_user_ptr2(void 
> *ctx) { return bpf_strncasestr("hello", user_ptr, 1); }
> +SEC("syscall") __retval(USER_PTR_ERR) int test_strcat_user_ptr1(void *ctx) { 
> return bpf_strcat(user_ptr, 1, "hello"); }
> +SEC("syscall") __retval(USER_PTR_ERR) int test_strcat_user_ptr2(void *ctx) { 
> return bpf_strcat(kern_buf, sizeof(kern_buf), user_ptr); }
> +SEC("syscall") __retval(USER_PTR_ERR) int test_strncat_user_ptr1(void *ctx) 
> { return bpf_strncat(user_ptr, 1, "hello", 2); }
> +SEC("syscall") __retval(USER_PTR_ERR) int test_strncat_user_ptr2(void *ctx) 
> { return bpf_strncat(kern_buf, sizeof(kern_buf), user_ptr, 1); }
>  
>  #endif /* __TARGET_ARCH_s390 */
>  
> @@ -107,5 +114,9 @@ SEC("syscall") __retval(-EFAULT) int 
> test_strnstr_pagefault1(void *ctx) { return
>  SEC("syscall") __retval(-EFAULT) int test_strnstr_pagefault2(void *ctx) { 
> return bpf_strnstr("hello", invalid_kern_ptr, 1); }
>  SEC("syscall") __retval(-EFAULT) int test_strncasestr_pagefault1(void *ctx) 
> { return bpf_strncasestr(invalid_kern_ptr, "hello", 1); }
>  SEC("syscall") __retval(-EFAULT) int test_strncasestr_pagefault2(void *ctx) 
> { return bpf_strncasestr("hello", invalid_kern_ptr, 1); }
> +SEC("syscall") __retval(-EFAULT) int test_strcat_pagefault1(void *ctx) { 
> return bpf_strcat(invalid_kern_ptr, 1, "hello"); }
> +SEC("syscall") __retval(-EFAULT) int test_strcat_pagefault2(void *ctx) { 
> return bpf_strcat(kern_buf, sizeof(kern_buf), invalid_kern_ptr); }
> +SEC("syscall") __retval(-EFAULT) int test_strncat_pagefault1(void *ctx) { 
> return bpf_strncat(invalid_kern_ptr, 1, "hello", 2); }
> +SEC("syscall") __retval(-EFAULT) int test_strncat_pagefault2(void *ctx) { 
> return bpf_strncat(kern_buf, sizeof(kern_buf), invalid_kern_ptr, 2); }
>  
>  char _license[] SEC("license") = "GPL";
> diff --git a/tools/testing/selftests/bpf/progs/string_kfuncs_failure2.c 
> b/tools/testing/selftests/bpf/progs/string_kfuncs_failure2.c
> index 412c53b87b18..38f0a5f326b5 100644
> --- a/tools/testing/selftests/bpf/progs/string_kfuncs_failure2.c
> +++ b/tools/testing/selftests/bpf/progs/string_kfuncs_failure2.c
> @@ -23,5 +23,7 @@ SEC("syscall") int test_strstr_too_long(void *ctx) { return 
> bpf_strstr(long_str,
>  SEC("syscall") int test_strcasestr_too_long(void *ctx) { return 
> bpf_strcasestr(long_str, "hello"); }
>  SEC("syscall") int test_strnstr_too_long(void *ctx) { return 
> bpf_strnstr(long_str, "hello", sizeof(long_str)); }
>  SEC("syscall") int test_strncasestr_too_long(void *ctx) { return 
> bpf_strncasestr(long_str, "hello", sizeof(long_str)); }
> +SEC("syscall") int test_strcat_too_long(void *ctx) { return 
> bpf_strcat(long_str, sizeof(long_str), "hello"); }
> +SEC("syscall") int test_strncat_too_long(void *ctx) { return 
> bpf_strncat(long_str, sizeof(long_str), "hello", 3); }
>  
>  char _license[] SEC("license") = "GPL";
> diff --git a/tools/testing/selftests/bpf/progs/string_kfuncs_success.c 
> b/tools/testing/selftests/bpf/progs/string_kfuncs_success.c
> index f65b1226a81a..b24456ad3d43 100644
> --- a/tools/testing/selftests/bpf/progs/string_kfuncs_success.c
> +++ b/tools/testing/selftests/bpf/progs/string_kfuncs_success.c
> @@ -6,6 +6,8 @@
>  #include "errno.h"
>  
>  char str[] = "hello world";
> +char buf1[32] = "hello";
> +char buf2[32] = "hello";
>  
>  #define __test(retval) SEC("syscall") __success __retval(retval)
>  
> @@ -59,5 +61,7 @@ __test(-ENOENT) int test_strncasestr_notfound1(void *ctx) { 
> return bpf_strncases
>  __test(-ENOENT) int test_strncasestr_notfound2(void *ctx) { return 
> bpf_strncasestr(str, "hello", 4); }
>  __test(-ENOENT) int test_strncasestr_notfound3(void *ctx) { return 
> bpf_strncasestr("", "a", 0); }
>  __test(0) int test_strncasestr_empty(void *ctx) { return 
> bpf_strncasestr(str, "", 1); }
> +__test(10) int test_strcat_success(void *ctx) { return bpf_strcat(buf1, 
> sizeof(buf1), "world"); }
> +__test(8) int test_strncat_success(void *ctx) { return bpf_strncat(buf2, 
> sizeof(buf2), "world", 3); }

We should also add tests that verify that the string was actually
copied.

Viktor

>  
>  char _license[] SEC("license") = "GPL";


Reply via email to