mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-10 21:14:56 -04:00
Merge branch 'fix-bpf_strnstr-len-error'
Rong Tao says:
====================
Fix bpf_strnstr() wrong 'len' parameter, bpf_strnstr("open", "open", 4)
should return 0 instead of -ENOENT. And fix a more general case when s2
is a suffix of the first len characters of s1.
====================
Link: https://patch.msgid.link/tencent_E72A37AF03A3B18853066E421B5969976208@qq.com
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
@@ -3664,10 +3664,17 @@ __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;
|
||||
/*
|
||||
* We allow reading an extra byte from s2 (note the
|
||||
* `i + j <= len` above) to cover the case when s2 is
|
||||
* a suffix of the first len chars of s1.
|
||||
*/
|
||||
if (i + j == len)
|
||||
break;
|
||||
__get_kernel_nofault(&c1, s1__ign + j, char, err_out);
|
||||
if (c1 == '\0')
|
||||
return -ENOENT;
|
||||
|
||||
@@ -30,8 +30,12 @@ __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(-ENOENT) int test_strnstr_notfound(void *ctx) { return bpf_strnstr(str, "hi", 10); }
|
||||
__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_notfound1(void *ctx) { return bpf_strnstr(str, "hi", 10); }
|
||||
__test(-ENOENT) int test_strnstr_notfound2(void *ctx) { return bpf_strnstr(str, "hello", 4); }
|
||||
__test(-ENOENT) int test_strnstr_notfound3(void *ctx) { return bpf_strnstr("", "a", 0); }
|
||||
__test(0) int test_strnstr_empty(void *ctx) { return bpf_strnstr(str, "", 1); }
|
||||
|
||||
char _license[] SEC("license") = "GPL";
|
||||
|
||||
Reference in New Issue
Block a user