gspca_err(gspca_dev, "reg_r: buffer overflow\n");
                return;
        }
+       if (len == 0) {
+               gspca_err(gspca_dev, "reg_r: zero-length read\n");
+               return;
+       }
        if (gspca_dev->usb_err < 0)
                return;
        ret = usb_control_msg(gspca_dev->dev,
                        USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
                        0,              /* value */
                        index,
-                       len ? gspca_dev->usb_buf : NULL, len,
+                       gspca_dev->usb_buf, len,
                        500);
        if (ret < 0) {
                pr_err("reg_r err %d\n", ret);
                case MegaImageVI:
                        reg_w_riv(gspca_dev, 0xf0, 0, 0);
                        spca504B_WaitCmdStatus(gspca_dev);
-                       reg_r(gspca_dev, 0xf0, 4, 0);
+                       reg_w_riv(gspca_dev, 0xf0, 4, 0);
                        spca504B_WaitCmdStatus(gspca_dev);
                        break;
                default: