• Nicolas Dichtel's avatar
    sit: fix double free of fb_tunnel_dev on exit · 1b2a58ff
    Nicolas Dichtel authored
    [ No relevant upstream commit. ]
    
    This problem was fixed upstream by commit 9434266f ("sit: fix use after free
    of fb_tunnel_dev").
    The upstream patch depends on upstream commit 5e6700b3 ("sit: add support of
    x-netns"), which was not backported into 3.10 branch.
    
    First, explain the problem: when the sit module is unloaded, sit_cleanup() is
    called.
    rmmod sit
    => sit_cleanup()
      => rtnl_link_unregister()
        => __rtnl_kill_links()
          => for_each_netdev(net, dev) {
            if (dev->rtnl_link_ops == ops)
            	ops->dellink(dev, &list_kill);
            }
    At this point, the FB device is deleted (and all sit tunnels).
      => unregister_pernet_device()
        => unregister_pernet_operations()
          => ops_exit_list()
            => sit_exit_net()
              => sit_destroy_tunnels()
              In this function, no tunnel is found.
              => unregister_netdevice_queue(sitn->fb_tunnel_dev, &list);
    We delete the FB device a second time here!
    
    Because we cannot simply remove the second deletion (sit_exit_net() must remove
    the FB device when a netns is deleted), we add an rtnl ops which delete all sit
    device excepting the FB device and thus we can keep the explicit deletion in
    sit_exit_net().
    
    CC: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: default avatarNicolas Dichtel <nicolas.dichtel@6wind.com>
    Acked-by: default avatarWillem de Bruijn <willemb@google.com>
    Reported-by: default avatarSteven Rostedt <srostedt@redhat.com>
    Tested-by: Steven Rostedt <srostedt@redhat.com> (and our entire MRG team)
    Tested-by: default avatar"Luis Claudio R. Goncalves" <lgoncalv@redhat.com>
    Tested-by: default avatarJohn Kacur <jkacur@redhat.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    1b2a58ff
sit.c 38 KB