Update BPF cgroup sockaddr filtering infrastructure to use sockaddr_unspec
consistently throughout the call chain, removing redundant explicit casts
from callers.

Signed-off-by: Kees Cook <[email protected]>
---
Cc: Alexei Starovoitov <[email protected]>
Cc: Daniel Borkmann <[email protected]>
Cc: John Fastabend <[email protected]>
Cc: Andrii Nakryiko <[email protected]>
Cc: Martin KaFai Lau <[email protected]>
Cc: Eduard Zingerman <[email protected]>
Cc: Song Liu <[email protected]>
Cc: Yonghong Song <[email protected]>
Cc: KP Singh <[email protected]>
Cc: Stanislav Fomichev <[email protected]>
Cc: Hao Luo <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: David Ahern <[email protected]>
Cc: Eric Dumazet <[email protected]>
Cc: Jakub Kicinski <[email protected]>
Cc: Paolo Abeni <[email protected]>
Cc: Simon Horman <[email protected]>
Cc: <[email protected]>
Cc: <[email protected]>
---
 include/linux/bpf-cgroup.h | 17 ++++++++++-------
 kernel/bpf/cgroup.c        |  4 ++--
 net/ipv4/af_inet.c         |  4 ++--
 3 files changed, 14 insertions(+), 11 deletions(-)

diff --git a/include/linux/bpf-cgroup.h b/include/linux/bpf-cgroup.h
index a7fb4f46974f..f9db69cef833 100644
--- a/include/linux/bpf-cgroup.h
+++ b/include/linux/bpf-cgroup.h
@@ -120,7 +120,7 @@ int __cgroup_bpf_run_filter_sk(struct sock *sk,
                               enum cgroup_bpf_attach_type atype);
 
 int __cgroup_bpf_run_filter_sock_addr(struct sock *sk,
-                                     struct sockaddr *uaddr,
+                                     struct sockaddr_unspec *uaddr,
                                      int *uaddrlen,
                                      enum cgroup_bpf_attach_type atype,
                                      void *t_ctx,
@@ -238,8 +238,9 @@ static inline bool cgroup_bpf_sock_enabled(struct sock *sk,
 ({                                                                            \
        int __ret = 0;                                                         \
        if (cgroup_bpf_enabled(atype))                                         \
-               __ret = __cgroup_bpf_run_filter_sock_addr(sk, (struct sockaddr 
*)uaddr, uaddrlen, \
-                                                         atype, NULL, NULL);  \
+               __ret = __cgroup_bpf_run_filter_sock_addr(sk,                  \
+                               (struct sockaddr_unspec *)uaddr, uaddrlen,     \
+                               atype, NULL, NULL);                            \
        __ret;                                                                 \
 })
 
@@ -248,8 +249,9 @@ static inline bool cgroup_bpf_sock_enabled(struct sock *sk,
        int __ret = 0;                                                         \
        if (cgroup_bpf_enabled(atype))  {                                      \
                lock_sock(sk);                                                 \
-               __ret = __cgroup_bpf_run_filter_sock_addr(sk, (struct sockaddr 
*)uaddr, uaddrlen, \
-                                                         atype, t_ctx, NULL); \
+               __ret = __cgroup_bpf_run_filter_sock_addr(sk,                  \
+                               (struct sockaddr_unspec *)uaddr, uaddrlen,     \
+                               atype, t_ctx, NULL);                           \
                release_sock(sk);                                              \
        }                                                                      \
        __ret;                                                                 \
@@ -266,8 +268,9 @@ static inline bool cgroup_bpf_sock_enabled(struct sock *sk,
        int __ret = 0;                                                         \
        if (cgroup_bpf_enabled(atype))  {                                      \
                lock_sock(sk);                                                 \
-               __ret = __cgroup_bpf_run_filter_sock_addr(sk, (struct sockaddr 
*)uaddr, uaddrlen, \
-                                                         atype, NULL, 
&__flags); \
+               __ret = __cgroup_bpf_run_filter_sock_addr(sk,                  \
+                               (struct sockaddr_unspec *)uaddr, uaddrlen,     \
+                               atype, NULL, &__flags);                        \
                release_sock(sk);                                              \
                if (__flags & BPF_RET_BIND_NO_CAP_NET_BIND_SERVICE)            \
                        *bind_flags |= BIND_NO_CAP_NET_BIND_SERVICE;           \
diff --git a/kernel/bpf/cgroup.c b/kernel/bpf/cgroup.c
index 248f517d66d0..af8b070e71ba 100644
--- a/kernel/bpf/cgroup.c
+++ b/kernel/bpf/cgroup.c
@@ -1665,7 +1665,7 @@ EXPORT_SYMBOL(__cgroup_bpf_run_filter_sk);
  * returned value != 1 during execution. In all other cases, 0 is returned.
  */
 int __cgroup_bpf_run_filter_sock_addr(struct sock *sk,
-                                     struct sockaddr *uaddr,
+                                     struct sockaddr_unspec *uaddr,
                                      int *uaddrlen,
                                      enum cgroup_bpf_attach_type atype,
                                      void *t_ctx,
@@ -1673,7 +1673,7 @@ int __cgroup_bpf_run_filter_sock_addr(struct sock *sk,
 {
        struct bpf_sock_addr_kern ctx = {
                .sk = sk,
-               .uaddr = uaddr,
+               .uaddr = (struct sockaddr *)uaddr,
                .t_ctx = t_ctx,
        };
        struct sockaddr_storage unspec;
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
index 74a71f3c9ada..07b164f8529d 100644
--- a/net/ipv4/af_inet.c
+++ b/net/ipv4/af_inet.c
@@ -813,7 +813,7 @@ int inet_getname(struct socket *sock, struct sockaddr 
*uaddr,
                }
                sin->sin_port = inet->inet_dport;
                sin->sin_addr.s_addr = inet->inet_daddr;
-               BPF_CGROUP_RUN_SA_PROG(sk, (struct sockaddr *)sin, 
&sin_addr_len,
+               BPF_CGROUP_RUN_SA_PROG(sk, sin, &sin_addr_len,
                                       CGROUP_INET4_GETPEERNAME);
        } else {
                __be32 addr = inet->inet_rcv_saddr;
@@ -821,7 +821,7 @@ int inet_getname(struct socket *sock, struct sockaddr 
*uaddr,
                        addr = inet->inet_saddr;
                sin->sin_port = inet->inet_sport;
                sin->sin_addr.s_addr = addr;
-               BPF_CGROUP_RUN_SA_PROG(sk, (struct sockaddr *)sin, 
&sin_addr_len,
+               BPF_CGROUP_RUN_SA_PROG(sk, sin, &sin_addr_len,
                                       CGROUP_INET4_GETSOCKNAME);
        }
        release_sock(sk);
-- 
2.34.1


Reply via email to