diff options
author | Jamal Hadi Salim <hadi@cyberus.ca> | 2005-06-19 01:54:12 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2005-06-19 01:54:12 -0400 |
commit | b6544c0b4cf2bd96195f3cdb7cebfb35090fc557 (patch) | |
tree | 717f69a0c204b12eeedb8035fb66c8e9bb2d5a09 /net/ipv6 | |
parent | 1797754ea7ee5e0d859b0a32506ff999f8d5fb71 (diff) |
[NETLINK]: Correctly set NLM_F_MULTI without checking the pid
This patch rectifies some rtnetlink message builders that derive the
flags from the pid. It is now explicit like the other cases
which get it right. Also fixes half a dozen dumpers which did not
set NLM_F_MULTI at all.
Signed-off-by: Jamal Hadi Salim <hadi@cyberus.ca>
Signed-off-by: Thomas Graf <tgraf@suug.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/addrconf.c | 49 | ||||
-rw-r--r-- | net/ipv6/route.c | 11 |
2 files changed, 29 insertions, 31 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 2720899d516c..cdd19c54c03f 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -2622,15 +2622,14 @@ inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) | |||
2622 | } | 2622 | } |
2623 | 2623 | ||
2624 | static int inet6_fill_ifaddr(struct sk_buff *skb, struct inet6_ifaddr *ifa, | 2624 | static int inet6_fill_ifaddr(struct sk_buff *skb, struct inet6_ifaddr *ifa, |
2625 | u32 pid, u32 seq, int event) | 2625 | u32 pid, u32 seq, int event, unsigned int flags) |
2626 | { | 2626 | { |
2627 | struct ifaddrmsg *ifm; | 2627 | struct ifaddrmsg *ifm; |
2628 | struct nlmsghdr *nlh; | 2628 | struct nlmsghdr *nlh; |
2629 | struct ifa_cacheinfo ci; | 2629 | struct ifa_cacheinfo ci; |
2630 | unsigned char *b = skb->tail; | 2630 | unsigned char *b = skb->tail; |
2631 | 2631 | ||
2632 | nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*ifm)); | 2632 | nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*ifm), flags); |
2633 | if (pid) nlh->nlmsg_flags |= NLM_F_MULTI; | ||
2634 | ifm = NLMSG_DATA(nlh); | 2633 | ifm = NLMSG_DATA(nlh); |
2635 | ifm->ifa_family = AF_INET6; | 2634 | ifm->ifa_family = AF_INET6; |
2636 | ifm->ifa_prefixlen = ifa->prefix_len; | 2635 | ifm->ifa_prefixlen = ifa->prefix_len; |
@@ -2672,15 +2671,14 @@ rtattr_failure: | |||
2672 | } | 2671 | } |
2673 | 2672 | ||
2674 | static int inet6_fill_ifmcaddr(struct sk_buff *skb, struct ifmcaddr6 *ifmca, | 2673 | static int inet6_fill_ifmcaddr(struct sk_buff *skb, struct ifmcaddr6 *ifmca, |
2675 | u32 pid, u32 seq, int event) | 2674 | u32 pid, u32 seq, int event, unsigned flags) |
2676 | { | 2675 | { |
2677 | struct ifaddrmsg *ifm; | 2676 | struct ifaddrmsg *ifm; |
2678 | struct nlmsghdr *nlh; | 2677 | struct nlmsghdr *nlh; |
2679 | struct ifa_cacheinfo ci; | 2678 | struct ifa_cacheinfo ci; |
2680 | unsigned char *b = skb->tail; | 2679 | unsigned char *b = skb->tail; |
2681 | 2680 | ||
2682 | nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*ifm)); | 2681 | nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*ifm), flags); |
2683 | if (pid) nlh->nlmsg_flags |= NLM_F_MULTI; | ||
2684 | ifm = NLMSG_DATA(nlh); | 2682 | ifm = NLMSG_DATA(nlh); |
2685 | ifm->ifa_family = AF_INET6; | 2683 | ifm->ifa_family = AF_INET6; |
2686 | ifm->ifa_prefixlen = 128; | 2684 | ifm->ifa_prefixlen = 128; |
@@ -2709,15 +2707,14 @@ rtattr_failure: | |||
2709 | } | 2707 | } |
2710 | 2708 | ||
2711 | static int inet6_fill_ifacaddr(struct sk_buff *skb, struct ifacaddr6 *ifaca, | 2709 | static int inet6_fill_ifacaddr(struct sk_buff *skb, struct ifacaddr6 *ifaca, |
2712 | u32 pid, u32 seq, int event) | 2710 | u32 pid, u32 seq, int event, unsigned int flags) |
2713 | { | 2711 | { |
2714 | struct ifaddrmsg *ifm; | 2712 | struct ifaddrmsg *ifm; |
2715 | struct nlmsghdr *nlh; | 2713 | struct nlmsghdr *nlh; |
2716 | struct ifa_cacheinfo ci; | 2714 | struct ifa_cacheinfo ci; |
2717 | unsigned char *b = skb->tail; | 2715 | unsigned char *b = skb->tail; |
2718 | 2716 | ||
2719 | nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*ifm)); | 2717 | nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*ifm), flags); |
2720 | if (pid) nlh->nlmsg_flags |= NLM_F_MULTI; | ||
2721 | ifm = NLMSG_DATA(nlh); | 2718 | ifm = NLMSG_DATA(nlh); |
2722 | ifm->ifa_family = AF_INET6; | 2719 | ifm->ifa_family = AF_INET6; |
2723 | ifm->ifa_prefixlen = 128; | 2720 | ifm->ifa_prefixlen = 128; |
@@ -2786,7 +2783,8 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb, | |||
2786 | continue; | 2783 | continue; |
2787 | if ((err = inet6_fill_ifaddr(skb, ifa, | 2784 | if ((err = inet6_fill_ifaddr(skb, ifa, |
2788 | NETLINK_CB(cb->skb).pid, | 2785 | NETLINK_CB(cb->skb).pid, |
2789 | cb->nlh->nlmsg_seq, RTM_NEWADDR)) <= 0) | 2786 | cb->nlh->nlmsg_seq, RTM_NEWADDR, |
2787 | NLM_F_MULTI)) <= 0) | ||
2790 | goto done; | 2788 | goto done; |
2791 | } | 2789 | } |
2792 | /* temp addr */ | 2790 | /* temp addr */ |
@@ -2797,7 +2795,8 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb, | |||
2797 | continue; | 2795 | continue; |
2798 | if ((err = inet6_fill_ifaddr(skb, ifa, | 2796 | if ((err = inet6_fill_ifaddr(skb, ifa, |
2799 | NETLINK_CB(cb->skb).pid, | 2797 | NETLINK_CB(cb->skb).pid, |
2800 | cb->nlh->nlmsg_seq, RTM_NEWADDR)) <= 0) | 2798 | cb->nlh->nlmsg_seq, RTM_NEWADDR, |
2799 | NLM_F_MULTI)) <= 0) | ||
2801 | goto done; | 2800 | goto done; |
2802 | } | 2801 | } |
2803 | #endif | 2802 | #endif |
@@ -2810,7 +2809,8 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb, | |||
2810 | continue; | 2809 | continue; |
2811 | if ((err = inet6_fill_ifmcaddr(skb, ifmca, | 2810 | if ((err = inet6_fill_ifmcaddr(skb, ifmca, |
2812 | NETLINK_CB(cb->skb).pid, | 2811 | NETLINK_CB(cb->skb).pid, |
2813 | cb->nlh->nlmsg_seq, RTM_GETMULTICAST)) <= 0) | 2812 | cb->nlh->nlmsg_seq, RTM_GETMULTICAST, |
2813 | NLM_F_MULTI)) <= 0) | ||
2814 | goto done; | 2814 | goto done; |
2815 | } | 2815 | } |
2816 | break; | 2816 | break; |
@@ -2822,7 +2822,8 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb, | |||
2822 | continue; | 2822 | continue; |
2823 | if ((err = inet6_fill_ifacaddr(skb, ifaca, | 2823 | if ((err = inet6_fill_ifacaddr(skb, ifaca, |
2824 | NETLINK_CB(cb->skb).pid, | 2824 | NETLINK_CB(cb->skb).pid, |
2825 | cb->nlh->nlmsg_seq, RTM_GETANYCAST)) <= 0) | 2825 | cb->nlh->nlmsg_seq, RTM_GETANYCAST, |
2826 | NLM_F_MULTI)) <= 0) | ||
2826 | goto done; | 2827 | goto done; |
2827 | } | 2828 | } |
2828 | break; | 2829 | break; |
@@ -2872,7 +2873,7 @@ static void inet6_ifa_notify(int event, struct inet6_ifaddr *ifa) | |||
2872 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_IFADDR, ENOBUFS); | 2873 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_IFADDR, ENOBUFS); |
2873 | return; | 2874 | return; |
2874 | } | 2875 | } |
2875 | if (inet6_fill_ifaddr(skb, ifa, 0, 0, event) < 0) { | 2876 | if (inet6_fill_ifaddr(skb, ifa, 0, 0, event, 0) < 0) { |
2876 | kfree_skb(skb); | 2877 | kfree_skb(skb); |
2877 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_IFADDR, EINVAL); | 2878 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_IFADDR, EINVAL); |
2878 | return; | 2879 | return; |
@@ -2907,7 +2908,7 @@ static void inline ipv6_store_devconf(struct ipv6_devconf *cnf, | |||
2907 | } | 2908 | } |
2908 | 2909 | ||
2909 | static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev, | 2910 | static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev, |
2910 | u32 pid, u32 seq, int event) | 2911 | u32 pid, u32 seq, int event, unsigned int flags) |
2911 | { | 2912 | { |
2912 | struct net_device *dev = idev->dev; | 2913 | struct net_device *dev = idev->dev; |
2913 | __s32 *array = NULL; | 2914 | __s32 *array = NULL; |
@@ -2918,8 +2919,7 @@ static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev, | |||
2918 | __u32 mtu = dev->mtu; | 2919 | __u32 mtu = dev->mtu; |
2919 | struct ifla_cacheinfo ci; | 2920 | struct ifla_cacheinfo ci; |
2920 | 2921 | ||
2921 | nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*r)); | 2922 | nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*r), flags); |
2922 | if (pid) nlh->nlmsg_flags |= NLM_F_MULTI; | ||
2923 | r = NLMSG_DATA(nlh); | 2923 | r = NLMSG_DATA(nlh); |
2924 | r->ifi_family = AF_INET6; | 2924 | r->ifi_family = AF_INET6; |
2925 | r->ifi_type = dev->type; | 2925 | r->ifi_type = dev->type; |
@@ -2986,7 +2986,7 @@ static int inet6_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) | |||
2986 | if ((idev = in6_dev_get(dev)) == NULL) | 2986 | if ((idev = in6_dev_get(dev)) == NULL) |
2987 | continue; | 2987 | continue; |
2988 | err = inet6_fill_ifinfo(skb, idev, NETLINK_CB(cb->skb).pid, | 2988 | err = inet6_fill_ifinfo(skb, idev, NETLINK_CB(cb->skb).pid, |
2989 | cb->nlh->nlmsg_seq, RTM_NEWLINK); | 2989 | cb->nlh->nlmsg_seq, RTM_NEWLINK, NLM_F_MULTI); |
2990 | in6_dev_put(idev); | 2990 | in6_dev_put(idev); |
2991 | if (err <= 0) | 2991 | if (err <= 0) |
2992 | break; | 2992 | break; |
@@ -3008,7 +3008,7 @@ void inet6_ifinfo_notify(int event, struct inet6_dev *idev) | |||
3008 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_IFINFO, ENOBUFS); | 3008 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_IFINFO, ENOBUFS); |
3009 | return; | 3009 | return; |
3010 | } | 3010 | } |
3011 | if (inet6_fill_ifinfo(skb, idev, 0, 0, event) < 0) { | 3011 | if (inet6_fill_ifinfo(skb, idev, 0, 0, event, 0) < 0) { |
3012 | kfree_skb(skb); | 3012 | kfree_skb(skb); |
3013 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_IFINFO, EINVAL); | 3013 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_IFINFO, EINVAL); |
3014 | return; | 3014 | return; |
@@ -3018,18 +3018,15 @@ void inet6_ifinfo_notify(int event, struct inet6_dev *idev) | |||
3018 | } | 3018 | } |
3019 | 3019 | ||
3020 | static int inet6_fill_prefix(struct sk_buff *skb, struct inet6_dev *idev, | 3020 | static int inet6_fill_prefix(struct sk_buff *skb, struct inet6_dev *idev, |
3021 | struct prefix_info *pinfo, u32 pid, u32 seq, int event) | 3021 | struct prefix_info *pinfo, u32 pid, u32 seq, |
3022 | int event, unsigned int flags) | ||
3022 | { | 3023 | { |
3023 | struct prefixmsg *pmsg; | 3024 | struct prefixmsg *pmsg; |
3024 | struct nlmsghdr *nlh; | 3025 | struct nlmsghdr *nlh; |
3025 | unsigned char *b = skb->tail; | 3026 | unsigned char *b = skb->tail; |
3026 | struct prefix_cacheinfo ci; | 3027 | struct prefix_cacheinfo ci; |
3027 | 3028 | ||
3028 | nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*pmsg)); | 3029 | nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*pmsg), flags); |
3029 | |||
3030 | if (pid) | ||
3031 | nlh->nlmsg_flags |= NLM_F_MULTI; | ||
3032 | |||
3033 | pmsg = NLMSG_DATA(nlh); | 3030 | pmsg = NLMSG_DATA(nlh); |
3034 | pmsg->prefix_family = AF_INET6; | 3031 | pmsg->prefix_family = AF_INET6; |
3035 | pmsg->prefix_ifindex = idev->dev->ifindex; | 3032 | pmsg->prefix_ifindex = idev->dev->ifindex; |
@@ -3068,7 +3065,7 @@ static void inet6_prefix_notify(int event, struct inet6_dev *idev, | |||
3068 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_PREFIX, ENOBUFS); | 3065 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_PREFIX, ENOBUFS); |
3069 | return; | 3066 | return; |
3070 | } | 3067 | } |
3071 | if (inet6_fill_prefix(skb, idev, pinfo, 0, 0, event) < 0) { | 3068 | if (inet6_fill_prefix(skb, idev, pinfo, 0, 0, event, 0) < 0) { |
3072 | kfree_skb(skb); | 3069 | kfree_skb(skb); |
3073 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_PREFIX, EINVAL); | 3070 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_PREFIX, EINVAL); |
3074 | return; | 3071 | return; |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 3bf8a0254f81..1f5b226c3573 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -1570,7 +1570,8 @@ static int rt6_fill_node(struct sk_buff *skb, struct rt6_info *rt, | |||
1570 | struct in6_addr *src, | 1570 | struct in6_addr *src, |
1571 | int iif, | 1571 | int iif, |
1572 | int type, u32 pid, u32 seq, | 1572 | int type, u32 pid, u32 seq, |
1573 | struct nlmsghdr *in_nlh, int prefix) | 1573 | struct nlmsghdr *in_nlh, int prefix, |
1574 | unsigned int flags) | ||
1574 | { | 1575 | { |
1575 | struct rtmsg *rtm; | 1576 | struct rtmsg *rtm; |
1576 | struct nlmsghdr *nlh; | 1577 | struct nlmsghdr *nlh; |
@@ -1588,7 +1589,7 @@ static int rt6_fill_node(struct sk_buff *skb, struct rt6_info *rt, | |||
1588 | pid = in_nlh->nlmsg_pid; | 1589 | pid = in_nlh->nlmsg_pid; |
1589 | } | 1590 | } |
1590 | 1591 | ||
1591 | nlh = NLMSG_PUT(skb, pid, seq, type, sizeof(*rtm)); | 1592 | nlh = NLMSG_NEW(skb, pid, seq, type, sizeof(*rtm), flags); |
1592 | rtm = NLMSG_DATA(nlh); | 1593 | rtm = NLMSG_DATA(nlh); |
1593 | rtm->rtm_family = AF_INET6; | 1594 | rtm->rtm_family = AF_INET6; |
1594 | rtm->rtm_dst_len = rt->rt6i_dst.plen; | 1595 | rtm->rtm_dst_len = rt->rt6i_dst.plen; |
@@ -1674,7 +1675,7 @@ static int rt6_dump_route(struct rt6_info *rt, void *p_arg) | |||
1674 | 1675 | ||
1675 | return rt6_fill_node(arg->skb, rt, NULL, NULL, 0, RTM_NEWROUTE, | 1676 | return rt6_fill_node(arg->skb, rt, NULL, NULL, 0, RTM_NEWROUTE, |
1676 | NETLINK_CB(arg->cb->skb).pid, arg->cb->nlh->nlmsg_seq, | 1677 | NETLINK_CB(arg->cb->skb).pid, arg->cb->nlh->nlmsg_seq, |
1677 | NULL, prefix); | 1678 | NULL, prefix, NLM_F_MULTI); |
1678 | } | 1679 | } |
1679 | 1680 | ||
1680 | static int fib6_dump_node(struct fib6_walker_t *w) | 1681 | static int fib6_dump_node(struct fib6_walker_t *w) |
@@ -1822,7 +1823,7 @@ int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg) | |||
1822 | &fl.fl6_dst, &fl.fl6_src, | 1823 | &fl.fl6_dst, &fl.fl6_src, |
1823 | iif, | 1824 | iif, |
1824 | RTM_NEWROUTE, NETLINK_CB(in_skb).pid, | 1825 | RTM_NEWROUTE, NETLINK_CB(in_skb).pid, |
1825 | nlh->nlmsg_seq, nlh, 0); | 1826 | nlh->nlmsg_seq, nlh, 0, 0); |
1826 | if (err < 0) { | 1827 | if (err < 0) { |
1827 | err = -EMSGSIZE; | 1828 | err = -EMSGSIZE; |
1828 | goto out_free; | 1829 | goto out_free; |
@@ -1848,7 +1849,7 @@ void inet6_rt_notify(int event, struct rt6_info *rt, struct nlmsghdr *nlh) | |||
1848 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_ROUTE, ENOBUFS); | 1849 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_ROUTE, ENOBUFS); |
1849 | return; | 1850 | return; |
1850 | } | 1851 | } |
1851 | if (rt6_fill_node(skb, rt, NULL, NULL, 0, event, 0, 0, nlh, 0) < 0) { | 1852 | if (rt6_fill_node(skb, rt, NULL, NULL, 0, event, 0, 0, nlh, 0, 0) < 0) { |
1852 | kfree_skb(skb); | 1853 | kfree_skb(skb); |
1853 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_ROUTE, EINVAL); | 1854 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_ROUTE, EINVAL); |
1854 | return; | 1855 | return; |