This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / drivers / isdn / capi / capi.c
index e1eae82..9370808 100644 (file)
@@ -38,7 +38,6 @@
 #include <linux/kernelcapi.h>
 #include <linux/init.h>
 #include <linux/device.h>
-#include <linux/moduleparam.h>
 #include <linux/devfs_fs_kernel.h>
 #include <linux/isdn/capiutil.h>
 #include <linux/isdn/capicmd.h>
@@ -68,10 +67,10 @@ int capi_ttymajor = 191;
 int capi_ttyminors = CAPINC_NR_PORTS;
 #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */
 
-module_param_named(major, capi_major, uint, 0);
+MODULE_PARM(capi_major, "i");
 #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
-module_param_named(ttymajor, capi_ttymajor, uint, 0);
-module_param_named(ttyminors, capi_ttyminors, uint, 0);
+MODULE_PARM(capi_ttymajor, "i");
+MODULE_PARM(capi_ttyminors, "i");
 #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */
 
 /* -------- defines ------------------------------------------------- */
@@ -1045,14 +1044,16 @@ static void capinc_tty_close(struct tty_struct * tty, struct file * file)
 #endif
 }
 
-static int capinc_tty_write(struct tty_struct * tty,
+static int capinc_tty_write(struct tty_struct * tty, int from_user,
                            const unsigned char *buf, int count)
 {
        struct capiminor *mp = (struct capiminor *)tty->driver_data;
        struct sk_buff *skb;
+       int retval;
 
 #ifdef _DEBUG_TTYFUNCS
-       printk(KERN_DEBUG "capinc_tty_write(count=%d)\n", count);
+       printk(KERN_DEBUG "capinc_tty_write(from_user=%d,count=%d)\n",
+                               from_user, count);
 #endif
 
        if (!mp || !mp->nccip) {
@@ -1076,7 +1077,18 @@ static int capinc_tty_write(struct tty_struct * tty,
        }
 
        skb_reserve(skb, CAPI_DATA_B3_REQ_LEN);
-       memcpy(skb_put(skb, count), buf, count);
+       if (from_user) {
+               retval = copy_from_user(skb_put(skb, count), buf, count);
+               if (retval) {
+                       kfree_skb(skb);
+#ifdef _DEBUG_TTYFUNCS
+                       printk(KERN_DEBUG "capinc_tty_write: copy_from_user=%d\n", retval);
+#endif
+                       return -EFAULT;
+               }
+       } else {
+               memcpy(skb_put(skb, count), buf, count);
+       }
 
        skb_queue_tail(&mp->outqueue, skb);
        mp->outbytes += skb->len;