#include "gspca.h"
 
-#define DRIVER_VERSION_NUMBER  KERNEL_VERSION(2, 1, 0)
-static const char version[] = "2.1.0";
+#define DRIVER_VERSION_NUMBER  KERNEL_VERSION(2, 1, 3)
+static const char version[] = "2.1.3";
 
 MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>");
 MODULE_DESCRIPTION("GSPCA/SN9C102 USB Camera Driver");
                          const __u8 *buffer,
                          __u16 len)
 {
+       __u8 tmpbuf[32];
+
+#ifdef CONFIG_VIDEO_ADV_DEBUG
+       if (len > sizeof tmpbuf) {
+               PDEBUG(D_ERR|D_PACK, "reg_w: buffer overflow");
+               return;
+       }
+#endif
+       memcpy(tmpbuf, buffer, len);
        usb_control_msg(dev,
                        usb_sndctrlpipe(dev, 0),
                        0x08,                   /* request */
                        USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
                        value,
                        0,                      /* index */
-                       (__u8 *) buffer, len,
+                       tmpbuf, len,
                        500);
 }
 
                        unsigned char *data,            /* isoc packet */
                        int len)                        /* iso packet length */
 {
-       int p;
+       int i;
 
        if (len > 6 && len < 24) {
-               for (p = 0; p < len - 6; p++) {
-                       if (data[0 + p] == 0xff
-                           && data[1 + p] == 0xff
-                           && data[2 + p] == 0x00
-                           && data[3 + p] == 0xc4
-                           && data[4 + p] == 0xc4
-                           && data[5 + p] == 0x96) {   /* start of frame */
-                               frame = gspca_frame_add(gspca_dev,
-                                                       LAST_PACKET,
-                                                       frame,
-                                                       data, 0);
-                               data += 12;
-                               len -= 12;
+               for (i = 0; i < len - 6; i++) {
+                       if (data[0 + i] == 0xff
+                           && data[1 + i] == 0xff
+                           && data[2 + i] == 0x00
+                           && data[3 + i] == 0xc4
+                           && data[4 + i] == 0xc4
+                           && data[5 + i] == 0x96) {   /* start of frame */
+                               frame = gspca_frame_add(gspca_dev, LAST_PACKET,
+                                                       frame, data, 0);
+                               data += i + 12;
+                               len -= i + 12;
                                gspca_frame_add(gspca_dev, FIRST_PACKET,
                                                frame, data, len);
                                return;