diff mbox

[net-next,2/5] tipc: fix nullpointer bug when subscribing to events

Message ID 1424933010-31003-3-git-send-email-erik.hugne@ericsson.com
State Changes Requested, archived
Delegated to: David Miller
Headers show

Commit Message

Erik Hugne Feb. 26, 2015, 6:43 a.m. UTC
From: Erik Hugne <erik.hugne@ericsson.com>

If a subscription request is sent to a topology server
connection, and any error occurs (malformed request, oom
or limit reached) while processing this request, TIPC should
terminate the subscriber connection. While doing so, it tries
to access fields in an already freed (or never allocated)
subscription element leading to a nullpointer exception.
We fix this by removing the subscr_terminate function and
terminate the connection immediately upon any subscription
failure.

Signed-off-by: Erik Hugne <erik.hugne@ericsson.com>
Reviewed-by: Jon Maloy <jon.maloy@ericsson.com>
---
 net/tipc/subscr.c | 24 +++++-------------------
 1 file changed, 5 insertions(+), 19 deletions(-)

Comments

David Miller Feb. 26, 2015, 4:20 p.m. UTC | #1
From: <erik.hugne@ericsson.com>
Date: Thu, 26 Feb 2015 07:43:27 +0100

> @@ -312,16 +299,15 @@ static void subscr_conn_msg_event(struct net *net, int conid,
>  {
>  	struct tipc_subscriber *subscriber = usr_data;
>  	struct tipc_subscription *sub = NULL;
> +	struct tipc_net *tn = net_generic(net, tipc_net_id);
> +
>  
>  	spin_lock_bh(&subscriber->lock);

Please only have one empty line between local variable declarations
and code.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/net/tipc/subscr.c b/net/tipc/subscr.c
index 72c339e..3c33c34 100644
--- a/net/tipc/subscr.c
+++ b/net/tipc/subscr.c
@@ -162,19 +162,6 @@  static void subscr_del(struct tipc_subscription *sub)
 	atomic_dec(&tn->subscription_count);
 }
 
-/**
- * subscr_terminate - terminate communication with a subscriber
- *
- * Note: Must call it in process context since it might sleep.
- */
-static void subscr_terminate(struct tipc_subscription *sub)
-{
-	struct tipc_subscriber *subscriber = sub->subscriber;
-	struct tipc_net *tn = net_generic(sub->net, tipc_net_id);
-
-	tipc_conn_terminate(tn->topsrv, subscriber->conid);
-}
-
 static void subscr_release(struct tipc_subscriber *subscriber)
 {
 	struct tipc_subscription *sub;
@@ -312,16 +299,15 @@  static void subscr_conn_msg_event(struct net *net, int conid,
 {
 	struct tipc_subscriber *subscriber = usr_data;
 	struct tipc_subscription *sub = NULL;
+	struct tipc_net *tn = net_generic(net, tipc_net_id);
+
 
 	spin_lock_bh(&subscriber->lock);
-	if (subscr_subscribe(net, (struct tipc_subscr *)buf, subscriber,
-			     &sub) < 0) {
-		spin_unlock_bh(&subscriber->lock);
-		subscr_terminate(sub);
-		return;
-	}
+	subscr_subscribe(net, (struct tipc_subscr *)buf, subscriber, &sub);
 	if (sub)
 		tipc_nametbl_subscribe(sub);
+	else
+		tipc_conn_terminate(tn->topsrv, subscriber->conid);
 	spin_unlock_bh(&subscriber->lock);
 }