summaryrefslogtreecommitdiffstats
path: root/tools/testing/selftests
diff options
context:
space:
mode:
authorIlya Leoshkevich <iii@linux.ibm.com>2019-08-16 06:53:00 -0400
committerDaniel Borkmann <daniel@iogearbox.net>2019-09-16 05:44:05 -0400
commitd895a0f16fadb26d22ab531c49768f7642ae5c3e (patch)
treed37c4f163bc37e8bce4150c075db214d7d1af389 /tools/testing/selftests
parentaf58e7ee6a8d83726ad8a2696e98d86400a7639c (diff)
bpf: fix accessing bpf_sysctl.file_pos on s390
"ctx:file_pos sysctl:read write ok" fails on s390 with "Read value != nux". This is because verifier rewrites a complete 32-bit bpf_sysctl.file_pos update to a partial update of the first 32 bits of 64-bit *bpf_sysctl_kern.ppos, which is not correct on big-endian systems. Fix by using an offset on big-endian systems. Ditto for bpf_sysctl.file_pos reads. Currently the test does not detect a problem there, since it expects to see 0, which it gets with high probability in error cases, so change it to seek to offset 3 and expect 3 in bpf_sysctl.file_pos. Fixes: e1550bfe0de4 ("bpf: Add file_pos field to bpf_sysctl ctx") Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> Acked-by: Yonghong Song <yhs@fb.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Link: https://lore.kernel.org/bpf/20190816105300.49035-1-iii@linux.ibm.com/
Diffstat (limited to 'tools/testing/selftests')
-rw-r--r--tools/testing/selftests/bpf/test_sysctl.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/tools/testing/selftests/bpf/test_sysctl.c b/tools/testing/selftests/bpf/test_sysctl.c
index fc33ae36b760..4f8ec1f10a80 100644
--- a/tools/testing/selftests/bpf/test_sysctl.c
+++ b/tools/testing/selftests/bpf/test_sysctl.c
@@ -32,6 +32,7 @@ struct sysctl_test {
32 enum bpf_attach_type attach_type; 32 enum bpf_attach_type attach_type;
33 const char *sysctl; 33 const char *sysctl;
34 int open_flags; 34 int open_flags;
35 int seek;
35 const char *newval; 36 const char *newval;
36 const char *oldval; 37 const char *oldval;
37 enum { 38 enum {
@@ -140,7 +141,7 @@ static struct sysctl_test tests[] = {
140 /* If (file_pos == X) */ 141 /* If (file_pos == X) */
141 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 142 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
142 offsetof(struct bpf_sysctl, file_pos)), 143 offsetof(struct bpf_sysctl, file_pos)),
143 BPF_JMP_IMM(BPF_JNE, BPF_REG_7, 0, 2), 144 BPF_JMP_IMM(BPF_JNE, BPF_REG_7, 3, 2),
144 145
145 /* return ALLOW; */ 146 /* return ALLOW; */
146 BPF_MOV64_IMM(BPF_REG_0, 1), 147 BPF_MOV64_IMM(BPF_REG_0, 1),
@@ -153,6 +154,7 @@ static struct sysctl_test tests[] = {
153 .attach_type = BPF_CGROUP_SYSCTL, 154 .attach_type = BPF_CGROUP_SYSCTL,
154 .sysctl = "kernel/ostype", 155 .sysctl = "kernel/ostype",
155 .open_flags = O_RDONLY, 156 .open_flags = O_RDONLY,
157 .seek = 3,
156 .result = SUCCESS, 158 .result = SUCCESS,
157 }, 159 },
158 { 160 {
@@ -1481,6 +1483,11 @@ static int access_sysctl(const char *sysctl_path,
1481 if (fd < 0) 1483 if (fd < 0)
1482 return fd; 1484 return fd;
1483 1485
1486 if (test->seek && lseek(fd, test->seek, SEEK_SET) == -1) {
1487 log_err("lseek(%d) failed", test->seek);
1488 goto err;
1489 }
1490
1484 if (test->open_flags == O_RDONLY) { 1491 if (test->open_flags == O_RDONLY) {
1485 char buf[128]; 1492 char buf[128];
1486 1493