Skip to content

Commit

Permalink
misc: rtsx_usb: use separate command and response buffers
Browse files Browse the repository at this point in the history
rtsx_usb uses same buffer for command and response. There could
be a potential conflict using the same buffer for both especially
if retries and timeouts are involved.

Use separate command and response buffers to avoid conflicts.

Signed-off-by: Shuah Khan <[email protected]>
Cc: stable <[email protected]>
Link: https://lore.kernel.org/r/07e3721804ff07aaab9ef5b39a5691d0718b9ade.1656642167.git.skhan@linuxfoundation.org
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
shuahkh authored and gregkh committed Jul 1, 2022
1 parent eb7f8e2 commit 3776c78
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 10 deletions.
26 changes: 17 additions & 9 deletions drivers/misc/cardreader/rtsx_usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -631,15 +631,18 @@ static int rtsx_usb_probe(struct usb_interface *intf,

ucr->pusb_dev = usb_dev;

ucr->iobuf = kmalloc(IOBUF_SIZE, GFP_KERNEL);
if (!ucr->iobuf)
ucr->cmd_buf = kmalloc(IOBUF_SIZE, GFP_KERNEL);
if (!ucr->cmd_buf)
return -ENOMEM;

ucr->rsp_buf = kmalloc(IOBUF_SIZE, GFP_KERNEL);
if (!ucr->rsp_buf)
goto out_free_cmd_buf;

usb_set_intfdata(intf, ucr);

ucr->vendor_id = id->idVendor;
ucr->product_id = id->idProduct;
ucr->cmd_buf = ucr->rsp_buf = ucr->iobuf;

mutex_init(&ucr->dev_mutex);

Expand Down Expand Up @@ -667,9 +670,11 @@ static int rtsx_usb_probe(struct usb_interface *intf,

out_init_fail:
usb_set_intfdata(ucr->pusb_intf, NULL);
kfree(ucr->iobuf);
ucr->iobuf = NULL;
ucr->cmd_buf = ucr->rsp_buf = NULL;
kfree(ucr->rsp_buf);
ucr->rsp_buf = NULL;
out_free_cmd_buf:
kfree(ucr->cmd_buf);
ucr->cmd_buf = NULL;
return ret;
}

Expand All @@ -682,9 +687,12 @@ static void rtsx_usb_disconnect(struct usb_interface *intf)
mfd_remove_devices(&intf->dev);

usb_set_intfdata(ucr->pusb_intf, NULL);
kfree(ucr->iobuf);
ucr->iobuf = NULL;
ucr->cmd_buf = ucr->rsp_buf = NULL;

kfree(ucr->cmd_buf);
ucr->cmd_buf = NULL;

kfree(ucr->rsp_buf);
ucr->rsp_buf = NULL;
}

#ifdef CONFIG_PM
Expand Down
1 change: 0 additions & 1 deletion include/linux/rtsx_usb.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ struct rtsx_ucr {
struct usb_device *pusb_dev;
struct usb_interface *pusb_intf;
struct usb_sg_request current_sg;
unsigned char *iobuf;

struct timer_list sg_timer;
struct mutex dev_mutex;
Expand Down

0 comments on commit 3776c78

Please sign in to comment.