• Lin Ma's avatar
    ax25: NPD bug when detaching AX25 device · 1ade48d0
    Lin Ma authored
    The existing cleanup routine implementation is not well synchronized
    with the syscall routine. When a device is detaching, below race could
    occur.
    
    static int ax25_sendmsg(...) {
      ...
      lock_sock()
      ax25 = sk_to_ax25(sk);
      if (ax25->ax25_dev == NULL) // CHECK
      ...
      ax25_queue_xmit(skb, ax25->ax25_dev->dev); // USE
      ...
    }
    
    static void ax25_kill_by_device(...) {
      ...
      if (s->ax25_dev == ax25_dev) {
        s->ax25_dev = NULL;
        ...
    }
    
    Other syscall functions like ax25_getsockopt, ax25_getname,
    ax25_info_show also suffer from similar races. To fix them, this patch
    introduce lock_sock() into ax25_kill_by_device in order to guarantee
    that the nullify action in cleanup routine cannot proceed when another
    socket request is pending.
    Signed-off-by: default avatarHanjie Wu <nagi@zju.edu.cn>
    Signed-off-by: default avatarLin Ma <linma@zju.edu.cn>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    1ade48d0
af_ax25.c 43.9 KB