diff options
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/addrconf.c | 54 | ||||
-rw-r--r-- | net/ipv6/af_inet6.c | 34 | ||||
-rw-r--r-- | net/ipv6/ipv6_sockglue.c | 3 | ||||
-rw-r--r-- | net/ipv6/ndisc.c | 22 | ||||
-rw-r--r-- | net/ipv6/route.c | 9 | ||||
-rw-r--r-- | net/ipv6/sit.c | 5 | ||||
-rw-r--r-- | net/ipv6/tcp_ipv6.c | 8 | ||||
-rw-r--r-- | net/ipv6/xfrm6_policy.c | 2 | ||||
-rw-r--r-- | net/ipv6/xfrm6_state.c | 2 |
9 files changed, 69 insertions, 70 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 1220e2c7831e..e83852ab4dc8 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -2227,10 +2227,24 @@ int addrconf_del_ifaddr(struct net *net, void __user *arg) | |||
2227 | return err; | 2227 | return err; |
2228 | } | 2228 | } |
2229 | 2229 | ||
2230 | static void add_addr(struct inet6_dev *idev, const struct in6_addr *addr, | ||
2231 | int plen, int scope) | ||
2232 | { | ||
2233 | struct inet6_ifaddr *ifp; | ||
2234 | |||
2235 | ifp = ipv6_add_addr(idev, addr, plen, scope, IFA_F_PERMANENT); | ||
2236 | if (!IS_ERR(ifp)) { | ||
2237 | spin_lock_bh(&ifp->lock); | ||
2238 | ifp->flags &= ~IFA_F_TENTATIVE; | ||
2239 | spin_unlock_bh(&ifp->lock); | ||
2240 | ipv6_ifa_notify(RTM_NEWADDR, ifp); | ||
2241 | in6_ifa_put(ifp); | ||
2242 | } | ||
2243 | } | ||
2244 | |||
2230 | #if defined(CONFIG_IPV6_SIT) || defined(CONFIG_IPV6_SIT_MODULE) | 2245 | #if defined(CONFIG_IPV6_SIT) || defined(CONFIG_IPV6_SIT_MODULE) |
2231 | static void sit_add_v4_addrs(struct inet6_dev *idev) | 2246 | static void sit_add_v4_addrs(struct inet6_dev *idev) |
2232 | { | 2247 | { |
2233 | struct inet6_ifaddr * ifp; | ||
2234 | struct in6_addr addr; | 2248 | struct in6_addr addr; |
2235 | struct net_device *dev; | 2249 | struct net_device *dev; |
2236 | struct net *net = dev_net(idev->dev); | 2250 | struct net *net = dev_net(idev->dev); |
@@ -2249,14 +2263,7 @@ static void sit_add_v4_addrs(struct inet6_dev *idev) | |||
2249 | } | 2263 | } |
2250 | 2264 | ||
2251 | if (addr.s6_addr32[3]) { | 2265 | if (addr.s6_addr32[3]) { |
2252 | ifp = ipv6_add_addr(idev, &addr, 128, scope, IFA_F_PERMANENT); | 2266 | add_addr(idev, &addr, 128, scope); |
2253 | if (!IS_ERR(ifp)) { | ||
2254 | spin_lock_bh(&ifp->lock); | ||
2255 | ifp->flags &= ~IFA_F_TENTATIVE; | ||
2256 | spin_unlock_bh(&ifp->lock); | ||
2257 | ipv6_ifa_notify(RTM_NEWADDR, ifp); | ||
2258 | in6_ifa_put(ifp); | ||
2259 | } | ||
2260 | return; | 2267 | return; |
2261 | } | 2268 | } |
2262 | 2269 | ||
@@ -2284,15 +2291,7 @@ static void sit_add_v4_addrs(struct inet6_dev *idev) | |||
2284 | else | 2291 | else |
2285 | plen = 96; | 2292 | plen = 96; |
2286 | 2293 | ||
2287 | ifp = ipv6_add_addr(idev, &addr, plen, flag, | 2294 | add_addr(idev, &addr, plen, flag); |
2288 | IFA_F_PERMANENT); | ||
2289 | if (!IS_ERR(ifp)) { | ||
2290 | spin_lock_bh(&ifp->lock); | ||
2291 | ifp->flags &= ~IFA_F_TENTATIVE; | ||
2292 | spin_unlock_bh(&ifp->lock); | ||
2293 | ipv6_ifa_notify(RTM_NEWADDR, ifp); | ||
2294 | in6_ifa_put(ifp); | ||
2295 | } | ||
2296 | } | 2295 | } |
2297 | } | 2296 | } |
2298 | } | 2297 | } |
@@ -2302,7 +2301,6 @@ static void sit_add_v4_addrs(struct inet6_dev *idev) | |||
2302 | static void init_loopback(struct net_device *dev) | 2301 | static void init_loopback(struct net_device *dev) |
2303 | { | 2302 | { |
2304 | struct inet6_dev *idev; | 2303 | struct inet6_dev *idev; |
2305 | struct inet6_ifaddr * ifp; | ||
2306 | 2304 | ||
2307 | /* ::1 */ | 2305 | /* ::1 */ |
2308 | 2306 | ||
@@ -2313,14 +2311,7 @@ static void init_loopback(struct net_device *dev) | |||
2313 | return; | 2311 | return; |
2314 | } | 2312 | } |
2315 | 2313 | ||
2316 | ifp = ipv6_add_addr(idev, &in6addr_loopback, 128, IFA_HOST, IFA_F_PERMANENT); | 2314 | add_addr(idev, &in6addr_loopback, 128, IFA_HOST); |
2317 | if (!IS_ERR(ifp)) { | ||
2318 | spin_lock_bh(&ifp->lock); | ||
2319 | ifp->flags &= ~IFA_F_TENTATIVE; | ||
2320 | spin_unlock_bh(&ifp->lock); | ||
2321 | ipv6_ifa_notify(RTM_NEWADDR, ifp); | ||
2322 | in6_ifa_put(ifp); | ||
2323 | } | ||
2324 | } | 2315 | } |
2325 | 2316 | ||
2326 | static void addrconf_add_linklocal(struct inet6_dev *idev, struct in6_addr *addr) | 2317 | static void addrconf_add_linklocal(struct inet6_dev *idev, struct in6_addr *addr) |
@@ -3647,7 +3638,8 @@ static void inet6_ifa_notify(int event, struct inet6_ifaddr *ifa) | |||
3647 | kfree_skb(skb); | 3638 | kfree_skb(skb); |
3648 | goto errout; | 3639 | goto errout; |
3649 | } | 3640 | } |
3650 | err = rtnl_notify(skb, net, 0, RTNLGRP_IPV6_IFADDR, NULL, GFP_ATOMIC); | 3641 | rtnl_notify(skb, net, 0, RTNLGRP_IPV6_IFADDR, NULL, GFP_ATOMIC); |
3642 | return; | ||
3651 | errout: | 3643 | errout: |
3652 | if (err < 0) | 3644 | if (err < 0) |
3653 | rtnl_set_sk_err(net, RTNLGRP_IPV6_IFADDR, err); | 3645 | rtnl_set_sk_err(net, RTNLGRP_IPV6_IFADDR, err); |
@@ -3858,7 +3850,8 @@ void inet6_ifinfo_notify(int event, struct inet6_dev *idev) | |||
3858 | kfree_skb(skb); | 3850 | kfree_skb(skb); |
3859 | goto errout; | 3851 | goto errout; |
3860 | } | 3852 | } |
3861 | err = rtnl_notify(skb, net, 0, RTNLGRP_IPV6_IFADDR, NULL, GFP_ATOMIC); | 3853 | rtnl_notify(skb, net, 0, RTNLGRP_IPV6_IFADDR, NULL, GFP_ATOMIC); |
3854 | return; | ||
3862 | errout: | 3855 | errout: |
3863 | if (err < 0) | 3856 | if (err < 0) |
3864 | rtnl_set_sk_err(net, RTNLGRP_IPV6_IFADDR, err); | 3857 | rtnl_set_sk_err(net, RTNLGRP_IPV6_IFADDR, err); |
@@ -3928,7 +3921,8 @@ static void inet6_prefix_notify(int event, struct inet6_dev *idev, | |||
3928 | kfree_skb(skb); | 3921 | kfree_skb(skb); |
3929 | goto errout; | 3922 | goto errout; |
3930 | } | 3923 | } |
3931 | err = rtnl_notify(skb, net, 0, RTNLGRP_IPV6_PREFIX, NULL, GFP_ATOMIC); | 3924 | rtnl_notify(skb, net, 0, RTNLGRP_IPV6_PREFIX, NULL, GFP_ATOMIC); |
3925 | return; | ||
3932 | errout: | 3926 | errout: |
3933 | if (err < 0) | 3927 | if (err < 0) |
3934 | rtnl_set_sk_err(net, RTNLGRP_IPV6_PREFIX, err); | 3928 | rtnl_set_sk_err(net, RTNLGRP_IPV6_PREFIX, err); |
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index 9c8309ed35cf..fbf533cc9dce 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c | |||
@@ -803,24 +803,34 @@ static struct sk_buff **ipv6_gro_receive(struct sk_buff **head, | |||
803 | int proto; | 803 | int proto; |
804 | __wsum csum; | 804 | __wsum csum; |
805 | 805 | ||
806 | if (unlikely(!pskb_may_pull(skb, sizeof(*iph)))) | 806 | iph = skb_gro_header(skb, sizeof(*iph)); |
807 | if (unlikely(!iph)) | ||
807 | goto out; | 808 | goto out; |
808 | 809 | ||
809 | iph = ipv6_hdr(skb); | 810 | skb_gro_pull(skb, sizeof(*iph)); |
810 | __skb_pull(skb, sizeof(*iph)); | 811 | skb_set_transport_header(skb, skb_gro_offset(skb)); |
811 | 812 | ||
812 | flush += ntohs(iph->payload_len) != skb->len; | 813 | flush += ntohs(iph->payload_len) != skb_gro_len(skb); |
813 | 814 | ||
814 | rcu_read_lock(); | 815 | rcu_read_lock(); |
815 | proto = ipv6_gso_pull_exthdrs(skb, iph->nexthdr); | 816 | proto = iph->nexthdr; |
816 | iph = ipv6_hdr(skb); | ||
817 | IPV6_GRO_CB(skb)->proto = proto; | ||
818 | ops = rcu_dereference(inet6_protos[proto]); | 817 | ops = rcu_dereference(inet6_protos[proto]); |
819 | if (!ops || !ops->gro_receive) | 818 | if (!ops || !ops->gro_receive) { |
820 | goto out_unlock; | 819 | __pskb_pull(skb, skb_gro_offset(skb)); |
820 | proto = ipv6_gso_pull_exthdrs(skb, proto); | ||
821 | skb_gro_pull(skb, -skb_transport_offset(skb)); | ||
822 | skb_reset_transport_header(skb); | ||
823 | __skb_push(skb, skb_gro_offset(skb)); | ||
824 | |||
825 | if (!ops || !ops->gro_receive) | ||
826 | goto out_unlock; | ||
827 | |||
828 | iph = ipv6_hdr(skb); | ||
829 | } | ||
830 | |||
831 | IPV6_GRO_CB(skb)->proto = proto; | ||
821 | 832 | ||
822 | flush--; | 833 | flush--; |
823 | skb_reset_transport_header(skb); | ||
824 | nlen = skb_network_header_len(skb); | 834 | nlen = skb_network_header_len(skb); |
825 | 835 | ||
826 | for (p = *head; p; p = p->next) { | 836 | for (p = *head; p; p = p->next) { |
@@ -883,8 +893,8 @@ out_unlock: | |||
883 | return err; | 893 | return err; |
884 | } | 894 | } |
885 | 895 | ||
886 | static struct packet_type ipv6_packet_type = { | 896 | static struct packet_type ipv6_packet_type __read_mostly = { |
887 | .type = __constant_htons(ETH_P_IPV6), | 897 | .type = cpu_to_be16(ETH_P_IPV6), |
888 | .func = ipv6_rcv, | 898 | .func = ipv6_rcv, |
889 | .gso_send_check = ipv6_gso_send_check, | 899 | .gso_send_check = ipv6_gso_send_check, |
890 | .gso_segment = ipv6_gso_segment, | 900 | .gso_segment = ipv6_gso_segment, |
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c index 40f324655e24..d31df0f4bc9a 100644 --- a/net/ipv6/ipv6_sockglue.c +++ b/net/ipv6/ipv6_sockglue.c | |||
@@ -218,8 +218,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname, | |||
218 | if (opt) | 218 | if (opt) |
219 | sock_kfree_s(sk, opt, opt->tot_len); | 219 | sock_kfree_s(sk, opt, opt->tot_len); |
220 | pktopt = xchg(&np->pktoptions, NULL); | 220 | pktopt = xchg(&np->pktoptions, NULL); |
221 | if (pktopt) | 221 | kfree_skb(pktopt); |
222 | kfree_skb(pktopt); | ||
223 | 222 | ||
224 | sk->sk_destruct = inet_sock_destruct; | 223 | sk->sk_destruct = inet_sock_destruct; |
225 | /* | 224 | /* |
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index 3e2970841bd8..9f061d1adbc2 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
@@ -1095,11 +1095,7 @@ static void ndisc_ra_useropt(struct sk_buff *ra, struct nd_opt_hdr *opt) | |||
1095 | &ipv6_hdr(ra)->saddr); | 1095 | &ipv6_hdr(ra)->saddr); |
1096 | nlmsg_end(skb, nlh); | 1096 | nlmsg_end(skb, nlh); |
1097 | 1097 | ||
1098 | err = rtnl_notify(skb, net, 0, RTNLGRP_ND_USEROPT, NULL, | 1098 | rtnl_notify(skb, net, 0, RTNLGRP_ND_USEROPT, NULL, GFP_ATOMIC); |
1099 | GFP_ATOMIC); | ||
1100 | if (err < 0) | ||
1101 | goto errout; | ||
1102 | |||
1103 | return; | 1099 | return; |
1104 | 1100 | ||
1105 | nla_put_failure: | 1101 | nla_put_failure: |
@@ -1538,13 +1534,10 @@ void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh, | |||
1538 | if (rt->rt6i_flags & RTF_GATEWAY) { | 1534 | if (rt->rt6i_flags & RTF_GATEWAY) { |
1539 | ND_PRINTK2(KERN_WARNING | 1535 | ND_PRINTK2(KERN_WARNING |
1540 | "ICMPv6 Redirect: destination is not a neighbour.\n"); | 1536 | "ICMPv6 Redirect: destination is not a neighbour.\n"); |
1541 | dst_release(dst); | 1537 | goto release; |
1542 | return; | ||
1543 | } | ||
1544 | if (!xrlim_allow(dst, 1*HZ)) { | ||
1545 | dst_release(dst); | ||
1546 | return; | ||
1547 | } | 1538 | } |
1539 | if (!xrlim_allow(dst, 1*HZ)) | ||
1540 | goto release; | ||
1548 | 1541 | ||
1549 | if (dev->addr_len) { | 1542 | if (dev->addr_len) { |
1550 | read_lock_bh(&neigh->lock); | 1543 | read_lock_bh(&neigh->lock); |
@@ -1570,8 +1563,7 @@ void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh, | |||
1570 | ND_PRINTK0(KERN_ERR | 1563 | ND_PRINTK0(KERN_ERR |
1571 | "ICMPv6 Redirect: %s() failed to allocate an skb.\n", | 1564 | "ICMPv6 Redirect: %s() failed to allocate an skb.\n", |
1572 | __func__); | 1565 | __func__); |
1573 | dst_release(dst); | 1566 | goto release; |
1574 | return; | ||
1575 | } | 1567 | } |
1576 | 1568 | ||
1577 | skb_reserve(buff, LL_RESERVED_SPACE(dev)); | 1569 | skb_reserve(buff, LL_RESERVED_SPACE(dev)); |
@@ -1631,6 +1623,10 @@ void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh, | |||
1631 | 1623 | ||
1632 | if (likely(idev != NULL)) | 1624 | if (likely(idev != NULL)) |
1633 | in6_dev_put(idev); | 1625 | in6_dev_put(idev); |
1626 | return; | ||
1627 | |||
1628 | release: | ||
1629 | dst_release(dst); | ||
1634 | } | 1630 | } |
1635 | 1631 | ||
1636 | static void pndisc_redo(struct sk_buff *skb) | 1632 | static void pndisc_redo(struct sk_buff *skb) |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 9c574235c905..1394ddb6e35c 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -98,7 +98,7 @@ static struct rt6_info *rt6_get_route_info(struct net *net, | |||
98 | 98 | ||
99 | static struct dst_ops ip6_dst_ops_template = { | 99 | static struct dst_ops ip6_dst_ops_template = { |
100 | .family = AF_INET6, | 100 | .family = AF_INET6, |
101 | .protocol = __constant_htons(ETH_P_IPV6), | 101 | .protocol = cpu_to_be16(ETH_P_IPV6), |
102 | .gc = ip6_dst_gc, | 102 | .gc = ip6_dst_gc, |
103 | .gc_thresh = 1024, | 103 | .gc_thresh = 1024, |
104 | .check = ip6_dst_check, | 104 | .check = ip6_dst_check, |
@@ -117,7 +117,7 @@ static void ip6_rt_blackhole_update_pmtu(struct dst_entry *dst, u32 mtu) | |||
117 | 117 | ||
118 | static struct dst_ops ip6_dst_blackhole_ops = { | 118 | static struct dst_ops ip6_dst_blackhole_ops = { |
119 | .family = AF_INET6, | 119 | .family = AF_INET6, |
120 | .protocol = __constant_htons(ETH_P_IPV6), | 120 | .protocol = cpu_to_be16(ETH_P_IPV6), |
121 | .destroy = ip6_dst_destroy, | 121 | .destroy = ip6_dst_destroy, |
122 | .check = ip6_dst_check, | 122 | .check = ip6_dst_check, |
123 | .update_pmtu = ip6_rt_blackhole_update_pmtu, | 123 | .update_pmtu = ip6_rt_blackhole_update_pmtu, |
@@ -2400,8 +2400,9 @@ void inet6_rt_notify(int event, struct rt6_info *rt, struct nl_info *info) | |||
2400 | kfree_skb(skb); | 2400 | kfree_skb(skb); |
2401 | goto errout; | 2401 | goto errout; |
2402 | } | 2402 | } |
2403 | err = rtnl_notify(skb, net, info->pid, RTNLGRP_IPV6_ROUTE, | 2403 | rtnl_notify(skb, net, info->pid, RTNLGRP_IPV6_ROUTE, |
2404 | info->nlh, gfp_any()); | 2404 | info->nlh, gfp_any()); |
2405 | return; | ||
2405 | errout: | 2406 | errout: |
2406 | if (err < 0) | 2407 | if (err < 0) |
2407 | rtnl_set_sk_err(net, RTNLGRP_IPV6_ROUTE, err); | 2408 | rtnl_set_sk_err(net, RTNLGRP_IPV6_ROUTE, err); |
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index d3467e563f02..26915effb3bc 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c | |||
@@ -454,7 +454,7 @@ static int ipip6_err(struct sk_buff *skb, u32 info) | |||
454 | if (t->parms.iph.ttl == 0 && type == ICMP_TIME_EXCEEDED) | 454 | if (t->parms.iph.ttl == 0 && type == ICMP_TIME_EXCEEDED) |
455 | goto out; | 455 | goto out; |
456 | 456 | ||
457 | if (jiffies - t->err_time < IPTUNNEL_ERR_TIMEO) | 457 | if (time_before(jiffies, t->err_time + IPTUNNEL_ERR_TIMEO)) |
458 | t->err_count++; | 458 | t->err_count++; |
459 | else | 459 | else |
460 | t->err_count = 1; | 460 | t->err_count = 1; |
@@ -658,7 +658,8 @@ static int ipip6_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
658 | } | 658 | } |
659 | 659 | ||
660 | if (tunnel->err_count > 0) { | 660 | if (tunnel->err_count > 0) { |
661 | if (jiffies - tunnel->err_time < IPTUNNEL_ERR_TIMEO) { | 661 | if (time_before(jiffies, |
662 | tunnel->err_time + IPTUNNEL_ERR_TIMEO)) { | ||
662 | tunnel->err_count--; | 663 | tunnel->err_count--; |
663 | dst_link_failure(skb); | 664 | dst_link_failure(skb); |
664 | } else | 665 | } else |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index e5b85d45bee8..4b5aa1854260 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -533,8 +533,7 @@ static inline void syn_flood_warning(struct sk_buff *skb) | |||
533 | 533 | ||
534 | static void tcp_v6_reqsk_destructor(struct request_sock *req) | 534 | static void tcp_v6_reqsk_destructor(struct request_sock *req) |
535 | { | 535 | { |
536 | if (inet6_rsk(req)->pktopts) | 536 | kfree_skb(inet6_rsk(req)->pktopts); |
537 | kfree_skb(inet6_rsk(req)->pktopts); | ||
538 | } | 537 | } |
539 | 538 | ||
540 | #ifdef CONFIG_TCP_MD5SIG | 539 | #ifdef CONFIG_TCP_MD5SIG |
@@ -948,7 +947,7 @@ struct sk_buff **tcp6_gro_receive(struct sk_buff **head, struct sk_buff *skb) | |||
948 | 947 | ||
949 | switch (skb->ip_summed) { | 948 | switch (skb->ip_summed) { |
950 | case CHECKSUM_COMPLETE: | 949 | case CHECKSUM_COMPLETE: |
951 | if (!tcp_v6_check(skb->len, &iph->saddr, &iph->daddr, | 950 | if (!tcp_v6_check(skb_gro_len(skb), &iph->saddr, &iph->daddr, |
952 | skb->csum)) { | 951 | skb->csum)) { |
953 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 952 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
954 | break; | 953 | break; |
@@ -1611,8 +1610,7 @@ ipv6_pktoptions: | |||
1611 | } | 1610 | } |
1612 | } | 1611 | } |
1613 | 1612 | ||
1614 | if (opt_skb) | 1613 | kfree_skb(opt_skb); |
1615 | kfree_skb(opt_skb); | ||
1616 | return 0; | 1614 | return 0; |
1617 | } | 1615 | } |
1618 | 1616 | ||
diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c index 97ab068e8ccc..b4b16a43f277 100644 --- a/net/ipv6/xfrm6_policy.c +++ b/net/ipv6/xfrm6_policy.c | |||
@@ -272,7 +272,7 @@ static void xfrm6_dst_ifdown(struct dst_entry *dst, struct net_device *dev, | |||
272 | 272 | ||
273 | static struct dst_ops xfrm6_dst_ops = { | 273 | static struct dst_ops xfrm6_dst_ops = { |
274 | .family = AF_INET6, | 274 | .family = AF_INET6, |
275 | .protocol = __constant_htons(ETH_P_IPV6), | 275 | .protocol = cpu_to_be16(ETH_P_IPV6), |
276 | .gc = xfrm6_garbage_collect, | 276 | .gc = xfrm6_garbage_collect, |
277 | .update_pmtu = xfrm6_update_pmtu, | 277 | .update_pmtu = xfrm6_update_pmtu, |
278 | .destroy = xfrm6_dst_destroy, | 278 | .destroy = xfrm6_dst_destroy, |
diff --git a/net/ipv6/xfrm6_state.c b/net/ipv6/xfrm6_state.c index 0e685b05496e..f417b77fa0e1 100644 --- a/net/ipv6/xfrm6_state.c +++ b/net/ipv6/xfrm6_state.c | |||
@@ -69,7 +69,7 @@ __xfrm6_sort(void **dst, void **src, int n, int (*cmp)(void *p), int maxclass) | |||
69 | 69 | ||
70 | for (i = 0; i < n; i++) { | 70 | for (i = 0; i < n; i++) { |
71 | dst[count[class[i] - 1]++] = src[i]; | 71 | dst[count[class[i] - 1]++] = src[i]; |
72 | src[i] = 0; | 72 | src[i] = NULL; |
73 | } | 73 | } |
74 | 74 | ||
75 | return 0; | 75 | return 0; |