[IRDA]: Race between open and disconnect in irda-usb.
It seems to me that irda_usb_net_open() must set self->netopen under spinlock or disconnect() may fail to kill all URBs, if it is called while an interface is opened. Signed-off-by: Oliver Neukum <oneukum@suse.de> Signed-off-by: Samuel Ortiz <samuel@sortiz.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ef5d4cf2f9
commit
497ba7f4c8
|
@ -1168,6 +1168,7 @@ static int stir421x_patch_device(struct irda_usb_cb *self)
|
|||
static int irda_usb_net_open(struct net_device *netdev)
|
||||
{
|
||||
struct irda_usb_cb *self;
|
||||
unsigned long flags;
|
||||
char hwname[16];
|
||||
int i;
|
||||
|
||||
|
@ -1177,13 +1178,16 @@ static int irda_usb_net_open(struct net_device *netdev)
|
|||
self = (struct irda_usb_cb *) netdev->priv;
|
||||
IRDA_ASSERT(self != NULL, return -1;);
|
||||
|
||||
spin_lock_irqsave(&self->lock, flags);
|
||||
/* Can only open the device if it's there */
|
||||
if(!self->present) {
|
||||
spin_unlock_irqrestore(&self->lock, flags);
|
||||
IRDA_WARNING("%s(), device not present!\n", __FUNCTION__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(self->needspatch) {
|
||||
spin_unlock_irqrestore(&self->lock, flags);
|
||||
IRDA_WARNING("%s(), device needs patch\n", __FUNCTION__) ;
|
||||
return -EIO ;
|
||||
}
|
||||
|
@ -1198,6 +1202,7 @@ static int irda_usb_net_open(struct net_device *netdev)
|
|||
/* To do *before* submitting Rx urbs and starting net Tx queue
|
||||
* Jean II */
|
||||
self->netopen = 1;
|
||||
spin_unlock_irqrestore(&self->lock, flags);
|
||||
|
||||
/*
|
||||
* Now that everything should be initialized properly,
|
||||
|
|
Loading…
Reference in New Issue