Commit 67eb5250 authored by Jean Tourrilhes's avatar Jean Tourrilhes Committed by Linus Torvalds

[irda] LAP close race

	o [CRITICA] Fix a race condition when closing the LAP
		prevent the stack to open new LSAPs while we are killing them.
parent 8d9a9ed7
......@@ -221,8 +221,11 @@ void irlap_close(struct irlap_cb *self)
ASSERT(self != NULL, return;);
ASSERT(self->magic == LAP_MAGIC, return;);
irlap_disconnect_indication(self, LAP_DISC_INDICATION);
/* We used to send a LAP_DISC_INDICATION here, but this was
* racy. This has been move within irlmp_unregister_link()
* itself. Jean II */
/* Kill the LAP and all LSAPs on top of it */
irlmp_unregister_link(self->saddr);
self->notify.instance = NULL;
......
......@@ -321,15 +321,23 @@ void irlmp_unregister_link(__u32 saddr)
IRDA_DEBUG(4, "%s()\n", __FUNCTION__);
/* We must remove ourselves from the hashbin *first*. This ensure
* that no more LSAPs will be open on this link and no discovery
* will be triggered anymore. Jean II */
link = hashbin_remove(irlmp->links, saddr, NULL);
if (link) {
ASSERT(link->magic == LMP_LAP_MAGIC, return;);
/* Kill all the LSAPs on this link. Jean II */
link->reason = LAP_DISC_INDICATION;
link->daddr = DEV_ADDR_ANY;
irlmp_do_lap_event(link, LM_LAP_DISCONNECT_INDICATION, NULL);
/* Remove all discoveries discovered at this link */
irlmp_expire_discoveries(irlmp->cachelog, link->saddr, TRUE);
/* Final cleanup */
del_timer(&link->idle_timer);
link->magic = 0;
kfree(link);
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment