V4L/DVB (9660): uvcvideo: Fix unaligned memory access.
authorMichael Hennerich <michael.hennerich@analog.com>
Tue, 11 Nov 2008 17:11:28 +0000 (14:11 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 29 Dec 2008 19:53:36 +0000 (17:53 -0200)
Use the unaligned memory access macros when accessing unaligned memory.

Signed-off-by: Michael Hennerich <michael.hennerich@analog.com>
Signed-off-by: Bryan Wu <cooloney@kernel.org>
Signed-off-by: Laurent Pinchart <laurent.pinchart@skynet.be>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/uvc/uvc_driver.c

index 1e3b4fe5ae93f93983ef0a6b951ddb61a26fc0ea..7fe3ae954c190cea14c272fc21e33206aa1f8bda 100644 (file)
@@ -32,6 +32,7 @@
 #include <linux/vmalloc.h>
 #include <linux/wait.h>
 #include <asm/atomic.h>
+#include <asm/unaligned.h>
 
 #include <media/v4l2-common.h>
 
@@ -452,20 +453,20 @@ static int uvc_parse_format(struct uvc_device *dev,
 
                frame->bFrameIndex = buffer[3];
                frame->bmCapabilities = buffer[4];
-               frame->wWidth = le16_to_cpup((__le16 *)&buffer[5]);
-               frame->wHeight = le16_to_cpup((__le16 *)&buffer[7]);
-               frame->dwMinBitRate = le32_to_cpup((__le32 *)&buffer[9]);
-               frame->dwMaxBitRate = le32_to_cpup((__le32 *)&buffer[13]);
+               frame->wWidth = get_unaligned_le16(&buffer[5]);
+               frame->wHeight = get_unaligned_le16(&buffer[7]);
+               frame->dwMinBitRate = get_unaligned_le32(&buffer[9]);
+               frame->dwMaxBitRate = get_unaligned_le32(&buffer[13]);
                if (ftype != VS_FRAME_FRAME_BASED) {
                        frame->dwMaxVideoFrameBufferSize =
-                               le32_to_cpup((__le32 *)&buffer[17]);
+                               get_unaligned_le32(&buffer[17]);
                        frame->dwDefaultFrameInterval =
-                               le32_to_cpup((__le32 *)&buffer[21]);
+                               get_unaligned_le32(&buffer[21]);
                        frame->bFrameIntervalType = buffer[25];
                } else {
                        frame->dwMaxVideoFrameBufferSize = 0;
                        frame->dwDefaultFrameInterval =
-                               le32_to_cpup((__le32 *)&buffer[17]);
+                               get_unaligned_le32(&buffer[17]);
                        frame->bFrameIntervalType = buffer[21];
                }
                frame->dwFrameInterval = *intervals;
@@ -488,7 +489,7 @@ static int uvc_parse_format(struct uvc_device *dev,
                 * some other divisions by zero which could happen.
                 */
                for (i = 0; i < n; ++i) {
-                       interval = le32_to_cpup((__le32 *)&buffer[26+4*i]);
+                       interval = get_unaligned_le32(&buffer[26+4*i]);
                        *(*intervals)++ = interval ? interval : 1;
                }
 
@@ -832,8 +833,7 @@ static int uvc_parse_vendor_control(struct uvc_device *dev,
                unit->type = VC_EXTENSION_UNIT;
                memcpy(unit->extension.guidExtensionCode, &buffer[4], 16);
                unit->extension.bNumControls = buffer[20];
-               unit->extension.bNrInPins =
-                       le16_to_cpup((__le16 *)&buffer[21]);
+               unit->extension.bNrInPins = get_unaligned_le16(&buffer[21]);
                unit->extension.baSourceID = (__u8 *)unit + sizeof *unit;
                memcpy(unit->extension.baSourceID, &buffer[22], p);
                unit->extension.bControlSize = buffer[22+p];
@@ -877,8 +877,8 @@ static int uvc_parse_standard_control(struct uvc_device *dev,
                        return -EINVAL;
                }
 
-               dev->uvc_version = le16_to_cpup((__le16 *)&buffer[3]);
-               dev->clock_frequency = le32_to_cpup((__le32 *)&buffer[7]);
+               dev->uvc_version = get_unaligned_le16(&buffer[3]);
+               dev->clock_frequency = get_unaligned_le32(&buffer[7]);
 
                /* Parse all USB Video Streaming interfaces. */
                for (i = 0; i < n; ++i) {
@@ -905,7 +905,7 @@ static int uvc_parse_standard_control(struct uvc_device *dev,
                /* Make sure the terminal type MSB is not null, otherwise it
                 * could be confused with a unit.
                 */
-               type = le16_to_cpup((__le16 *)&buffer[4]);
+               type = get_unaligned_le16(&buffer[4]);
                if ((type & 0xff00) == 0) {
                        uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol "
                                "interface %d INPUT_TERMINAL %d has invalid "
@@ -947,11 +947,11 @@ static int uvc_parse_standard_control(struct uvc_device *dev,
                        term->camera.bControlSize = n;
                        term->camera.bmControls = (__u8 *)term + sizeof *term;
                        term->camera.wObjectiveFocalLengthMin =
-                               le16_to_cpup((__le16 *)&buffer[8]);
+                               get_unaligned_le16(&buffer[8]);
                        term->camera.wObjectiveFocalLengthMax =
-                               le16_to_cpup((__le16 *)&buffer[10]);
+                               get_unaligned_le16(&buffer[10]);
                        term->camera.wOcularFocalLength =
-                               le16_to_cpup((__le16 *)&buffer[12]);
+                               get_unaligned_le16(&buffer[12]);
                        memcpy(term->camera.bmControls, &buffer[15], n);
                } else if (UVC_ENTITY_TYPE(term) == ITT_MEDIA_TRANSPORT_INPUT) {
                        term->media.bControlSize = n;
@@ -987,7 +987,7 @@ static int uvc_parse_standard_control(struct uvc_device *dev,
                /* Make sure the terminal type MSB is not null, otherwise it
                 * could be confused with a unit.
                 */
-               type = le16_to_cpup((__le16 *)&buffer[4]);
+               type = get_unaligned_le16(&buffer[4]);
                if ((type & 0xff00) == 0) {
                        uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol "
                                "interface %d OUTPUT_TERMINAL %d has invalid "
@@ -1061,7 +1061,7 @@ static int uvc_parse_standard_control(struct uvc_device *dev,
                unit->type = buffer[2];
                unit->processing.bSourceID = buffer[4];
                unit->processing.wMaxMultiplier =
-                       le16_to_cpup((__le16 *)&buffer[5]);
+                       get_unaligned_le16(&buffer[5]);
                unit->processing.bControlSize = buffer[7];
                unit->processing.bmControls = (__u8 *)unit + sizeof *unit;
                memcpy(unit->processing.bmControls, &buffer[8], n);
@@ -1096,8 +1096,7 @@ static int uvc_parse_standard_control(struct uvc_device *dev,
                unit->type = buffer[2];
                memcpy(unit->extension.guidExtensionCode, &buffer[4], 16);
                unit->extension.bNumControls = buffer[20];
-               unit->extension.bNrInPins =
-                       le16_to_cpup((__le16 *)&buffer[21]);
+               unit->extension.bNrInPins = get_unaligned_le16(&buffer[21]);
                unit->extension.baSourceID = (__u8 *)unit + sizeof *unit;
                memcpy(unit->extension.baSourceID, &buffer[22], p);
                unit->extension.bControlSize = buffer[22+p];