Skip to content

Commit

Permalink
tipc: fix nullpointer bug when subscribing to events
Browse files Browse the repository at this point in the history
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>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Erik Hugne authored and davem330 committed Feb 27, 2015
1 parent 3622c36 commit 7fe8097
Showing 1 changed file with 4 additions and 19 deletions.
23 changes: 4 additions & 19 deletions net/tipc/subscr.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -312,16 +299,14 @@ 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);
}

Expand Down

0 comments on commit 7fe8097

Please sign in to comment.