mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-13 22:56:27 +08:00
selftests/bpf: Pass page size from userspace in sockopt_sk
Since there is no convenient way for bpf program to get PAGE_SIZE from inside of the kernel, pass the value from userspace. Zero-initialize the variable in bpf prog, otherwise it will cause problems on some versions of Clang. Signed-off-by: Yauheni Kaliuta <yauheni.kaliuta@redhat.com> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/bpf/20210408061310.95877-3-yauheni.kaliuta@redhat.com
This commit is contained in:
parent
cad99cce13
commit
361d32028c
@ -200,6 +200,8 @@ static void run_test(int cgroup_fd)
|
||||
if (!ASSERT_OK_PTR(skel, "skel_load"))
|
||||
goto cleanup;
|
||||
|
||||
skel->bss->page_size = getpagesize();
|
||||
|
||||
skel->links._setsockopt =
|
||||
bpf_program__attach_cgroup(skel->progs._setsockopt, cgroup_fd);
|
||||
if (!ASSERT_OK_PTR(skel->links._setsockopt, "setsockopt_link"))
|
||||
|
@ -7,9 +7,7 @@
|
||||
|
||||
char _license[] SEC("license") = "GPL";
|
||||
|
||||
#ifndef PAGE_SIZE
|
||||
#define PAGE_SIZE 4096
|
||||
#endif
|
||||
int page_size = 0; /* userspace should set it */
|
||||
|
||||
#ifndef SOL_TCP
|
||||
#define SOL_TCP IPPROTO_TCP
|
||||
@ -89,7 +87,7 @@ int _getsockopt(struct bpf_sockopt *ctx)
|
||||
* program can only see the first PAGE_SIZE
|
||||
* bytes of data.
|
||||
*/
|
||||
if (optval_end - optval != PAGE_SIZE)
|
||||
if (optval_end - optval != page_size)
|
||||
return 0; /* EPERM, unexpected data size */
|
||||
|
||||
return 1;
|
||||
@ -160,7 +158,7 @@ int _setsockopt(struct bpf_sockopt *ctx)
|
||||
|
||||
if (ctx->level == SOL_IP && ctx->optname == IP_FREEBIND) {
|
||||
/* Original optlen is larger than PAGE_SIZE. */
|
||||
if (ctx->optlen != PAGE_SIZE * 2)
|
||||
if (ctx->optlen != page_size * 2)
|
||||
return 0; /* EPERM, unexpected data size */
|
||||
|
||||
if (optval + 1 > optval_end)
|
||||
@ -174,7 +172,7 @@ int _setsockopt(struct bpf_sockopt *ctx)
|
||||
* program can only see the first PAGE_SIZE
|
||||
* bytes of data.
|
||||
*/
|
||||
if (optval_end - optval != PAGE_SIZE)
|
||||
if (optval_end - optval != page_size)
|
||||
return 0; /* EPERM, unexpected data size */
|
||||
|
||||
return 1;
|
||||
|
Loading…
Reference in New Issue
Block a user