Skip to content

Commit

Permalink
cls_cgroup: get sk_classid only from full sockets
Browse files Browse the repository at this point in the history
skb->sk could point to timewait or request socket which has no sk_classid.
Detected as "BUG: KASAN: slab-out-of-bounds in cls_cgroup_classify".

Signed-off-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Konstantin Khlebnikov authored and David S. Miller committed Apr 20, 2016
1 parent 851b10d commit 2309236
Showing 1 changed file with 5 additions and 2 deletions.
7 changes: 5 additions & 2 deletions include/net/cls_cgroup.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include <linux/hardirq.h>
#include <linux/rcupdate.h>
#include <net/sock.h>
#include <net/inet_sock.h>

#ifdef CONFIG_CGROUP_NET_CLASSID
struct cgroup_cls_state {
Expand Down Expand Up @@ -63,11 +64,13 @@ static inline u32 task_get_classid(const struct sk_buff *skb)
* softirqs always disables bh.
*/
if (in_serving_softirq()) {
struct sock *sk = skb_to_full_sk(skb);

/* If there is an sock_cgroup_classid we'll use that. */
if (!skb->sk)
if (!sk || !sk_fullsock(sk))
return 0;

classid = sock_cgroup_classid(&skb->sk->sk_cgrp_data);
classid = sock_cgroup_classid(&sk->sk_cgrp_data);
}

return classid;
Expand Down

0 comments on commit 2309236

Please sign in to comment.