This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / net / appletalk / ddp.c
index af571e3..0c0c5ec 100644 (file)
 #include <net/route.h>
 #include <linux/atalk.h>
 
-extern void aarp_cleanup_module(void);
-
-extern void aarp_probe_network(struct atalk_iface *atif);
-extern int  aarp_proxy_probe_network(struct atalk_iface *atif,
-                                    struct atalk_addr *sa);
-extern void aarp_proxy_remove(struct net_device *dev, struct atalk_addr *sa);
-
-extern void atalk_register_sysctl(void);
-extern void atalk_unregister_sysctl(void);
-
 struct datalink_proto *ddp_dl, *aarp_dl;
 static struct proto_ops atalk_dgram_ops;
 
@@ -580,7 +570,7 @@ static int atrtr_create(struct rtentry *r, struct net_device *devhint)
 
                retval = -ENOBUFS;
                if (!rt)
-                       goto out;
+                       goto out_unlock;
                memset(rt, 0, sizeof(*rt));
 
                rt->next = atalk_routes;
@@ -673,7 +663,7 @@ static int ddp_device_event(struct notifier_block *this, unsigned long event,
 
 /* ioctl calls. Shouldn't even need touching */
 /* Device configuration ioctl calls */
-static int atif_ioctl(int cmd, void *arg)
+static int atif_ioctl(int cmd, void __user *arg)
 {
        static char aarp_mcast[6] = { 0x09, 0x00, 0x00, 0xFF, 0xFF, 0xFF };
        struct ifreq atreq;
@@ -892,7 +882,7 @@ static int atif_ioctl(int cmd, void *arg)
 }
 
 /* Routing ioctl() calls */
-static int atrtr_ioctl(unsigned int cmd, void *arg)
+static int atrtr_ioctl(unsigned int cmd, void __user *arg)
 {
        struct rtentry rt;
 
@@ -908,12 +898,12 @@ static int atrtr_ioctl(unsigned int cmd, void *arg)
 
                case SIOCADDRT: {
                        struct net_device *dev = NULL;
-                       /*
-                        * FIXME: the name of the device is still in user
-                        * space, isn't it?
-                        */
                        if (rt.rt_dev) {
-                               dev = __dev_get_by_name(rt.rt_dev);
+                               char name[IFNAMSIZ];
+                               if (copy_from_user(name, rt.rt_dev, IFNAMSIZ-1))
+                                       return -EFAULT;
+                               name[IFNAMSIZ-1] = '\0';
+                               dev = __dev_get_by_name(name);
                                if (!dev)
                                        return -ENODEV;
                        }                       
@@ -1567,7 +1557,7 @@ static int atalk_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr
        struct atalk_route *rt;
        int err;
 
-       if (flags & ~MSG_DONTWAIT)
+       if (flags & ~(MSG_DONTWAIT|MSG_CMSG_COMPAT))
                return -EINVAL;
 
        if (len > DDP_MAXSZ)
@@ -1769,6 +1759,7 @@ static int atalk_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 {
        int rc = -EINVAL;
        struct sock *sk = sock->sk;
+       void __user *argp = (void __user *)arg;
 
        switch (cmd) {
                /* Protocol layer */
@@ -1778,7 +1769,7 @@ static int atalk_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 
                        if (amount < 0)
                                amount = 0;
-                       rc = put_user(amount, (int *)arg);
+                       rc = put_user(amount, (int __user *)argp);
                        break;
                }
                case TIOCINQ: {
@@ -1791,18 +1782,18 @@ static int atalk_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 
                        if (skb)
                                amount = skb->len - sizeof(struct ddpehdr);
-                       rc = put_user(amount, (int *)arg);
+                       rc = put_user(amount, (int __user *)argp);
                        break;
                }
                case SIOCGSTAMP:
-                       rc = sock_get_timestamp(sk, (struct timeval *)arg);
+                       rc = sock_get_timestamp(sk, argp);
                        break;
                /* Routing */
                case SIOCADDRT:
                case SIOCDELRT:
                        rc = -EPERM;
                        if (capable(CAP_NET_ADMIN))
-                               rc = atrtr_ioctl(cmd, (void *)arg);
+                               rc = atrtr_ioctl(cmd, argp);
                        break;
                /* Interface */
                case SIOCGIFADDR:
@@ -1813,7 +1804,7 @@ static int atalk_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                case SIOCSARP:          /* proxy AARP */
                case SIOCDARP:          /* proxy AARP */
                        rtnl_lock();
-                       rc = atif_ioctl(cmd, (void *)arg);
+                       rc = atif_ioctl(cmd, argp);
                        rtnl_unlock();
                        break;
                /* Physical layer ioctl calls */
@@ -1829,7 +1820,7 @@ static int atalk_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                case SIOCGIFCOUNT:
                case SIOCGIFINDEX:
                case SIOCGIFNAME:
-                       rc = dev_ioctl(cmd, (void *)arg);
+                       rc = dev_ioctl(cmd, argp);
                        break;
        }