diff options
| author | Ilya Leoshkevich <[email protected]> | 2021-02-12 04:04:08 +0000 |
|---|---|---|
| committer | Daniel Borkmann <[email protected]> | 2021-02-15 22:39:35 +0000 |
| commit | 45159b27637b0fef6d5ddb86fc7c46b13c77960f (patch) | |
| tree | 550e6c296b1553208bc69dedb62f60995e000daf /net/ipv6/tcp_ipv6.c | |
| parent | Merge branch 'Add support of pointer to struct in global' (diff) | |
| download | kernel-45159b27637b0fef6d5ddb86fc7c46b13c77960f.tar.gz kernel-45159b27637b0fef6d5ddb86fc7c46b13c77960f.zip | |
bpf: Clear subreg_def for global function return values
test_global_func4 fails on s390 as reported by Yauheni in [1].
The immediate problem is that the zext code includes the instruction,
whose result needs to be zero-extended, into the zero-extension
patchlet, and if this instruction happens to be a branch, then its
delta is not adjusted. As a result, the verifier rejects the program
later.
However, according to [2], as far as the verifier's algorithm is
concerned and as specified by the insn_no_def() function, branching
insns do not define anything. This includes call insns, even though
one might argue that they define %r0.
This means that the real problem is that zero extension kicks in at
all. This happens because clear_caller_saved_regs() sets BPF_REG_0's
subreg_def after global function calls. This can be fixed in many
ways; this patch mimics what helper function call handling already
does.
[1] https://lore.kernel.org/bpf/[email protected]/
[2] https://lore.kernel.org/bpf/CAADnVQ+2RPKcftZw8d+B1UwB35cpBhpF5u3OocNh90D9pETPwg@mail.gmail.com/
Fixes: 51c39bb1d5d1 ("bpf: Introduce function-by-function verification")
Reported-by: Yauheni Kaliuta <[email protected]>
Signed-off-by: Ilya Leoshkevich <[email protected]>
Signed-off-by: Daniel Borkmann <[email protected]>
Link: https://lore.kernel.org/bpf/[email protected]
Diffstat (limited to 'net/ipv6/tcp_ipv6.c')
0 files changed, 0 insertions, 0 deletions
