netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net 1/2] caif: Bugfix list_del_rcu race in cfmuxl_ctrlcmd.
@ 2012-02-02 11:21 Sjur Brændeland
  2012-02-02 11:21 ` [PATCH net 2/2] caif: Bugfix double kfree_skb upon xmit failure Sjur Brændeland
  2012-02-02 19:31 ` [PATCH net 1/2] caif: Bugfix list_del_rcu race in cfmuxl_ctrlcmd David Miller
  0 siblings, 2 replies; 4+ messages in thread
From: Sjur Brændeland @ 2012-02-02 11:21 UTC (permalink / raw)
  To: netdev, davem; +Cc: sjurbren, Sjur Brændeland

Always use cfmuxl_remove_uplayer when removing a up-layer.
cfmuxl_ctrlcmd() can be called independently and in parallel with
cfmuxl_remove_uplayer(). The race between them could cause list_del_rcu
to be called on a node which has been already taken out from the list.
That lead to a (rare) crash on accessing poisoned node->prev inside
list_del_rcu.

This fix ensures that deletion are done holding the same lock.

Reported-by: Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com>
Signed-off-by: Sjur Brændeland <sjur.brandeland@stericsson.com>
---
 net/caif/cfmuxl.c |   12 +++---------
 1 files changed, 3 insertions(+), 9 deletions(-)

diff --git a/net/caif/cfmuxl.c b/net/caif/cfmuxl.c
index b36f24a..94b0861 100644
--- a/net/caif/cfmuxl.c
+++ b/net/caif/cfmuxl.c
@@ -248,7 +248,6 @@ static void cfmuxl_ctrlcmd(struct cflayer *layr, enum caif_ctrlcmd ctrl,
 {
 	struct cfmuxl *muxl = container_obj(layr);
 	struct cflayer *layer;
-	int idx;
 
 	rcu_read_lock();
 	list_for_each_entry_rcu(layer, &muxl->srvl_list, node) {
@@ -257,14 +256,9 @@ static void cfmuxl_ctrlcmd(struct cflayer *layr, enum caif_ctrlcmd ctrl,
 
 			if ((ctrl == _CAIF_CTRLCMD_PHYIF_DOWN_IND ||
 				ctrl == CAIF_CTRLCMD_REMOTE_SHUTDOWN_IND) &&
-					layer->id != 0) {
-
-				idx = layer->id % UP_CACHE_SIZE;
-				spin_lock_bh(&muxl->receive_lock);
-				RCU_INIT_POINTER(muxl->up_cache[idx], NULL);
-				list_del_rcu(&layer->node);
-				spin_unlock_bh(&muxl->receive_lock);
-			}
+					layer->id != 0)
+				cfmuxl_remove_uplayer(layr, layer->id);
+
 			/* NOTE: ctrlcmd is not allowed to block */
 			layer->ctrlcmd(layer, ctrl, phyid);
 		}
-- 
1.7.5.4

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

* [PATCH net 2/2] caif: Bugfix double kfree_skb upon xmit failure
  2012-02-02 11:21 [PATCH net 1/2] caif: Bugfix list_del_rcu race in cfmuxl_ctrlcmd Sjur Brændeland
@ 2012-02-02 11:21 ` Sjur Brændeland
  2012-02-02 19:31   ` David Miller
  2012-02-02 19:31 ` [PATCH net 1/2] caif: Bugfix list_del_rcu race in cfmuxl_ctrlcmd David Miller
  1 sibling, 1 reply; 4+ messages in thread
From: Sjur Brændeland @ 2012-02-02 11:21 UTC (permalink / raw)
  To: netdev, davem; +Cc: sjurbren, Dmitry Tarnyagin, Sjur Brændeland

From: Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com>

SKB is freed twice upon send error. The Network stack consumes SKB even
when it returns error code.

Signed-off-by: Sjur Brændeland <sjur.brandeland@stericsson.com>
---
 net/caif/caif_socket.c |   10 ++++++----
 1 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/net/caif/caif_socket.c b/net/caif/caif_socket.c
index a986280..a97d97a 100644
--- a/net/caif/caif_socket.c
+++ b/net/caif/caif_socket.c
@@ -539,8 +539,10 @@ static int transmit_skb(struct sk_buff *skb, struct caifsock *cf_sk,
 	pkt = cfpkt_fromnative(CAIF_DIR_OUT, skb);
 	memset(skb->cb, 0, sizeof(struct caif_payload_info));
 
-	if (cf_sk->layer.dn == NULL)
+	if (cf_sk->layer.dn == NULL) {
+		kfree_skb(skb);
 		return -EINVAL;
+	}
 
 	return cf_sk->layer.dn->transmit(cf_sk->layer.dn, pkt);
 }
@@ -683,10 +685,10 @@ static int caif_stream_sendmsg(struct kiocb *kiocb, struct socket *sock,
 		}
 		err = transmit_skb(skb, cf_sk,
 				msg->msg_flags&MSG_DONTWAIT, timeo);
-		if (err < 0) {
-			kfree_skb(skb);
+		if (err < 0)
+			/* skb is already freed */
 			goto pipe_err;
-		}
+
 		sent += size;
 	}
 
-- 
1.7.5.4

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

* Re: [PATCH net 1/2] caif: Bugfix list_del_rcu race in cfmuxl_ctrlcmd.
  2012-02-02 11:21 [PATCH net 1/2] caif: Bugfix list_del_rcu race in cfmuxl_ctrlcmd Sjur Brændeland
  2012-02-02 11:21 ` [PATCH net 2/2] caif: Bugfix double kfree_skb upon xmit failure Sjur Brændeland
@ 2012-02-02 19:31 ` David Miller
  1 sibling, 0 replies; 4+ messages in thread
From: David Miller @ 2012-02-02 19:31 UTC (permalink / raw)
  To: sjur.brandeland; +Cc: netdev, sjurbren

From: Sjur Brændeland <sjur.brandeland@stericsson.com>
Date: Thu,  2 Feb 2012 12:21:02 +0100

> Always use cfmuxl_remove_uplayer when removing a up-layer.
> cfmuxl_ctrlcmd() can be called independently and in parallel with
> cfmuxl_remove_uplayer(). The race between them could cause list_del_rcu
> to be called on a node which has been already taken out from the list.
> That lead to a (rare) crash on accessing poisoned node->prev inside
> list_del_rcu.
> 
> This fix ensures that deletion are done holding the same lock.
> 
> Reported-by: Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com>
> Signed-off-by: Sjur Brændeland <sjur.brandeland@stericsson.com>

Applied.

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

* Re: [PATCH net 2/2] caif: Bugfix double kfree_skb upon xmit failure
  2012-02-02 11:21 ` [PATCH net 2/2] caif: Bugfix double kfree_skb upon xmit failure Sjur Brændeland
@ 2012-02-02 19:31   ` David Miller
  0 siblings, 0 replies; 4+ messages in thread
From: David Miller @ 2012-02-02 19:31 UTC (permalink / raw)
  To: sjur.brandeland; +Cc: netdev, sjurbren, dmitry.tarnyagin

From: Sjur Brændeland <sjur.brandeland@stericsson.com>
Date: Thu,  2 Feb 2012 12:21:03 +0100

> From: Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com>
> 
> SKB is freed twice upon send error. The Network stack consumes SKB even
> when it returns error code.
> 
> Signed-off-by: Sjur Brændeland <sjur.brandeland@stericsson.com>

Applied.

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

end of thread, other threads:[~2012-02-02 19:31 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-02-02 11:21 [PATCH net 1/2] caif: Bugfix list_del_rcu race in cfmuxl_ctrlcmd Sjur Brændeland
2012-02-02 11:21 ` [PATCH net 2/2] caif: Bugfix double kfree_skb upon xmit failure Sjur Brændeland
2012-02-02 19:31   ` David Miller
2012-02-02 19:31 ` [PATCH net 1/2] caif: Bugfix list_del_rcu race in cfmuxl_ctrlcmd David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).