[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:
committed by
David S. Miller
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)
|
static int irda_usb_net_open(struct net_device *netdev)
|
||||||
{
|
{
|
||||||
struct irda_usb_cb *self;
|
struct irda_usb_cb *self;
|
||||||
|
unsigned long flags;
|
||||||
char hwname[16];
|
char hwname[16];
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -1177,13 +1178,16 @@ static int irda_usb_net_open(struct net_device *netdev)
|
|||||||
self = (struct irda_usb_cb *) netdev->priv;
|
self = (struct irda_usb_cb *) netdev->priv;
|
||||||
IRDA_ASSERT(self != NULL, return -1;);
|
IRDA_ASSERT(self != NULL, return -1;);
|
||||||
|
|
||||||
|
spin_lock_irqsave(&self->lock, flags);
|
||||||
/* Can only open the device if it's there */
|
/* Can only open the device if it's there */
|
||||||
if(!self->present) {
|
if(!self->present) {
|
||||||
|
spin_unlock_irqrestore(&self->lock, flags);
|
||||||
IRDA_WARNING("%s(), device not present!\n", __FUNCTION__);
|
IRDA_WARNING("%s(), device not present!\n", __FUNCTION__);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(self->needspatch) {
|
if(self->needspatch) {
|
||||||
|
spin_unlock_irqrestore(&self->lock, flags);
|
||||||
IRDA_WARNING("%s(), device needs patch\n", __FUNCTION__) ;
|
IRDA_WARNING("%s(), device needs patch\n", __FUNCTION__) ;
|
||||||
return -EIO ;
|
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
|
/* To do *before* submitting Rx urbs and starting net Tx queue
|
||||||
* Jean II */
|
* Jean II */
|
||||||
self->netopen = 1;
|
self->netopen = 1;
|
||||||
|
spin_unlock_irqrestore(&self->lock, flags);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now that everything should be initialized properly,
|
* Now that everything should be initialized properly,
|
||||||
|
Reference in New Issue
Block a user