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, ...@@ -512,8 +512,8 @@ dev_irnet_close(struct inode * inode,
if(ap->ppp_open) if(ap->ppp_open)
{ {
DERROR(FS_ERROR, "Channel still registered - deregistering !\n"); DERROR(FS_ERROR, "Channel still registered - deregistering !\n");
ppp_unregister_channel(&ap->chan);
ap->ppp_open = 0; ap->ppp_open = 0;
ppp_unregister_channel(&ap->chan);
} }
kfree(ap); kfree(ap);
...@@ -651,10 +651,12 @@ dev_irnet_ioctl(struct inode * inode, ...@@ -651,10 +651,12 @@ dev_irnet_ioctl(struct inode * inode,
DEBUG(FS_INFO, "Exiting PPP discipline.\n"); DEBUG(FS_INFO, "Exiting PPP discipline.\n");
/* Disconnect from the generic PPP layer */ /* Disconnect from the generic PPP layer */
if(ap->ppp_open) if(ap->ppp_open)
ppp_unregister_channel(&ap->chan); {
ap->ppp_open = 0;
ppp_unregister_channel(&ap->chan);
}
else else
DERROR(FS_ERROR, "Channel not registered !\n"); DERROR(FS_ERROR, "Channel not registered !\n");
ap->ppp_open = 0;
err = 0; err = 0;
} }
break; break;
......
...@@ -968,6 +968,10 @@ void irttp_status_indication(void *instance, ...@@ -968,6 +968,10 @@ void irttp_status_indication(void *instance,
ASSERT(self != NULL, return;); ASSERT(self != NULL, return;);
ASSERT(self->magic == TTP_TSAP_MAGIC, 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 * 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) ...@@ -1603,7 +1607,7 @@ void irttp_do_data_indication(struct tsap_cb *self, struct sk_buff *skb)
{ {
int err; 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) { if (self->close_pend) {
dev_kfree_skb(skb); dev_kfree_skb(skb);
return; 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