ip_rt_ioctl(): take copyin to caller
[muen/linux.git] / net / ipv4 / af_inet.c
index 1c2bfee2e24938e44671e1595d68c0f4e0c438d0..c24008daa3d8763f547745a68ddd581f26c08e3c 100644 (file)
@@ -874,6 +874,7 @@ int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
        struct net *net = sock_net(sk);
        void __user *p = (void __user *)arg;
        struct ifreq ifr;
+       struct rtentry rt;
 
        switch (cmd) {
        case SIOCGSTAMP:
@@ -884,8 +885,12 @@ int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                break;
        case SIOCADDRT:
        case SIOCDELRT:
+               if (copy_from_user(&rt, p, sizeof(struct rtentry)))
+                       return -EFAULT;
+               err = ip_rt_ioctl(net, cmd, &rt);
+               break;
        case SIOCRTMSG:
-               err = ip_rt_ioctl(net, cmd, (void __user *)arg);
+               err = -EINVAL;
                break;
        case SIOCDARP:
        case SIOCGARP: