summaryrefslogtreecommitdiffstats
path: root/net/tipc/discover.h
diff options
context:
space:
mode:
authorYing Xue <ying.xue@windriver.com>2014-04-21 04:55:52 +0200
committerDavid S. Miller <davem@davemloft.net>2014-04-23 03:17:53 +0200
commita8b9b96e959f3c035af20b1bd2ba67b0b7269b19 (patch)
tree02d52832745176ee6d63579f50d375caddd1fc62 /net/tipc/discover.h
parenttipc: use bc_lock to protect node map in bearer structure (diff)
downloadlinux-a8b9b96e959f3c035af20b1bd2ba67b0b7269b19.tar.xz
linux-a8b9b96e959f3c035af20b1bd2ba67b0b7269b19.zip
tipc: fix race in disc create/delete
Commit a21a584d6720ce349b05795b9bcfab3de8e58419 (tipc: fix neighbor detection problem after hw address change) introduces a race condition involving tipc_disc_delete() and tipc_disc_add/remove_dest that can cause TIPC to dereference the pointer to the bearer discovery request structure after it has been freed since a stray pointer is left in the bearer structure. In order to fix the issue, the process of resetting the discovery request handler is optimized: the discovery request handler and request buffer are just reset instead of being freed, allocated and initialized. As the request point is always valid and the request's lock is taken while the request handler is reset, the race doesn't happen any more. Reported-by: Erik Hugne <erik.hugne@ericsson.com> Signed-off-by: Ying Xue <ying.xue@windriver.com> Reviewed-by: Erik Hugne <erik.hugne@ericsson.com> Tested-by: Erik Hugne <erik.hugne@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/discover.h')
-rw-r--r--net/tipc/discover.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/net/tipc/discover.h b/net/tipc/discover.h
index 07f34729459d..515b57392f4d 100644
--- a/net/tipc/discover.h
+++ b/net/tipc/discover.h
@@ -41,6 +41,7 @@ struct tipc_link_req;
int tipc_disc_create(struct tipc_bearer *b_ptr, struct tipc_media_addr *dest);
void tipc_disc_delete(struct tipc_link_req *req);
+void tipc_disc_reset(struct tipc_bearer *b_ptr);
void tipc_disc_add_dest(struct tipc_link_req *req);
void tipc_disc_remove_dest(struct tipc_link_req *req);
void tipc_disc_rcv(struct sk_buff *buf, struct tipc_bearer *b_ptr);