staging: most: usb: fix size overflow
authorAndrey Shvetsov <andrey.shvetsov@k2l.de>
Fri, 7 Apr 2017 13:38:39 +0000 (15:38 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 8 Apr 2017 10:41:40 +0000 (12:41 +0200)
Despite the user payload may not be bigger than (2**16 - 1) bytes, the
final packet size may be bigger because of the gap space needed for the
controller.

This patch removes the temporary variables of the type u16 that are used
to hold the offsets that may be bigger than 2**16 bytes.

Signed-off-by: Andrey Shvetsov <andrey.shvetsov@k2l.de>
Signed-off-by: Christian Gromm <christian.gromm@microchip.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/most/hdm-usb/hdm_usb.c

index 6e94ee2b4fb3a0ee74654ea8b6ebaddf8504ce97..ad907e9c59bbb3daf2e61b85454b3f5f5ad2856e 100644 (file)
@@ -281,7 +281,6 @@ static int hdm_add_padding(struct most_dev *mdev, int channel, struct mbo *mbo)
        struct most_channel_config *conf = &mdev->conf[channel];
        unsigned int frame_size = get_stream_frame_size(conf);
        unsigned int j, num_frames;
-       u16 rd_addr, wr_addr;
 
        if (!frame_size)
                return -EIO;
@@ -293,13 +292,10 @@ static int hdm_add_padding(struct most_dev *mdev, int channel, struct mbo *mbo)
                return -EIO;
        }
 
-       for (j = 1; j < num_frames; j++) {
-               wr_addr = (num_frames - j) * USB_MTU;
-               rd_addr = (num_frames - j) * frame_size;
-               memmove(mbo->virt_address + wr_addr,
-                       mbo->virt_address + rd_addr,
+       for (j = num_frames - 1; j > 0; j--)
+               memmove(mbo->virt_address + j * USB_MTU,
+                       mbo->virt_address + j * frame_size,
                        frame_size);
-       }
        mbo->buffer_length = num_frames * USB_MTU;
        return 0;
 }