Staging: sep: return -EFAULT on copy_to_user errors
[safe/jmp/linux-2.6] / net / ipv6 / addrlabel.c
index d280366..8c4348c 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/list.h>
 #include <linux/rcupdate.h>
 #include <linux/in6.h>
+#include <linux/slab.h>
 #include <net/addrconf.h>
 #include <linux/if_addrlabel.h>
 #include <linux/netlink.h>
@@ -186,7 +187,7 @@ u32 ipv6_addr_label(struct net *net,
        label = p ? p->label : IPV6_ADDR_LABEL_DEFAULT;
        rcu_read_unlock();
 
-       ADDRLABEL(KERN_DEBUG "%s(addr=%p6, type=%d, ifindex=%d) => %08x\n",
+       ADDRLABEL(KERN_DEBUG "%s(addr=%pI6, type=%d, ifindex=%d) => %08x\n",
                  __func__, addr, type, ifindex, label);
 
        return label;
@@ -201,7 +202,7 @@ static struct ip6addrlbl_entry *ip6addrlbl_alloc(struct net *net,
        struct ip6addrlbl_entry *newp;
        int addrtype;
 
-       ADDRLABEL(KERN_DEBUG "%s(prefix=%p6, prefixlen=%d, ifindex=%d, label=%u)\n",
+       ADDRLABEL(KERN_DEBUG "%s(prefix=%pI6, prefixlen=%d, ifindex=%d, label=%u)\n",
                  __func__, prefix, prefixlen, ifindex, (unsigned int)label);
 
        addrtype = ipv6_addr_type(prefix) & (IPV6_ADDR_MAPPED | IPV6_ADDR_COMPATv4 | IPV6_ADDR_LOOPBACK);
@@ -289,7 +290,7 @@ static int ip6addrlbl_add(struct net *net,
        struct ip6addrlbl_entry *newp;
        int ret = 0;
 
-       ADDRLABEL(KERN_DEBUG "%s(prefix=%p6, prefixlen=%d, ifindex=%d, label=%u, replace=%d)\n",
+       ADDRLABEL(KERN_DEBUG "%s(prefix=%pI6, prefixlen=%d, ifindex=%d, label=%u, replace=%d)\n",
                  __func__, prefix, prefixlen, ifindex, (unsigned int)label,
                  replace);
 
@@ -313,7 +314,7 @@ static int __ip6addrlbl_del(struct net *net,
        struct hlist_node *pos, *n;
        int ret = -ESRCH;
 
-       ADDRLABEL(KERN_DEBUG "%s(prefix=%p6, prefixlen=%d, ifindex=%d)\n",
+       ADDRLABEL(KERN_DEBUG "%s(prefix=%pI6, prefixlen=%d, ifindex=%d)\n",
                  __func__, prefix, prefixlen, ifindex);
 
        hlist_for_each_entry_safe(p, pos, n, &ip6addrlbl_table.head, list) {
@@ -337,7 +338,7 @@ static int ip6addrlbl_del(struct net *net,
        struct in6_addr prefix_buf;
        int ret;
 
-       ADDRLABEL(KERN_DEBUG "%s(prefix=%p6, prefixlen=%d, ifindex=%d)\n",
+       ADDRLABEL(KERN_DEBUG "%s(prefix=%pI6, prefixlen=%d, ifindex=%d)\n",
                  __func__, prefix, prefixlen, ifindex);
 
        ipv6_addr_prefix(&prefix_buf, prefix, prefixlen);
@@ -421,10 +422,6 @@ static int ip6addrlbl_newdel(struct sk_buff *skb, struct nlmsghdr *nlh,
            ifal->ifal_prefixlen > 128)
                return -EINVAL;
 
-       if (ifal->ifal_index &&
-           !__dev_get_by_index(net, ifal->ifal_index))
-               return -EINVAL;
-
        if (!tb[IFAL_ADDRESS])
                return -EINVAL;
 
@@ -440,6 +437,10 @@ static int ip6addrlbl_newdel(struct sk_buff *skb, struct nlmsghdr *nlh,
 
        switch(nlh->nlmsg_type) {
        case RTM_NEWADDRLABEL:
+               if (ifal->ifal_index &&
+                   !__dev_get_by_index(net, ifal->ifal_index))
+                       return -EINVAL;
+
                err = ip6addrlbl_add(net, pfx, ifal->ifal_prefixlen,
                                     ifal->ifal_index, label,
                                     nlh->nlmsg_flags & NLM_F_REPLACE);