All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net 0/5] macsec: a few fixes
@ 2016-04-19 17:36 Sabrina Dubroca
  2016-04-19 17:36 ` [PATCH net 1/5] macsec: add missing NULL check after kmalloc Sabrina Dubroca
                   ` (4 more replies)
  0 siblings, 5 replies; 8+ messages in thread
From: Sabrina Dubroca @ 2016-04-19 17:36 UTC (permalink / raw)
  To: netdev; +Cc: Hannes Frederic Sowa, Johannes Berg, Dan Carpenter,
	Sabrina Dubroca

Some small fixes for the macsec driver:
 - possible NULL pointer dereferences
 - netlink dumps fixes: RTNL locking, consistent dumps
 - a reference counting bug

Sabrina Dubroca (5):
  macsec: add missing NULL check after kmalloc
  macsec: take rtnl lock before for_each_netdev
  macsec: don't put a NULL rxsa
  macsec: fix rx_sa refcounting with decrypt callback
  macsec: add consistency check to netlink dumps

 drivers/net/macsec.c | 39 +++++++++++++++++++++++++--------------
 1 file changed, 25 insertions(+), 14 deletions(-)

-- 
2.8.0

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH net 1/5] macsec: add missing NULL check after kmalloc
  2016-04-19 17:36 [PATCH net 0/5] macsec: a few fixes Sabrina Dubroca
@ 2016-04-19 17:36 ` Sabrina Dubroca
  2016-04-19 17:45   ` Lance Richardson
  2016-04-19 17:36 ` [PATCH net 2/5] macsec: take rtnl lock before for_each_netdev Sabrina Dubroca
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 8+ messages in thread
From: Sabrina Dubroca @ 2016-04-19 17:36 UTC (permalink / raw)
  To: netdev; +Cc: Hannes Frederic Sowa, Johannes Berg, Dan Carpenter,
	Sabrina Dubroca

Fixes: c09440f7dcb3 ("macsec: introduce IEEE 802.1AE driver")
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
---
 drivers/net/macsec.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c
index 84d3e5ca8817..f691030ee3df 100644
--- a/drivers/net/macsec.c
+++ b/drivers/net/macsec.c
@@ -1622,8 +1622,8 @@ static int macsec_add_rxsa(struct sk_buff *skb, struct genl_info *info)
 	}
 
 	rx_sa = kmalloc(sizeof(*rx_sa), GFP_KERNEL);
-	if (init_rx_sa(rx_sa, nla_data(tb_sa[MACSEC_SA_ATTR_KEY]), secy->key_len,
-		       secy->icv_len)) {
+	if (!rx_sa || init_rx_sa(rx_sa, nla_data(tb_sa[MACSEC_SA_ATTR_KEY]),
+				 secy->key_len, secy->icv_len)) {
 		rtnl_unlock();
 		return -ENOMEM;
 	}
-- 
2.8.0

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH net 2/5] macsec: take rtnl lock before for_each_netdev
  2016-04-19 17:36 [PATCH net 0/5] macsec: a few fixes Sabrina Dubroca
  2016-04-19 17:36 ` [PATCH net 1/5] macsec: add missing NULL check after kmalloc Sabrina Dubroca
@ 2016-04-19 17:36 ` Sabrina Dubroca
  2016-04-19 17:36 ` [PATCH net 3/5] macsec: don't put a NULL rxsa Sabrina Dubroca
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 8+ messages in thread
From: Sabrina Dubroca @ 2016-04-19 17:36 UTC (permalink / raw)
  To: netdev; +Cc: Hannes Frederic Sowa, Johannes Berg, Dan Carpenter,
	Sabrina Dubroca

Fixes: c09440f7dcb3 ("macsec: introduce IEEE 802.1AE driver")
Reported-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
---
 drivers/net/macsec.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c
index f691030ee3df..5f3ea8026074 100644
--- a/drivers/net/macsec.c
+++ b/drivers/net/macsec.c
@@ -2268,8 +2268,6 @@ static int dump_secy(struct macsec_secy *secy, struct net_device *dev,
 	if (!hdr)
 		return -EMSGSIZE;
 
-	rtnl_lock();
-
 	if (nla_put_u32(skb, MACSEC_ATTR_IFINDEX, dev->ifindex))
 		goto nla_put_failure;
 
@@ -2429,14 +2427,11 @@ static int dump_secy(struct macsec_secy *secy, struct net_device *dev,
 
 	nla_nest_end(skb, rxsc_list);
 
-	rtnl_unlock();
-
 	genlmsg_end(skb, hdr);
 
 	return 0;
 
 nla_put_failure:
-	rtnl_unlock();
 	genlmsg_cancel(skb, hdr);
 	return -EMSGSIZE;
 }
@@ -2450,6 +2445,7 @@ static int macsec_dump_txsc(struct sk_buff *skb, struct netlink_callback *cb)
 	dev_idx = cb->args[0];
 
 	d = 0;
+	rtnl_lock();
 	for_each_netdev(net, dev) {
 		struct macsec_secy *secy;
 
@@ -2467,6 +2463,7 @@ next:
 	}
 
 done:
+	rtnl_unlock();
 	cb->args[0] = d;
 	return skb->len;
 }
-- 
2.8.0

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH net 3/5] macsec: don't put a NULL rxsa
  2016-04-19 17:36 [PATCH net 0/5] macsec: a few fixes Sabrina Dubroca
  2016-04-19 17:36 ` [PATCH net 1/5] macsec: add missing NULL check after kmalloc Sabrina Dubroca
  2016-04-19 17:36 ` [PATCH net 2/5] macsec: take rtnl lock before for_each_netdev Sabrina Dubroca
@ 2016-04-19 17:36 ` Sabrina Dubroca
  2016-04-19 17:36 ` [PATCH net 4/5] macsec: fix rx_sa refcounting with decrypt callback Sabrina Dubroca
  2016-04-19 17:36 ` [PATCH net 5/5] macsec: add consistency check to netlink dumps Sabrina Dubroca
  4 siblings, 0 replies; 8+ messages in thread
From: Sabrina Dubroca @ 2016-04-19 17:36 UTC (permalink / raw)
  To: netdev; +Cc: Hannes Frederic Sowa, Johannes Berg, Dan Carpenter,
	Sabrina Dubroca

The "deliver:" path of macsec_handle_frame can be called with
rx_sa == NULL.  Check rx_sa != NULL before calling macsec_rxsa_put().

Fixes: c09440f7dcb3 ("macsec: introduce IEEE 802.1AE driver")
Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
---
 drivers/net/macsec.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c
index 5f3ea8026074..2a2136b7d324 100644
--- a/drivers/net/macsec.c
+++ b/drivers/net/macsec.c
@@ -1161,7 +1161,8 @@ deliver:
 			    macsec_extra_len(macsec_skb_cb(skb)->has_sci));
 	macsec_reset_skb(skb, secy->netdev);
 
-	macsec_rxsa_put(rx_sa);
+	if (rx_sa)
+		macsec_rxsa_put(rx_sa);
 	count_rx(dev, skb->len);
 
 	rcu_read_unlock();
-- 
2.8.0

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH net 4/5] macsec: fix rx_sa refcounting with decrypt callback
  2016-04-19 17:36 [PATCH net 0/5] macsec: a few fixes Sabrina Dubroca
                   ` (2 preceding siblings ...)
  2016-04-19 17:36 ` [PATCH net 3/5] macsec: don't put a NULL rxsa Sabrina Dubroca
@ 2016-04-19 17:36 ` Sabrina Dubroca
  2016-04-19 17:36 ` [PATCH net 5/5] macsec: add consistency check to netlink dumps Sabrina Dubroca
  4 siblings, 0 replies; 8+ messages in thread
From: Sabrina Dubroca @ 2016-04-19 17:36 UTC (permalink / raw)
  To: netdev; +Cc: Hannes Frederic Sowa, Johannes Berg, Dan Carpenter,
	Sabrina Dubroca

The decrypt callback macsec_decrypt_done needs a reference on the rx_sa
and releases it before returning, but macsec_handle_frame already
put that reference after macsec_decrypt returned NULL.

Change macsec_decrypt to return error codes, and use -EINPROGRESS as
an indication that macsec_handle_frame must not release the reference.

Fixes: c09440f7dcb3 ("macsec: introduce IEEE 802.1AE driver")
Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
---
 drivers/net/macsec.c | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c
index 2a2136b7d324..1fd2b147fda1 100644
--- a/drivers/net/macsec.c
+++ b/drivers/net/macsec.c
@@ -880,12 +880,12 @@ static struct sk_buff *macsec_decrypt(struct sk_buff *skb,
 	macsec_skb_cb(skb)->valid = false;
 	skb = skb_share_check(skb, GFP_ATOMIC);
 	if (!skb)
-		return NULL;
+		return ERR_PTR(-ENOMEM);
 
 	req = aead_request_alloc(rx_sa->key.tfm, GFP_ATOMIC);
 	if (!req) {
 		kfree_skb(skb);
-		return NULL;
+		return ERR_PTR(-ENOMEM);
 	}
 
 	hdr = (struct macsec_eth_header *)skb->data;
@@ -905,7 +905,7 @@ static struct sk_buff *macsec_decrypt(struct sk_buff *skb,
 		skb = skb_unshare(skb, GFP_ATOMIC);
 		if (!skb) {
 			aead_request_free(req);
-			return NULL;
+			return ERR_PTR(-ENOMEM);
 		}
 	} else {
 		/* integrity only: all headers + data authenticated */
@@ -921,14 +921,14 @@ static struct sk_buff *macsec_decrypt(struct sk_buff *skb,
 	dev_hold(dev);
 	ret = crypto_aead_decrypt(req);
 	if (ret == -EINPROGRESS) {
-		return NULL;
+		return ERR_PTR(ret);
 	} else if (ret != 0) {
 		/* decryption/authentication failed
 		 * 10.6 if validateFrames is disabled, deliver anyway
 		 */
 		if (ret != -EBADMSG) {
 			kfree_skb(skb);
-			skb = NULL;
+			skb = ERR_PTR(ret);
 		}
 	} else {
 		macsec_skb_cb(skb)->valid = true;
@@ -1146,8 +1146,10 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb)
 	    secy->validate_frames != MACSEC_VALIDATE_DISABLED)
 		skb = macsec_decrypt(skb, dev, rx_sa, sci, secy);
 
-	if (!skb) {
-		macsec_rxsa_put(rx_sa);
+	if (IS_ERR(skb)) {
+		/* the decrypt callback needs the reference */
+		if (PTR_ERR(skb) != -EINPROGRESS)
+			macsec_rxsa_put(rx_sa);
 		rcu_read_unlock();
 		*pskb = NULL;
 		return RX_HANDLER_CONSUMED;
-- 
2.8.0

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH net 5/5] macsec: add consistency check to netlink dumps
  2016-04-19 17:36 [PATCH net 0/5] macsec: a few fixes Sabrina Dubroca
                   ` (3 preceding siblings ...)
  2016-04-19 17:36 ` [PATCH net 4/5] macsec: fix rx_sa refcounting with decrypt callback Sabrina Dubroca
@ 2016-04-19 17:36 ` Sabrina Dubroca
  4 siblings, 0 replies; 8+ messages in thread
From: Sabrina Dubroca @ 2016-04-19 17:36 UTC (permalink / raw)
  To: netdev; +Cc: Hannes Frederic Sowa, Johannes Berg, Dan Carpenter,
	Sabrina Dubroca

Use genl_dump_check_consistent in dump_secy.

Fixes: c09440f7dcb3 ("macsec: introduce IEEE 802.1AE driver")
Suggested-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
---
 drivers/net/macsec.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c
index 1fd2b147fda1..41fbe556ba6d 100644
--- a/drivers/net/macsec.c
+++ b/drivers/net/macsec.c
@@ -2271,6 +2271,8 @@ static int dump_secy(struct macsec_secy *secy, struct net_device *dev,
 	if (!hdr)
 		return -EMSGSIZE;
 
+	genl_dump_check_consistent(cb, hdr, &macsec_fam);
+
 	if (nla_put_u32(skb, MACSEC_ATTR_IFINDEX, dev->ifindex))
 		goto nla_put_failure;
 
@@ -2439,6 +2441,8 @@ nla_put_failure:
 	return -EMSGSIZE;
 }
 
+static int macsec_generation = 1; /* protected by RTNL */
+
 static int macsec_dump_txsc(struct sk_buff *skb, struct netlink_callback *cb)
 {
 	struct net *net = sock_net(skb->sk);
@@ -2449,6 +2453,9 @@ static int macsec_dump_txsc(struct sk_buff *skb, struct netlink_callback *cb)
 
 	d = 0;
 	rtnl_lock();
+
+	cb->seq = macsec_generation;
+
 	for_each_netdev(net, dev) {
 		struct macsec_secy *secy;
 
@@ -2920,6 +2927,8 @@ static void macsec_dellink(struct net_device *dev, struct list_head *head)
 	struct net_device *real_dev = macsec->real_dev;
 	struct macsec_rxh_data *rxd = macsec_data_rtnl(real_dev);
 
+	macsec_generation++;
+
 	unregister_netdevice_queue(dev, head);
 	list_del_rcu(&macsec->secys);
 	if (list_empty(&rxd->secys))
@@ -3066,6 +3075,8 @@ static int macsec_newlink(struct net *net, struct net_device *dev,
 	if (err < 0)
 		goto del_dev;
 
+	macsec_generation++;
+
 	dev_hold(real_dev);
 
 	return 0;
-- 
2.8.0

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH net 1/5] macsec: add missing NULL check after kmalloc
  2016-04-19 17:36 ` [PATCH net 1/5] macsec: add missing NULL check after kmalloc Sabrina Dubroca
@ 2016-04-19 17:45   ` Lance Richardson
  2016-04-19 20:25     ` Sabrina Dubroca
  0 siblings, 1 reply; 8+ messages in thread
From: Lance Richardson @ 2016-04-19 17:45 UTC (permalink / raw)
  To: Sabrina Dubroca
  Cc: netdev, Hannes Frederic Sowa, Johannes Berg, Dan Carpenter

----- Original Message -----
> From: "Sabrina Dubroca" <sd@queasysnail.net>
> To: netdev@vger.kernel.org
> Cc: "Hannes Frederic Sowa" <hannes@stressinduktion.org>, "Johannes Berg" <johannes@sipsolutions.net>, "Dan Carpenter"
> <dan.carpenter@oracle.com>, "Sabrina Dubroca" <sd@queasysnail.net>
> Sent: Tuesday, April 19, 2016 1:36:38 PM
> Subject: [PATCH net 1/5] macsec: add missing NULL check after kmalloc
> 
> Fixes: c09440f7dcb3 ("macsec: introduce IEEE 802.1AE driver")
> Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
> Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
> Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
> ---
>  drivers/net/macsec.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c
> index 84d3e5ca8817..f691030ee3df 100644
> --- a/drivers/net/macsec.c
> +++ b/drivers/net/macsec.c
> @@ -1622,8 +1622,8 @@ static int macsec_add_rxsa(struct sk_buff *skb, struct
> genl_info *info)
>  	}
>  
>  	rx_sa = kmalloc(sizeof(*rx_sa), GFP_KERNEL);
> -	if (init_rx_sa(rx_sa, nla_data(tb_sa[MACSEC_SA_ATTR_KEY]), secy->key_len,
> -		       secy->icv_len)) {
> +	if (!rx_sa || init_rx_sa(rx_sa, nla_data(tb_sa[MACSEC_SA_ATTR_KEY]),
> +				 secy->key_len, secy->icv_len)) {

Doesn't this leak rx_sa if kmalloc() succeeds but init_rx_sa fails?

>  		rtnl_unlock();
>  		return -ENOMEM;
>  	}
> --
> 2.8.0
> 
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH net 1/5] macsec: add missing NULL check after kmalloc
  2016-04-19 17:45   ` Lance Richardson
@ 2016-04-19 20:25     ` Sabrina Dubroca
  0 siblings, 0 replies; 8+ messages in thread
From: Sabrina Dubroca @ 2016-04-19 20:25 UTC (permalink / raw)
  To: Lance Richardson
  Cc: netdev, Hannes Frederic Sowa, Johannes Berg, Dan Carpenter

2016-04-19, 13:45:47 -0400, Lance Richardson wrote:
> ----- Original Message -----
> > From: "Sabrina Dubroca" <sd@queasysnail.net>
> > To: netdev@vger.kernel.org
> > Cc: "Hannes Frederic Sowa" <hannes@stressinduktion.org>, "Johannes Berg" <johannes@sipsolutions.net>, "Dan Carpenter"
> > <dan.carpenter@oracle.com>, "Sabrina Dubroca" <sd@queasysnail.net>
> > Sent: Tuesday, April 19, 2016 1:36:38 PM
> > Subject: [PATCH net 1/5] macsec: add missing NULL check after kmalloc
> > 
> > Fixes: c09440f7dcb3 ("macsec: introduce IEEE 802.1AE driver")
> > Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
> > Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
> > Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
> > ---
> >  drivers/net/macsec.c | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c
> > index 84d3e5ca8817..f691030ee3df 100644
> > --- a/drivers/net/macsec.c
> > +++ b/drivers/net/macsec.c
> > @@ -1622,8 +1622,8 @@ static int macsec_add_rxsa(struct sk_buff *skb, struct
> > genl_info *info)
> >  	}
> >  
> >  	rx_sa = kmalloc(sizeof(*rx_sa), GFP_KERNEL);
> > -	if (init_rx_sa(rx_sa, nla_data(tb_sa[MACSEC_SA_ATTR_KEY]), secy->key_len,
> > -		       secy->icv_len)) {
> > +	if (!rx_sa || init_rx_sa(rx_sa, nla_data(tb_sa[MACSEC_SA_ATTR_KEY]),
> > +				 secy->key_len, secy->icv_len)) {
> 
> Doesn't this leak rx_sa if kmalloc() succeeds but init_rx_sa fails?

Yeah, you're right.  And there's the same code around init_tx_sa.
I'll send v2 tomorrow with this and another fix.

Thanks!

> >  		rtnl_unlock();
> >  		return -ENOMEM;
> >  	}
> > --
> > 2.8.0
> > 
> > 

-- 
Sabrina

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2016-04-19 20:25 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-04-19 17:36 [PATCH net 0/5] macsec: a few fixes Sabrina Dubroca
2016-04-19 17:36 ` [PATCH net 1/5] macsec: add missing NULL check after kmalloc Sabrina Dubroca
2016-04-19 17:45   ` Lance Richardson
2016-04-19 20:25     ` Sabrina Dubroca
2016-04-19 17:36 ` [PATCH net 2/5] macsec: take rtnl lock before for_each_netdev Sabrina Dubroca
2016-04-19 17:36 ` [PATCH net 3/5] macsec: don't put a NULL rxsa Sabrina Dubroca
2016-04-19 17:36 ` [PATCH net 4/5] macsec: fix rx_sa refcounting with decrypt callback Sabrina Dubroca
2016-04-19 17:36 ` [PATCH net 5/5] macsec: add consistency check to netlink dumps Sabrina Dubroca

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.