patch "usb: gadget: f_hid: fixed NULL pointer dereference" added to usb-linus
Subsystems (2)
This is a note to let you know that I've just added the patch titled
usb: gadget: f_hid: fixed NULL pointer dereference
to my usb git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git
in the usb-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
From 2867652e4766360adf14dfda3832455e04964f2a Mon Sep 17 00:00:00 2001
From: Phil Elwell <[email protected]>
Date: Fri, 23 Jul 2021 18:59:30 +0300
Subject: usb: gadget: f_hid: fixed NULL pointer dereference
Disconnecting and reconnecting the USB cable can lead to crashes and a variety of kernel log spam.
The problem was found and reproduced on the Raspberry Pi [1] and the original fix was created in Raspberry's own fork [2].
--- drivers/usb/gadget/function/f_hid.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-)
drivers/usb/gadget/function/f_hid.c +20 -6
@@ -338,6 +338,11 @@ static ssize_t f_hidg_write(struct file *file, const char __user *buffer,spin_lock_irqsave (&hidg->write_spinlock, flags); +if (!hidg->req) { +spin_unlock_irqrestore (&hidg->write_spinlock, flags); +return -ESHUTDOWN ; + } +#define WRITE_COND (!hidg->write_pending) try_again:/* write queue */
@@ -358,8 +363,14 @@ 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 (req->buf, buffer, count); +if (!req) { +ERROR (hidg->func.config->cdev,"hidg->req is NULL\n" ); + status = -ESHUTDOWN ; + goto release_write_pending; + } + + status =copy_from_user (req->buf, buffer, count);if (status !=0 ) {ERROR (hidg->func.config->cdev,"copy_from_user error\n" );
@@ -387,14 +398,17 @@ static ssize_t f_hidg_write(struct file *file, const char __user *buffer,spin_unlock_irqrestore (&hidg->write_spinlock, flags); +if (!hidg->in_ep->enabled) { +ERROR (hidg->func.config->cdev,"in_ep is disabled\n" ); + status = -ESHUTDOWN ; + goto release_write_pending; + } + 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); +if (status <0 ) goto release_write_pending; - }else { +else status = count; - }return status; release_write_pending:
Signature · 1 line
2.32.0