diff options
author | Eric Dumazet <edumazet@google.com> | 2017-10-09 07:44:52 +0300 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-10-10 06:55:01 +0300 |
commit | fbb1fb4ad415cb31ce944f65a5ca700aaf73a227 (patch) | |
tree | a7b1d3fddab2353229b73daaa103904ce539414d /kernel | |
parent | 9f1c2674b328a69ab5a9b5a1c52405795ee4163f (diff) | |
download | linux-fbb1fb4ad415cb31ce944f65a5ca700aaf73a227.tar.xz |
net: defer call to cgroup_sk_alloc()
sk_clone_lock() might run while TCP/DCCP listener already vanished.
In order to prevent use after free, it is better to defer cgroup_sk_alloc()
to the point we know both parent and child exist, and from process context.
Fixes: e994b2f0fb92 ("tcp: do not lock listener to process SYN packets")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Tejun Heo <tj@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/cgroup/cgroup.c | 11 |
1 files changed, 0 insertions, 11 deletions
diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c index 44857278eb8a..3380a3e49af5 100644 --- a/kernel/cgroup/cgroup.c +++ b/kernel/cgroup/cgroup.c @@ -5709,17 +5709,6 @@ void cgroup_sk_alloc(struct sock_cgroup_data *skcd) if (cgroup_sk_alloc_disabled) return; - /* Socket clone path */ - if (skcd->val) { - /* - * We might be cloning a socket which is left in an empty - * cgroup and the cgroup might have already been rmdir'd. - * Don't use cgroup_get_live(). - */ - cgroup_get(sock_cgroup_ptr(skcd)); - return; - } - rcu_read_lock(); while (true) { |