Messages in this thread | | | From | Andrey Konovalov <> | Date | Thu, 21 Sep 2017 20:20:46 +0200 | Subject | Re: usb/gadget: copy_to_user called with spinlock held |
| |
On Thu, Sep 21, 2017 at 7:35 PM, Alan Stern <stern@rowland.harvard.edu> wrote: > On Thu, 21 Sep 2017, Andrey Konovalov wrote: > >> Hi! >> >> I've got the following report while fuzzing the kernel with syzkaller. >> >> On commit ebb2c2437d8008d46796902ff390653822af6cc4 (Sep 18). >> >> Line numbers might be a little off, due to some local changes to >> gadgetfs code but the issue is AFAIU with calling copy_to_user() with >> spinlock held in ep0_read(). I see that there's a FIXME exactly about >> that and I was wondering if there's any chance of getting this fixed? >> >> Thanks! > > The patch below, which goes on top of the gadgetfs patch from a few > days ago, should eliminate this problem.
This patch seems to be fixing the crashes.
Tested-by: Andrey Konovalov <andreyknvl@google.com>
Thanks once again!
> > Alan Stern > > > > Index: usb-4.x/drivers/usb/gadget/legacy/inode.c > =================================================================== > --- usb-4.x.orig/drivers/usb/gadget/legacy/inode.c > +++ usb-4.x/drivers/usb/gadget/legacy/inode.c > @@ -986,11 +986,14 @@ ep0_read (struct file *fd, char __user * > retval = -EIO; > else { > len = min (len, (size_t)dev->req->actual); > -// FIXME don't call this with the spinlock held ... > + ++dev->udc_usage; > + spin_unlock_irq(&dev->lock); > if (copy_to_user (buf, dev->req->buf, len)) > retval = -EFAULT; > else > retval = len; > + spin_lock_irq(&dev->lock); > + --dev->udc_usage; > clean_req (dev->gadget->ep0, dev->req); > /* NOTE userspace can't yet choose to stall */ > } >
| |