diff options
author | Sabrina Dubroca <sd@queasysnail.net> | 2016-04-22 05:28:06 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-04-24 14:31:58 -0400 |
commit | 960d5848dbf1245cc3a310109897937207411c0c (patch) | |
tree | f9a3cbd70f51112658544422e2783ab928dd112a | |
parent | 96cfc5052c5d434563873caa7707b32b9e389b16 (diff) |
macsec: fix memory leaks around rx_handler (un)registration
We leak a struct macsec_rxh_data when we unregister the rx_handler in
macsec_dellink.
We also leak a struct macsec_rxh_data in register_macsec_dev if we fail
to register the rx_handler.
Fixes: c09440f7dcb3 ("macsec: introduce IEEE 802.1AE driver")
Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/macsec.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c index 41fbe556ba6d..826c6c9ce7fd 100644 --- a/drivers/net/macsec.c +++ b/drivers/net/macsec.c | |||
@@ -2931,8 +2931,10 @@ static void macsec_dellink(struct net_device *dev, struct list_head *head) | |||
2931 | 2931 | ||
2932 | unregister_netdevice_queue(dev, head); | 2932 | unregister_netdevice_queue(dev, head); |
2933 | list_del_rcu(&macsec->secys); | 2933 | list_del_rcu(&macsec->secys); |
2934 | if (list_empty(&rxd->secys)) | 2934 | if (list_empty(&rxd->secys)) { |
2935 | netdev_rx_handler_unregister(real_dev); | 2935 | netdev_rx_handler_unregister(real_dev); |
2936 | kfree(rxd); | ||
2937 | } | ||
2936 | 2938 | ||
2937 | macsec_del_dev(macsec); | 2939 | macsec_del_dev(macsec); |
2938 | } | 2940 | } |
@@ -2954,8 +2956,10 @@ static int register_macsec_dev(struct net_device *real_dev, | |||
2954 | 2956 | ||
2955 | err = netdev_rx_handler_register(real_dev, macsec_handle_frame, | 2957 | err = netdev_rx_handler_register(real_dev, macsec_handle_frame, |
2956 | rxd); | 2958 | rxd); |
2957 | if (err < 0) | 2959 | if (err < 0) { |
2960 | kfree(rxd); | ||
2958 | return err; | 2961 | return err; |
2962 | } | ||
2959 | } | 2963 | } |
2960 | 2964 | ||
2961 | list_add_tail_rcu(&macsec->secys, &rxd->secys); | 2965 | list_add_tail_rcu(&macsec->secys, &rxd->secys); |