Commit 8b0f201f authored by Jean Tourrilhes's avatar Jean Tourrilhes Committed by Linus Torvalds

[IRDA]: Fix races between IRNET and PPP.

- Prevent sending status event to dead/kfree sockets
- Disable PPP access before deregistration
  PPP deregistration might sleep -> race condition
parent 158bed35
......@@ -512,8 +512,8 @@ dev_irnet_close(struct inode * inode,
if(ap->ppp_open)
{
DERROR(FS_ERROR, "Channel still registered - deregistering !\n");
ppp_unregister_channel(&ap->chan);
ap->ppp_open = 0;
ppp_unregister_channel(&ap->chan);
}
kfree(ap);
......@@ -651,10 +651,12 @@ dev_irnet_ioctl(struct inode * inode,
DEBUG(FS_INFO, "Exiting PPP discipline.\n");
/* Disconnect from the generic PPP layer */
if(ap->ppp_open)
ppp_unregister_channel(&ap->chan);
{
ap->ppp_open = 0;
ppp_unregister_channel(&ap->chan);
}
else
DERROR(FS_ERROR, "Channel not registered !\n");
ap->ppp_open = 0;
err = 0;
}
break;
......
......@@ -968,6 +968,10 @@ void irttp_status_indication(void *instance,
ASSERT(self != NULL, return;);
ASSERT(self->magic == TTP_TSAP_MAGIC, return;);
/* Check if client has already closed the TSAP and gone away */
if (self->close_pend)
return;
/*
* Inform service user if he has requested it
*/
......@@ -1603,7 +1607,7 @@ void irttp_do_data_indication(struct tsap_cb *self, struct sk_buff *skb)
{
int err;
/* Check if client has already tried to close the TSAP */
/* Check if client has already closed the TSAP and gone away */
if (self->close_pend) {
dev_kfree_skb(skb);
return;
......
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