tcp: fix tcp_set_congestion_control() use from bpf hook
[linux-2.6-block.git] / net / core / filter.c
index 47f6386fb17afbd41c2685097b9eac75d92c634b..4e2a79b2fd77f36ba2a31e9e43af1abc1207766e 100644 (file)
@@ -4335,7 +4335,7 @@ BPF_CALL_5(bpf_setsockopt, struct bpf_sock_ops_kern *, bpf_sock,
                                                    TCP_CA_NAME_MAX-1));
                        name[TCP_CA_NAME_MAX-1] = 0;
                        ret = tcp_set_congestion_control(sk, name, false,
-                                                        reinit);
+                                                        reinit, true);
                } else {
                        struct tcp_sock *tp = tcp_sk(sk);
 
@@ -6884,20 +6884,30 @@ static bool sock_addr_is_valid_access(int off, int size,
        case bpf_ctx_range(struct bpf_sock_addr, msg_src_ip4):
        case bpf_ctx_range_till(struct bpf_sock_addr, msg_src_ip6[0],
                                msg_src_ip6[3]):
-               /* Only narrow read access allowed for now. */
                if (type == BPF_READ) {
                        bpf_ctx_record_field_size(info, size_default);
+
+                       if (bpf_ctx_wide_access_ok(off, size,
+                                                  struct bpf_sock_addr,
+                                                  user_ip6))
+                               return true;
+
+                       if (bpf_ctx_wide_access_ok(off, size,
+                                                  struct bpf_sock_addr,
+                                                  msg_src_ip6))
+                               return true;
+
                        if (!bpf_ctx_narrow_access_ok(off, size, size_default))
                                return false;
                } else {
-                       if (bpf_ctx_wide_store_ok(off, size,
-                                                 struct bpf_sock_addr,
-                                                 user_ip6))
+                       if (bpf_ctx_wide_access_ok(off, size,
+                                                  struct bpf_sock_addr,
+                                                  user_ip6))
                                return true;
 
-                       if (bpf_ctx_wide_store_ok(off, size,
-                                                 struct bpf_sock_addr,
-                                                 msg_src_ip6))
+                       if (bpf_ctx_wide_access_ok(off, size,
+                                                  struct bpf_sock_addr,
+                                                  msg_src_ip6))
                                return true;
 
                        if (size != size_default)