Skip to content

Commit

Permalink
usbip: vudc synchronize sysfs code paths
Browse files Browse the repository at this point in the history
commit bd8b820 upstream.

Fuzzing uncovered race condition between sysfs code paths in usbip
drivers. Device connect/disconnect code paths initiated through
sysfs interface are prone to races if disconnect happens during
connect and vice versa.

Use sysfs_lock to protect sysfs paths in vudc.

Cc: stable@vger.kernel.org
Reported-and-tested-by: syzbot+a93fba6d384346a761e3@syzkaller.appspotmail.com
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
Link: https://lore.kernel.org/r/caabcf3fc87bdae970509b5ff32d05bb7ce2fb15.1616807117.git.skhan@linuxfoundation.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
shuahkh authored and gregkh committed Apr 14, 2021
1 parent 513765b commit 28dc923
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 0 deletions.
1 change: 1 addition & 0 deletions drivers/usb/usbip/vudc_dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -572,6 +572,7 @@ static int init_vudc_hw(struct vudc *udc)
init_waitqueue_head(&udc->tx_waitq);

spin_lock_init(&ud->lock);
mutex_init(&ud->sysfs_lock);
ud->status = SDEV_ST_AVAILABLE;
ud->side = USBIP_VUDC;

Expand Down
5 changes: 5 additions & 0 deletions drivers/usb/usbip/vudc_sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ static ssize_t usbip_sockfd_store(struct device *dev,
dev_err(dev, "no device");
return -ENODEV;
}
mutex_lock(&udc->ud.sysfs_lock);
spin_lock_irqsave(&udc->lock, flags);
/* Don't export what we don't have */
if (!udc->driver || !udc->pullup) {
Expand Down Expand Up @@ -187,6 +188,8 @@ static ssize_t usbip_sockfd_store(struct device *dev,

wake_up_process(udc->ud.tcp_rx);
wake_up_process(udc->ud.tcp_tx);

mutex_unlock(&udc->ud.sysfs_lock);
return count;

} else {
Expand All @@ -207,6 +210,7 @@ static ssize_t usbip_sockfd_store(struct device *dev,
}

spin_unlock_irqrestore(&udc->lock, flags);
mutex_unlock(&udc->ud.sysfs_lock);

return count;

Expand All @@ -216,6 +220,7 @@ static ssize_t usbip_sockfd_store(struct device *dev,
spin_unlock_irq(&udc->ud.lock);
unlock:
spin_unlock_irqrestore(&udc->lock, flags);
mutex_unlock(&udc->ud.sysfs_lock);

return ret;
}
Expand Down

0 comments on commit 28dc923

Please sign in to comment.