Skip to content

Commit

Permalink
usb: gadget: f_hid: fix: Don't access hidg->req without spinlock held
Browse files Browse the repository at this point in the history
hidg->req should be accessed only with write_spinlock held as it is
set to NULL when we get disabled by host.

Signed-off-by: Krzysztof Opasiak <k.opasiak@samsung.com>
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
  • Loading branch information
Krzysztof Opasiak authored and Felipe Balbi committed Mar 22, 2017
1 parent 1f45926 commit 25cd972
Showing 1 changed file with 4 additions and 4 deletions.
8 changes: 4 additions & 4 deletions drivers/usb/gadget/function/f_hid.c
Original file line number Diff line number Diff line change
Expand Up @@ -367,7 +367,7 @@ static ssize_t f_hidg_write(struct file *file, const char __user *buffer,
count = min_t(unsigned, count, hidg->report_length);

spin_unlock_irqrestore(&hidg->write_spinlock, flags);
status = copy_from_user(hidg->req->buf, buffer, count);
status = copy_from_user(req->buf, buffer, count);

if (status != 0) {
ERROR(hidg->func.config->cdev,
Expand All @@ -378,9 +378,9 @@ static ssize_t f_hidg_write(struct file *file, const char __user *buffer,

spin_lock_irqsave(&hidg->write_spinlock, flags);

/* we our function has been disabled by host */
/* when our function has been disabled by host */
if (!hidg->req) {
free_ep_req(hidg->in_ep, hidg->req);
free_ep_req(hidg->in_ep, req);
/*
* TODO
* Should we fail with error here?
Expand All @@ -394,7 +394,7 @@ static ssize_t f_hidg_write(struct file *file, const char __user *buffer,
req->complete = f_hidg_req_complete;
req->context = hidg;

status = usb_ep_queue(hidg->in_ep, hidg->req, GFP_ATOMIC);
status = usb_ep_queue(hidg->in_ep, req, GFP_ATOMIC);
if (status < 0) {
ERROR(hidg->func.config->cdev,
"usb_ep_queue error on int endpoint %zd\n", status);
Expand Down

0 comments on commit 25cd972

Please sign in to comment.