aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSabrina Dubroca <sd@queasysnail.net>2016-04-22 05:28:06 -0400
committerDavid S. Miller <davem@davemloft.net>2016-04-24 14:31:58 -0400
commit960d5848dbf1245cc3a310109897937207411c0c (patch)
treef9a3cbd70f51112658544422e2783ab928dd112a
parent96cfc5052c5d434563873caa7707b32b9e389b16 (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.c8
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);