diff options
| -rw-r--r-- | kernel/bpf/sockmap.c | 12 | ||||
| -rw-r--r-- | kernel/bpf/syscall.c | 24 |
2 files changed, 22 insertions, 14 deletions
diff --git a/kernel/bpf/sockmap.c b/kernel/bpf/sockmap.c index d2bda5aa25d7..8dd9210d7db7 100644 --- a/kernel/bpf/sockmap.c +++ b/kernel/bpf/sockmap.c | |||
| @@ -182,8 +182,10 @@ static void bpf_tcp_release(struct sock *sk) | |||
| 182 | psock->cork = NULL; | 182 | psock->cork = NULL; |
| 183 | } | 183 | } |
| 184 | 184 | ||
| 185 | sk->sk_prot = psock->sk_proto; | 185 | if (psock->sk_proto) { |
| 186 | psock->sk_proto = NULL; | 186 | sk->sk_prot = psock->sk_proto; |
| 187 | psock->sk_proto = NULL; | ||
| 188 | } | ||
| 187 | out: | 189 | out: |
| 188 | rcu_read_unlock(); | 190 | rcu_read_unlock(); |
| 189 | } | 191 | } |
| @@ -211,6 +213,12 @@ static void bpf_tcp_close(struct sock *sk, long timeout) | |||
| 211 | close_fun = psock->save_close; | 213 | close_fun = psock->save_close; |
| 212 | 214 | ||
| 213 | write_lock_bh(&sk->sk_callback_lock); | 215 | write_lock_bh(&sk->sk_callback_lock); |
| 216 | if (psock->cork) { | ||
| 217 | free_start_sg(psock->sock, psock->cork); | ||
| 218 | kfree(psock->cork); | ||
| 219 | psock->cork = NULL; | ||
| 220 | } | ||
| 221 | |||
| 214 | list_for_each_entry_safe(md, mtmp, &psock->ingress, list) { | 222 | list_for_each_entry_safe(md, mtmp, &psock->ingress, list) { |
| 215 | list_del(&md->list); | 223 | list_del(&md->list); |
| 216 | free_start_sg(psock->sock, md); | 224 | free_start_sg(psock->sock, md); |
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 0244973ee544..4ca46df19c9a 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c | |||
| @@ -1226,18 +1226,6 @@ bpf_prog_load_check_attach_type(enum bpf_prog_type prog_type, | |||
| 1226 | } | 1226 | } |
| 1227 | } | 1227 | } |
| 1228 | 1228 | ||
| 1229 | static int bpf_prog_attach_check_attach_type(const struct bpf_prog *prog, | ||
| 1230 | enum bpf_attach_type attach_type) | ||
| 1231 | { | ||
| 1232 | switch (prog->type) { | ||
| 1233 | case BPF_PROG_TYPE_CGROUP_SOCK: | ||
| 1234 | case BPF_PROG_TYPE_CGROUP_SOCK_ADDR: | ||
| 1235 | return attach_type == prog->expected_attach_type ? 0 : -EINVAL; | ||
| 1236 | default: | ||
| 1237 | return 0; | ||
| 1238 | } | ||
| 1239 | } | ||
| 1240 | |||
| 1241 | /* last field in 'union bpf_attr' used by this command */ | 1229 | /* last field in 'union bpf_attr' used by this command */ |
| 1242 | #define BPF_PROG_LOAD_LAST_FIELD expected_attach_type | 1230 | #define BPF_PROG_LOAD_LAST_FIELD expected_attach_type |
| 1243 | 1231 | ||
| @@ -1465,6 +1453,18 @@ out_free_tp: | |||
| 1465 | 1453 | ||
| 1466 | #ifdef CONFIG_CGROUP_BPF | 1454 | #ifdef CONFIG_CGROUP_BPF |
| 1467 | 1455 | ||
| 1456 | static int bpf_prog_attach_check_attach_type(const struct bpf_prog *prog, | ||
| 1457 | enum bpf_attach_type attach_type) | ||
| 1458 | { | ||
| 1459 | switch (prog->type) { | ||
| 1460 | case BPF_PROG_TYPE_CGROUP_SOCK: | ||
| 1461 | case BPF_PROG_TYPE_CGROUP_SOCK_ADDR: | ||
| 1462 | return attach_type == prog->expected_attach_type ? 0 : -EINVAL; | ||
| 1463 | default: | ||
| 1464 | return 0; | ||
| 1465 | } | ||
| 1466 | } | ||
| 1467 | |||
| 1468 | #define BPF_PROG_ATTACH_LAST_FIELD attach_flags | 1468 | #define BPF_PROG_ATTACH_LAST_FIELD attach_flags |
| 1469 | 1469 | ||
| 1470 | static int sockmap_get_from_fd(const union bpf_attr *attr, | 1470 | static int sockmap_get_from_fd(const union bpf_attr *attr, |
