History

net: switch copy_bpf_fprog_from_user to sockptr_t

Pass a sockptr_t to prepare for set_fs-less handling of the kernel pointer from bpf-cgroup.

Christoph Hellwig committed 6 years ago

Commit b1ea9ff1 parent ba423fd4 files · +11 −8Browse files

Unified · Split

4 files
  1. include/linux/filter.h +2 −1
  2. net/core/filter.c +3 −3
  3. net/core/sock.c +4 −2
  4. net/packet/af_packet.c +2 −2
include/linux/filter.h+2−1
@@ -20,6 +20,7 @@ · 19 unmodified lines
2020 #include <linux/kallsyms.h>
2121 #include <linux/if_vlan.h>
2222 #include <linux/vmalloc.h>
23+#include <linux/sockptr.h>
2324 #include <crypto/sha.h>
2425
2526 #include <net/sch_generic.h>
@@ -1276,7 +1277,7 @@ struct bpf_sockopt_kern { · 1250 unmodified lines
12761277 s32 retval;
12771278 };
12781279
1279−int copy_bpf_fprog_from_user(struct sock_fprog *dst, void __user *src, int len);
1280+int copy_bpf_fprog_from_user(struct sock_fprog *dst, sockptr_t src, int len);
12801281
12811282 struct bpf_sk_lookup_kern {
12821283 u16 family;
net/core/filter.c+3−3
@@ -77,14 +77,14 @@ · 76 unmodified lines
7777 #include <net/transp_v6.h>
7878 #include <linux/btf_ids.h>
7979
80−int copy_bpf_fprog_from_user(struct sock_fprog *dst, void __user *src, int len)
80+int copy_bpf_fprog_from_user(struct sock_fprog *dst, sockptr_t src, int len)
8181 {
8282 if (in_compat_syscall()) {
8383 struct compat_sock_fprog f32;
8484
8585 if (len != sizeof(f32))
8686 return -EINVAL;
87− if (copy_from_user(&f32, src, sizeof(f32)))
87+ if (copy_from_sockptr(&f32, src, sizeof(f32)))
8888 return -EFAULT;
8989 memset(dst, 0, sizeof(*dst));
9090 dst->len = f32.len;
@@ -92,7 +92,7 @@ int copy_bpf_fprog_from_user(struct sock_fprog *dst, void __user *src, int len) · 1 unmodified line
9292 } else {
9393 if (len != sizeof(*dst))
9494 return -EINVAL;
95− if (copy_from_user(dst, src, sizeof(*dst)))
95+ if (copy_from_sockptr(dst, src, sizeof(*dst)))
9696 return -EFAULT;
9797 }
9898
net/core/sock.c+4−2
@@ -1063,7 +1063,8 @@ set_sndbuf: · 1062 unmodified lines
10631063 case SO_ATTACH_FILTER: {
10641064 struct sock_fprog fprog;
10651065
1066− ret = copy_bpf_fprog_from_user(&fprog, optval, optlen);
1066+ ret = copy_bpf_fprog_from_user(&fprog, USER_SOCKPTR(optval),
1067+ optlen);
10671068 if (!ret)
10681069 ret = sk_attach_filter(&fprog, sk);
10691070 break;
@@ -1084,7 +1085,8 @@ set_sndbuf: · 14 unmodified lines
10841085 case SO_ATTACH_REUSEPORT_CBPF: {
10851086 struct sock_fprog fprog;
10861087
1087− ret = copy_bpf_fprog_from_user(&fprog, optval, optlen);
1088+ ret = copy_bpf_fprog_from_user(&fprog, USER_SOCKPTR(optval),
1089+ optlen);
10881090 if (!ret)
10891091 ret = sk_reuseport_attach_filter(&fprog, sk);
10901092 break;
net/packet/af_packet.c+2−2
@@ -1536,7 +1536,7 @@ static void __fanout_set_data_bpf(struct packet_fanout *f, struct bpf_prog *new) · 1535 unmodified lines
15361536 }
15371537 }
15381538
1539−static int fanout_set_data_cbpf(struct packet_sock *po, char __user *data,
1539+static int fanout_set_data_cbpf(struct packet_sock *po, sockptr_t data,
15401540 unsigned int len)
15411541 {
15421542 struct bpf_prog *new;
@@ -1584,7 +1584,7 @@ static int fanout_set_data(struct packet_sock *po, char __user *data, · 41 unmodified lines
15841584 {
15851585 switch (po->fanout->type) {
15861586 case PACKET_FANOUT_CBPF:
1587− return fanout_set_data_cbpf(po, data, len);
1587+ return fanout_set_data_cbpf(po, USER_SOCKPTR(data), len);
15881588 case PACKET_FANOUT_EBPF:
15891589 return fanout_set_data_ebpf(po, data, len);
15901590 default: