Skip to content

Commit bd61b3a

Browse files
keesKernel Patches Daemon
authored andcommitted
bpf: Convert cgroup sockaddr filters to use sockaddr_unspec consistently
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]>
1 parent 938cf2e commit bd61b3a

File tree

3 files changed

+14
-11
lines changed

3 files changed

+14
-11
lines changed

include/linux/bpf-cgroup.h

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ int __cgroup_bpf_run_filter_sk(struct sock *sk,
120120
enum cgroup_bpf_attach_type atype);
121121

122122
int __cgroup_bpf_run_filter_sock_addr(struct sock *sk,
123-
struct sockaddr *uaddr,
123+
struct sockaddr_unspec *uaddr,
124124
int *uaddrlen,
125125
enum cgroup_bpf_attach_type atype,
126126
void *t_ctx,
@@ -238,8 +238,9 @@ static inline bool cgroup_bpf_sock_enabled(struct sock *sk,
238238
({ \
239239
int __ret = 0; \
240240
if (cgroup_bpf_enabled(atype)) \
241-
__ret = __cgroup_bpf_run_filter_sock_addr(sk, (struct sockaddr *)uaddr, uaddrlen, \
242-
atype, NULL, NULL); \
241+
__ret = __cgroup_bpf_run_filter_sock_addr(sk, \
242+
(struct sockaddr_unspec *)uaddr, uaddrlen, \
243+
atype, NULL, NULL); \
243244
__ret; \
244245
})
245246

@@ -248,8 +249,9 @@ static inline bool cgroup_bpf_sock_enabled(struct sock *sk,
248249
int __ret = 0; \
249250
if (cgroup_bpf_enabled(atype)) { \
250251
lock_sock(sk); \
251-
__ret = __cgroup_bpf_run_filter_sock_addr(sk, (struct sockaddr *)uaddr, uaddrlen, \
252-
atype, t_ctx, NULL); \
252+
__ret = __cgroup_bpf_run_filter_sock_addr(sk, \
253+
(struct sockaddr_unspec *)uaddr, uaddrlen, \
254+
atype, t_ctx, NULL); \
253255
release_sock(sk); \
254256
} \
255257
__ret; \
@@ -266,8 +268,9 @@ static inline bool cgroup_bpf_sock_enabled(struct sock *sk,
266268
int __ret = 0; \
267269
if (cgroup_bpf_enabled(atype)) { \
268270
lock_sock(sk); \
269-
__ret = __cgroup_bpf_run_filter_sock_addr(sk, (struct sockaddr *)uaddr, uaddrlen, \
270-
atype, NULL, &__flags); \
271+
__ret = __cgroup_bpf_run_filter_sock_addr(sk, \
272+
(struct sockaddr_unspec *)uaddr, uaddrlen, \
273+
atype, NULL, &__flags); \
271274
release_sock(sk); \
272275
if (__flags & BPF_RET_BIND_NO_CAP_NET_BIND_SERVICE) \
273276
*bind_flags |= BIND_NO_CAP_NET_BIND_SERVICE; \

kernel/bpf/cgroup.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1665,15 +1665,15 @@ EXPORT_SYMBOL(__cgroup_bpf_run_filter_sk);
16651665
* returned value != 1 during execution. In all other cases, 0 is returned.
16661666
*/
16671667
int __cgroup_bpf_run_filter_sock_addr(struct sock *sk,
1668-
struct sockaddr *uaddr,
1668+
struct sockaddr_unspec *uaddr,
16691669
int *uaddrlen,
16701670
enum cgroup_bpf_attach_type atype,
16711671
void *t_ctx,
16721672
u32 *flags)
16731673
{
16741674
struct bpf_sock_addr_kern ctx = {
16751675
.sk = sk,
1676-
.uaddr = uaddr,
1676+
.uaddr = (struct sockaddr *)uaddr,
16771677
.t_ctx = t_ctx,
16781678
};
16791679
struct sockaddr_storage unspec;

net/ipv4/af_inet.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -813,15 +813,15 @@ int inet_getname(struct socket *sock, struct sockaddr *uaddr,
813813
}
814814
sin->sin_port = inet->inet_dport;
815815
sin->sin_addr.s_addr = inet->inet_daddr;
816-
BPF_CGROUP_RUN_SA_PROG(sk, (struct sockaddr *)sin, &sin_addr_len,
816+
BPF_CGROUP_RUN_SA_PROG(sk, sin, &sin_addr_len,
817817
CGROUP_INET4_GETPEERNAME);
818818
} else {
819819
__be32 addr = inet->inet_rcv_saddr;
820820
if (!addr)
821821
addr = inet->inet_saddr;
822822
sin->sin_port = inet->inet_sport;
823823
sin->sin_addr.s_addr = addr;
824-
BPF_CGROUP_RUN_SA_PROG(sk, (struct sockaddr *)sin, &sin_addr_len,
824+
BPF_CGROUP_RUN_SA_PROG(sk, sin, &sin_addr_len,
825825
CGROUP_INET4_GETSOCKNAME);
826826
}
827827
release_sock(sk);

0 commit comments

Comments
 (0)