]> oss.titaniummirror.com Git - cp210x.git/blobdiff - src/cp210x.c.karmic
Several fixes.
[cp210x.git] / src / cp210x.c.karmic
index 6188b8a47d01f794794ac35cdd8c35f7f4546a48..707665782103b02ad8597c86c77c839a45b32e91 100644 (file)
@@ -273,19 +273,21 @@ static size_t cp210x_usbstr_from_user(char *kbuf, unsigned long ubuf, size_t kle
 {
        struct cp210x_buffer t;
        char* str;
+       size_t slen;
 
        if (!kbuf || !ubuf || !klen)
                return 0;
        if (copy_from_user(&t, (struct cp210x_buffer __user *)ubuf, sizeof(t)))
                return 0;
-       if (!t.buf || !t.len)
+       if (!t.buf || !t.len || USBSTRLEN(t.len) > klen)
                return 0;
-       if (t.len < klen)
-               klen = t.len;
-       str = kbuf + klen - t.len;
-       if (copy_from_user(kbuf + klen - t.len, (u8 __user *)t.buf, klen))
+       slen = (klen - 2) / 2;
+       if (t.len < slen)
+               slen = t.len;
+       str = kbuf + klen - slen;
+       if (copy_from_user(str, (u8 __user *)t.buf, slen))
                return 0;
-       return make_usb_string(kbuf, klen, str, t.len);
+       return make_usb_string(kbuf, klen, str, slen);
 }
 
 /* cp210x_has_setmfg
@@ -762,7 +764,7 @@ static int cp210x_ioctl(struct tty_struct *tty, struct file *file,
        }
        break;
 
-       case IOCTL_GPIOGET:
+       case CP210x_IOCTL_GPIOGET:
        if (cp210x_get_partnum(port) == CP210x_PART_CP2103) {
                u8 gpio = 0;
                if (!cp210x_gpioget(port, &gpio) && !copy_to_user(
@@ -772,27 +774,28 @@ static int cp210x_ioctl(struct tty_struct *tty, struct file *file,
        return -EFAULT;
        break;
 
-       case IOCTL_GPIOSET:
+       case CP210x_IOCTL_GPIOSET:
        if (cp210x_get_partnum(port) == CP210x_PART_CP2103 &&
                        !cp210x_gpioset(port, arg))
                return 0;
        return -EFAULT;
        break;
 
-       case IOCTL_GPIOBIC:
-       case IOCTL_GPIOBIS:
+       case CP210x_IOCTL_GPIOBIC:
+       case CP210x_IOCTL_GPIOBIS:
        if (cp210x_get_partnum(port) == CP210x_PART_CP2103 &&
-                       !cp210x_gpiosetb(port, (cmd==IOCTL_GPIOBIC) ?  0 : arg,
-                       (cmd==IOCTL_GPIOBIC) ? arg : 0))
+                       !cp210x_gpiosetb(port,
+                               (cmd==CP210x_IOCTL_GPIOBIC) ?  0 : arg,
+                               (cmd==CP210x_IOCTL_GPIOBIC) ? arg : 0))
                return 0;
        return -EFAULT;
        break;
 
-       case IOCTL_DEVICERESET:
+       case CP210x_IOCTL_DEVICERESET:
        return cp210x_reset(port);
        break;
 
-       case IOCTL_PORTCONFGET:
+       case CP210x_IOCTL_PORTCONFGET:
        {
                struct cp210x_port_config config;
                if (!cp210x_portconfget(port, &config) && !copy_to_user(
@@ -803,7 +806,7 @@ static int cp210x_ioctl(struct tty_struct *tty, struct file *file,
        return -EFAULT;
        break;
 
-       case IOCTL_PORTCONFSET:
+       case CP210x_IOCTL_PORTCONFSET:
        {
        struct cp210x_port_config config;
        if (!copy_from_user(&config, (struct cp210x_port_config __user *)arg,
@@ -814,7 +817,7 @@ static int cp210x_ioctl(struct tty_struct *tty, struct file *file,
        }
        break;
 
-       case IOCTL_SETVID:
+       case CP210x_IOCTL_SETVID:
        {
                unsigned int vid;
                if (!copy_from_user(&vid, (unsigned int __user *)arg,
@@ -825,7 +828,7 @@ static int cp210x_ioctl(struct tty_struct *tty, struct file *file,
        }
        break;
 
-       case IOCTL_SETPID:
+       case CP210x_IOCTL_SETPID:
        {
                unsigned int pid;
                if (!copy_from_user(&pid, (unsigned int __user *)arg,
@@ -836,7 +839,7 @@ static int cp210x_ioctl(struct tty_struct *tty, struct file *file,
        }
        break;
 
-       case IOCTL_SETMFG:
+       case CP210x_IOCTL_SETMFG:
        if (cp210x_has_setmfg()) {
                char usbstr[USBSTRLEN(CP210x_MAX_MFG_STRLEN)];
                size_t len = cp210x_usbstr_from_user(usbstr, arg,
@@ -847,7 +850,7 @@ static int cp210x_ioctl(struct tty_struct *tty, struct file *file,
        return -EFAULT;
        break;
 
-       case IOCTL_SETPRODUCT:
+       case CP210x_IOCTL_SETPRODUCT:
        {
                char usbstr[USBSTRLEN(CP210x_MAX_PRODUCT_STRLEN)];
                size_t len = cp210x_usbstr_from_user(usbstr, arg,
@@ -858,7 +861,7 @@ static int cp210x_ioctl(struct tty_struct *tty, struct file *file,
        }
        break;
 
-       case IOCTL_SETSERIAL:
+       case CP210x_IOCTL_SETSERIAL:
        {
                char usbstr[USBSTRLEN(CP210x_MAX_SERIAL_STRLEN)];
                size_t len = cp210x_usbstr_from_user(usbstr, arg,
@@ -869,7 +872,7 @@ static int cp210x_ioctl(struct tty_struct *tty, struct file *file,
        }
        break;
 
-       case IOCTL_SETDEVVER:
+       case CP210x_IOCTL_SETDEVVER:
        {
                unsigned int ver;
                if (!copy_from_user(&ver, (unsigned int __user *)arg,