]> git.baikalelectronics.ru Git - kernel.git/commit
macsec: fix refcnt leak in module exit routine
authorTaehee Yoo <ap420073@gmail.com>
Mon, 21 Oct 2019 18:47:55 +0000 (18:47 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 24 Oct 2019 21:53:48 +0000 (14:53 -0700)
commit52fdd0fba8ec31882b9ee7c0c11d535a325d60ff
treec72c76fcb1da9f1cc6e9af99599083cee38af725
parent36e8a2b1e0e45e15190b4e0b74e5e836bc29b654
macsec: fix refcnt leak in module exit routine

When a macsec interface is created, it increases a refcnt to a lower
device(real device). when macsec interface is deleted, the refcnt is
decreased in macsec_free_netdev(), which is ->priv_destructor() of
macsec interface.

The problem scenario is this.
When nested macsec interfaces are exiting, the exit routine of the
macsec module makes refcnt leaks.

Test commands:
    ip link add dummy0 type dummy
    ip link add macsec0 link dummy0 type macsec
    ip link add macsec1 link macsec0 type macsec
    modprobe -rv macsec

[  208.629433] unregister_netdevice: waiting for macsec0 to become free. Usage count = 1

Steps of exit routine of macsec module are below.
1. Calls ->dellink() in __rtnl_link_unregister().
2. Checks refcnt and wait refcnt to be 0 if refcnt is not 0 in
netdev_run_todo().
3. Calls ->priv_destruvtor() in netdev_run_todo().

Step2 checks refcnt, but step3 decreases refcnt.
So, step2 waits forever.

This patch makes the macsec module do not hold a refcnt of the lower
device because it already holds a refcnt of the lower device with
netdev_upper_dev_link().

Fixes: 4f0c7417cca8 ("macsec: introduce IEEE 802.1AE driver")
Signed-off-by: Taehee Yoo <ap420073@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/macsec.c