tipc: fix unbalanced reference counter
authorJon Maloy <jon.maloy@ericsson.com>
Wed, 11 Apr 2018 20:52:09 +0000 (22:52 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 13 Apr 2018 01:46:10 +0000 (21:46 -0400)
commitc3317f4db831b7564ff8d1670326456a7fbbbcb3
tree845a5dd46e764b071f8dedcf56233457ad10121b
parent1c2734b31d72316e3faaad88c0c9c46fa92a4b20
tipc: fix unbalanced reference counter

When a topology subscription is created, we may encounter (or KASAN
may provoke) a failure to create a corresponding service instance in
the binding table. Instead of letting the tipc_nametbl_subscribe()
report the failure back to the caller, the function just makes a warning
printout and returns, without incrementing the subscription reference
counter as expected by the caller.

This makes the caller believe that the subscription was successful, so
it will at a later moment try to unsubscribe the item. This involves
a sub_put() call. Since the reference counter never was incremented
in the first place, we get a premature delete of the subscription item,
followed by a "use-after-free" warning.

We fix this by adding a return value to tipc_nametbl_subscribe() and
make the caller aware of the failure to subscribe.

This bug seems to always have been around, but this fix only applies
back to the commit shown below. Given the low risk of this happening
we believe this to be sufficient.

Fixes: commit 218527fe27ad ("tipc: replace name table service range
array with rb tree")
Reported-by: syzbot+aa245f26d42b8305d157@syzkaller.appspotmail.com
Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/tipc/name_table.c
net/tipc/name_table.h
net/tipc/subscr.c