mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
selftests/bpf: Cover 4-byte load from remote_port in bpf_sk_lookup
Extend the context access tests for sk_lookup prog to cover the surprising case of a 4-byte load from the remote_port field, where the expected value is actually shifted by 16 bits. Signed-off-by: Jakub Sitnicki <jakub@cloudflare.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Acked-by: Yonghong Song <yhs@fb.com> Link: https://lore.kernel.org/bpf/20220209184333.654927-3-jakub@cloudflare.com
This commit is contained in:
parent
9a69e2b385
commit
2ed0dc5937
2 changed files with 8 additions and 1 deletions
|
@ -6453,7 +6453,8 @@ struct bpf_sk_lookup {
|
|||
__u32 protocol; /* IP protocol (IPPROTO_TCP, IPPROTO_UDP) */
|
||||
__u32 remote_ip4; /* Network byte order */
|
||||
__u32 remote_ip6[4]; /* Network byte order */
|
||||
__u32 remote_port; /* Network byte order */
|
||||
__be16 remote_port; /* Network byte order */
|
||||
__u16 :16; /* Zero padding */
|
||||
__u32 local_ip4; /* Network byte order */
|
||||
__u32 local_ip6[4]; /* Network byte order */
|
||||
__u32 local_port; /* Host byte order */
|
||||
|
|
|
@ -392,6 +392,7 @@ int ctx_narrow_access(struct bpf_sk_lookup *ctx)
|
|||
{
|
||||
struct bpf_sock *sk;
|
||||
int err, family;
|
||||
__u32 val_u32;
|
||||
bool v4;
|
||||
|
||||
v4 = (ctx->family == AF_INET);
|
||||
|
@ -418,6 +419,11 @@ int ctx_narrow_access(struct bpf_sk_lookup *ctx)
|
|||
if (LSW(ctx->remote_port, 0) != SRC_PORT)
|
||||
return SK_DROP;
|
||||
|
||||
/* Load from remote_port field with zero padding (backward compatibility) */
|
||||
val_u32 = *(__u32 *)&ctx->remote_port;
|
||||
if (val_u32 != bpf_htonl(bpf_ntohs(SRC_PORT) << 16))
|
||||
return SK_DROP;
|
||||
|
||||
/* Narrow loads from local_port field. Expect DST_PORT. */
|
||||
if (LSB(ctx->local_port, 0) != ((DST_PORT >> 0) & 0xff) ||
|
||||
LSB(ctx->local_port, 1) != ((DST_PORT >> 8) & 0xff) ||
|
||||
|
|
Loading…
Reference in a new issue