diff options
author | Kumar Amit Mehta <gmate.amit@gmail.com> | 2013-02-22 01:07:08 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-03-11 12:38:37 -0400 |
commit | b5ae11463a67a5e468dd67482ab2308994da9b2b (patch) | |
tree | 4468d02d4c5ddc60712df24520996624471ffe70 | |
parent | 47b1be5c0f4ed4991f3d956dbd7ba69cb5bc521f (diff) |
staging: comedi: drivers: usbduxsigma.c: fix DMA buffers on stack
This patch fixes an instance of DMA buffer on stack(being passed to
usb_control_msg)for the USB-DUXsigma Board driver. Found using smatch.
Signed-off-by: Kumar Amit Mehta <gmate.amit@gmail.com>
Reviewed-by: Dan Carpenter <dan.carpenter@oracle.com>
Reviewed-by: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/staging/comedi/drivers/usbduxsigma.c | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/drivers/staging/comedi/drivers/usbduxsigma.c b/drivers/staging/comedi/drivers/usbduxsigma.c index d066351a71b2..a728c8fc32a2 100644 --- a/drivers/staging/comedi/drivers/usbduxsigma.c +++ b/drivers/staging/comedi/drivers/usbduxsigma.c | |||
@@ -681,7 +681,11 @@ static void usbduxsub_ao_IsocIrq(struct urb *urb) | |||
681 | static int usbduxsub_start(struct usbduxsub *usbduxsub) | 681 | static int usbduxsub_start(struct usbduxsub *usbduxsub) |
682 | { | 682 | { |
683 | int errcode = 0; | 683 | int errcode = 0; |
684 | uint8_t local_transfer_buffer[16]; | 684 | uint8_t *local_transfer_buffer; |
685 | |||
686 | local_transfer_buffer = kmalloc(16, GFP_KERNEL); | ||
687 | if (!local_transfer_buffer) | ||
688 | return -ENOMEM; | ||
685 | 689 | ||
686 | /* 7f92 to zero */ | 690 | /* 7f92 to zero */ |
687 | local_transfer_buffer[0] = 0; | 691 | local_transfer_buffer[0] = 0; |
@@ -702,19 +706,22 @@ static int usbduxsub_start(struct usbduxsub *usbduxsub) | |||
702 | 1, | 706 | 1, |
703 | /* Timeout */ | 707 | /* Timeout */ |
704 | BULK_TIMEOUT); | 708 | BULK_TIMEOUT); |
705 | if (errcode < 0) { | 709 | if (errcode < 0) |
706 | dev_err(&usbduxsub->interface->dev, | 710 | dev_err(&usbduxsub->interface->dev, |
707 | "comedi_: control msg failed (start)\n"); | 711 | "comedi_: control msg failed (start)\n"); |
708 | return errcode; | 712 | |
709 | } | 713 | kfree(local_transfer_buffer); |
710 | return 0; | 714 | return errcode; |
711 | } | 715 | } |
712 | 716 | ||
713 | static int usbduxsub_stop(struct usbduxsub *usbduxsub) | 717 | static int usbduxsub_stop(struct usbduxsub *usbduxsub) |
714 | { | 718 | { |
715 | int errcode = 0; | 719 | int errcode = 0; |
720 | uint8_t *local_transfer_buffer; | ||
716 | 721 | ||
717 | uint8_t local_transfer_buffer[16]; | 722 | local_transfer_buffer = kmalloc(16, GFP_KERNEL); |
723 | if (!local_transfer_buffer) | ||
724 | return -ENOMEM; | ||
718 | 725 | ||
719 | /* 7f92 to one */ | 726 | /* 7f92 to one */ |
720 | local_transfer_buffer[0] = 1; | 727 | local_transfer_buffer[0] = 1; |
@@ -732,12 +739,12 @@ static int usbduxsub_stop(struct usbduxsub *usbduxsub) | |||
732 | 1, | 739 | 1, |
733 | /* Timeout */ | 740 | /* Timeout */ |
734 | BULK_TIMEOUT); | 741 | BULK_TIMEOUT); |
735 | if (errcode < 0) { | 742 | if (errcode < 0) |
736 | dev_err(&usbduxsub->interface->dev, | 743 | dev_err(&usbduxsub->interface->dev, |
737 | "comedi_: control msg failed (stop)\n"); | 744 | "comedi_: control msg failed (stop)\n"); |
738 | return errcode; | 745 | |
739 | } | 746 | kfree(local_transfer_buffer); |
740 | return 0; | 747 | return errcode; |
741 | } | 748 | } |
742 | 749 | ||
743 | static int usbduxsub_upload(struct usbduxsub *usbduxsub, | 750 | static int usbduxsub_upload(struct usbduxsub *usbduxsub, |