USB: cdc-wdm: fix race leading leading to memory corruption
This patch fixes a race whereby a pointer to a buffer would be overwritten while the buffer was in use leading to a double free and a memory leak. This causes crashes. This bug was introduced in 2.6.34 Signed-off-by: Oliver Neukum <oneukum@suse.de> Tested-by: Bjørn Mork <bjorn@mork.no> Cc: stable <stable@vger.kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Родитель
151b612847
Коммит
5c22837adc
|
@ -157,8 +157,9 @@ static void wdm_out_callback(struct urb *urb)
|
|||
spin_lock(&desc->iuspin);
|
||||
desc->werr = urb->status;
|
||||
spin_unlock(&desc->iuspin);
|
||||
clear_bit(WDM_IN_USE, &desc->flags);
|
||||
kfree(desc->outbuf);
|
||||
desc->outbuf = NULL;
|
||||
clear_bit(WDM_IN_USE, &desc->flags);
|
||||
wake_up(&desc->wait);
|
||||
}
|
||||
|
||||
|
@ -338,7 +339,7 @@ static ssize_t wdm_write
|
|||
if (we < 0)
|
||||
return -EIO;
|
||||
|
||||
desc->outbuf = buf = kmalloc(count, GFP_KERNEL);
|
||||
buf = kmalloc(count, GFP_KERNEL);
|
||||
if (!buf) {
|
||||
rv = -ENOMEM;
|
||||
goto outnl;
|
||||
|
@ -406,10 +407,12 @@ static ssize_t wdm_write
|
|||
req->wIndex = desc->inum;
|
||||
req->wLength = cpu_to_le16(count);
|
||||
set_bit(WDM_IN_USE, &desc->flags);
|
||||
desc->outbuf = buf;
|
||||
|
||||
rv = usb_submit_urb(desc->command, GFP_KERNEL);
|
||||
if (rv < 0) {
|
||||
kfree(buf);
|
||||
desc->outbuf = NULL;
|
||||
clear_bit(WDM_IN_USE, &desc->flags);
|
||||
dev_err(&desc->intf->dev, "Tx URB error: %d\n", rv);
|
||||
} else {
|
||||
|
|
Загрузка…
Ссылка в новой задаче