| From a47686636d84eaec5c9c6e84bd5f96bed34d526d Mon Sep 17 00:00:00 2001 |
| From: Mauro Carvalho Chehab <mchehab+samsung@kernel.org> |
| Date: Fri, 24 May 2019 10:59:43 -0400 |
| Subject: media: smsusb: better handle optional alignment |
| |
| From: Mauro Carvalho Chehab <mchehab+samsung@kernel.org> |
| |
| commit a47686636d84eaec5c9c6e84bd5f96bed34d526d upstream. |
| |
| Most Siano devices require an alignment for the response. |
| |
| Changeset f3be52b0056a ("media: usb: siano: Fix general protection fault in smsusb") |
| changed the logic with gets such aligment, but it now produces a |
| sparce warning: |
| |
| drivers/media/usb/siano/smsusb.c: In function 'smsusb_init_device': |
| drivers/media/usb/siano/smsusb.c:447:37: warning: 'in_maxp' may be used uninitialized in this function [-Wmaybe-uninitialized] |
| 447 | dev->response_alignment = in_maxp - sizeof(struct sms_msg_hdr); |
| | ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| The sparse message itself is bogus, but a broken (or fake) USB |
| eeprom could produce a negative value for response_alignment. |
| |
| So, change the code in order to check if the result is not |
| negative. |
| |
| Fixes: 31e0456de5be ("media: usb: siano: Fix general protection fault in smsusb") |
| CC: <stable@vger.kernel.org> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/media/usb/siano/smsusb.c | 8 ++++---- |
| 1 file changed, 4 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/media/usb/siano/smsusb.c |
| +++ b/drivers/media/usb/siano/smsusb.c |
| @@ -401,7 +401,7 @@ static int smsusb_init_device(struct usb |
| struct smsusb_device_t *dev; |
| void *mdev; |
| int i, rc; |
| - int in_maxp = 0; |
| + int align = 0; |
| |
| /* create device object */ |
| dev = kzalloc(sizeof(struct smsusb_device_t), GFP_KERNEL); |
| @@ -419,14 +419,14 @@ static int smsusb_init_device(struct usb |
| |
| if (desc->bEndpointAddress & USB_DIR_IN) { |
| dev->in_ep = desc->bEndpointAddress; |
| - in_maxp = usb_endpoint_maxp(desc); |
| + align = usb_endpoint_maxp(desc) - sizeof(struct sms_msg_hdr); |
| } else { |
| dev->out_ep = desc->bEndpointAddress; |
| } |
| } |
| |
| pr_debug("in_ep = %02x, out_ep = %02x\n", dev->in_ep, dev->out_ep); |
| - if (!dev->in_ep || !dev->out_ep) { /* Missing endpoints? */ |
| + if (!dev->in_ep || !dev->out_ep || align < 0) { /* Missing endpoints? */ |
| smsusb_term_device(intf); |
| return -ENODEV; |
| } |
| @@ -445,7 +445,7 @@ static int smsusb_init_device(struct usb |
| /* fall-thru */ |
| default: |
| dev->buffer_size = USB2_BUFFER_SIZE; |
| - dev->response_alignment = in_maxp - sizeof(struct sms_msg_hdr); |
| + dev->response_alignment = align; |
| |
| params.flags |= SMS_DEVICE_FAMILY2; |
| break; |