Re: [PATCH] bpf: selftests: test_verifier: mask bpf_csum_diff() return value to 16 bits

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 2/28/21 2:30 AM, Yauheni Kaliuta wrote:
The verifier test labelled "valid read map access into a read-only array
2" calls the bpf_csum_diff() helper and checks its return value.
However, architecture implementations of csum_partial() (which is what
the helper uses) differ in whether they fold the return value to 16 bit
or not. For example, x86 version has:

	if (unlikely(odd)) {
		result = from32to16(result);
		result = ((result >> 8) & 0xff) | ((result & 0xff) << 8);
	}

while generic lib/checksum.c does:

	result = from32to16(result);
	if (odd)
		result = ((result >> 8) & 0xff) | ((result & 0xff) << 8);

This makes the helper return different values on different
architectures, breaking the test on non-x86. To fix this, add an

I remember there is a previous discussion for this issue, csum_diff()
returns different results for different architecture? Daniel?
Any conclusion how to deal with this?

additional instruction to always mask the return value to 16 bits, and
update the expected return value accordingly.

Fixes: fb2abb73e575 ("bpf, selftest: test {rd, wr}only flags and direct value access")
Signed-off-by: Yauheni Kaliuta <yauheni.kaliuta@xxxxxxxxxx>
---
  tools/testing/selftests/bpf/verifier/array_access.c | 3 ++-
  1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/bpf/verifier/array_access.c b/tools/testing/selftests/bpf/verifier/array_access.c
index bed53b561e04..1b138cd2b187 100644
--- a/tools/testing/selftests/bpf/verifier/array_access.c
+++ b/tools/testing/selftests/bpf/verifier/array_access.c
@@ -250,12 +250,13 @@
  	BPF_MOV64_IMM(BPF_REG_5, 0),
  	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
  		     BPF_FUNC_csum_diff),
+	BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0xffff),
  	BPF_EXIT_INSN(),
  	},
  	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
  	.fixup_map_array_ro = { 3 },
  	.result = ACCEPT,
-	.retval = -29,
+	.retval = 65507,
  },
  {
  	"invalid write map access into a read-only array 1",




[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux