• Gong, Sishuai's avatar
    net: fix a concurrency bug in l2tp_tunnel_register() · 69e16d01
    Gong, Sishuai authored
    l2tp_tunnel_register() registers a tunnel without fully
    initializing its attribute. This can allow another kernel thread
    running l2tp_xmit_core() to access the uninitialized data and
    then cause a kernel NULL pointer dereference error, as shown below.
    
    Thread 1    Thread 2
    //l2tp_tunnel_register()
    list_add_rcu(&tunnel->list, &pn->l2tp_tunnel_list);
               //pppol2tp_connect()
               tunnel = l2tp_tunnel_get(sock_net(sk), info.tunnel_id);
               // Fetch the new tunnel
               ...
               //l2tp_xmit_core()
               struct sock *sk = tunnel->sock;
               ...
               bh_lock_sock(sk);
               //Null pointer error happens
    tunnel->sock = sk;
    
    Fix this bug by initializing tunnel->sock before adding the
    tunnel into l2tp_tunnel_list.
    Reviewed-by: default avatarCong Wang <cong.wang@bytedance.com>
    Signed-off-by: default avatarSishuai Gong <sishuai@purdue.edu>
    Reported-by: default avatarSishuai Gong <sishuai@purdue.edu>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    69e16d01
l2tp_core.c 44.8 KB