diff options
Diffstat (limited to 'net')
30 files changed, 143 insertions, 81 deletions
diff --git a/net/atm/br2684.c b/net/atm/br2684.c index 2252c2085dac..52cfd0c3ea71 100644 --- a/net/atm/br2684.c +++ b/net/atm/br2684.c | |||
| @@ -242,8 +242,6 @@ static int br2684_xmit_vcc(struct sk_buff *skb, struct net_device *dev, | |||
| 242 | if (brdev->payload == p_bridged) { | 242 | if (brdev->payload == p_bridged) { |
| 243 | skb_push(skb, 2); | 243 | skb_push(skb, 2); |
| 244 | memset(skb->data, 0, 2); | 244 | memset(skb->data, 0, 2); |
| 245 | } else { /* p_routed */ | ||
| 246 | skb_pull(skb, ETH_HLEN); | ||
| 247 | } | 245 | } |
| 248 | } | 246 | } |
| 249 | skb_debug(skb); | 247 | skb_debug(skb); |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 2beda824636e..27002dffe7ed 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
| @@ -1369,8 +1369,21 @@ pull_pages: | |||
| 1369 | } | 1369 | } |
| 1370 | EXPORT_SYMBOL(__pskb_pull_tail); | 1370 | EXPORT_SYMBOL(__pskb_pull_tail); |
| 1371 | 1371 | ||
| 1372 | /* Copy some data bits from skb to kernel buffer. */ | 1372 | /** |
| 1373 | 1373 | * skb_copy_bits - copy bits from skb to kernel buffer | |
| 1374 | * @skb: source skb | ||
| 1375 | * @offset: offset in source | ||
| 1376 | * @to: destination buffer | ||
| 1377 | * @len: number of bytes to copy | ||
| 1378 | * | ||
| 1379 | * Copy the specified number of bytes from the source skb to the | ||
| 1380 | * destination buffer. | ||
| 1381 | * | ||
| 1382 | * CAUTION ! : | ||
| 1383 | * If its prototype is ever changed, | ||
| 1384 | * check arch/{*}/net/{*}.S files, | ||
| 1385 | * since it is called from BPF assembly code. | ||
| 1386 | */ | ||
| 1374 | int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len) | 1387 | int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len) |
| 1375 | { | 1388 | { |
| 1376 | int start = skb_headlen(skb); | 1389 | int start = skb_headlen(skb); |
diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c index f1d27f6c9351..283c0a26e03f 100644 --- a/net/ipv4/igmp.c +++ b/net/ipv4/igmp.c | |||
| @@ -1718,7 +1718,7 @@ static int ip_mc_add_src(struct in_device *in_dev, __be32 *pmca, int sfmode, | |||
| 1718 | 1718 | ||
| 1719 | pmc->sfcount[sfmode]--; | 1719 | pmc->sfcount[sfmode]--; |
| 1720 | for (j=0; j<i; j++) | 1720 | for (j=0; j<i; j++) |
| 1721 | (void) ip_mc_del1_src(pmc, sfmode, &psfsrc[i]); | 1721 | (void) ip_mc_del1_src(pmc, sfmode, &psfsrc[j]); |
| 1722 | } else if (isexclude != (pmc->sfcount[MCAST_EXCLUDE] != 0)) { | 1722 | } else if (isexclude != (pmc->sfcount[MCAST_EXCLUDE] != 0)) { |
| 1723 | #ifdef CONFIG_IP_MULTICAST | 1723 | #ifdef CONFIG_IP_MULTICAST |
| 1724 | struct ip_sf_list *psf; | 1724 | struct ip_sf_list *psf; |
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index ccaaa851ab42..77d3eded665a 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
| @@ -204,9 +204,15 @@ static inline int ip_finish_output2(struct sk_buff *skb) | |||
| 204 | skb = skb2; | 204 | skb = skb2; |
| 205 | } | 205 | } |
| 206 | 206 | ||
| 207 | rcu_read_lock(); | ||
| 207 | neigh = dst_get_neighbour(dst); | 208 | neigh = dst_get_neighbour(dst); |
| 208 | if (neigh) | 209 | if (neigh) { |
| 209 | return neigh_output(neigh, skb); | 210 | int res = neigh_output(neigh, skb); |
| 211 | |||
| 212 | rcu_read_unlock(); | ||
| 213 | return res; | ||
| 214 | } | ||
| 215 | rcu_read_unlock(); | ||
| 210 | 216 | ||
| 211 | if (net_ratelimit()) | 217 | if (net_ratelimit()) |
| 212 | printk(KERN_DEBUG "ip_finish_output2: No header cache and no neighbour!\n"); | 218 | printk(KERN_DEBUG "ip_finish_output2: No header cache and no neighbour!\n"); |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 1730689f560e..6afc4eb50591 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
| @@ -1628,16 +1628,18 @@ static int check_peer_redir(struct dst_entry *dst, struct inet_peer *peer) | |||
| 1628 | { | 1628 | { |
| 1629 | struct rtable *rt = (struct rtable *) dst; | 1629 | struct rtable *rt = (struct rtable *) dst; |
| 1630 | __be32 orig_gw = rt->rt_gateway; | 1630 | __be32 orig_gw = rt->rt_gateway; |
| 1631 | struct neighbour *n; | 1631 | struct neighbour *n, *old_n; |
| 1632 | 1632 | ||
| 1633 | dst_confirm(&rt->dst); | 1633 | dst_confirm(&rt->dst); |
| 1634 | 1634 | ||
| 1635 | neigh_release(dst_get_neighbour(&rt->dst)); | ||
| 1636 | dst_set_neighbour(&rt->dst, NULL); | ||
| 1637 | |||
| 1638 | rt->rt_gateway = peer->redirect_learned.a4; | 1635 | rt->rt_gateway = peer->redirect_learned.a4; |
| 1639 | rt_bind_neighbour(rt); | 1636 | |
| 1640 | n = dst_get_neighbour(&rt->dst); | 1637 | n = ipv4_neigh_lookup(&rt->dst, &rt->rt_gateway); |
| 1638 | if (IS_ERR(n)) | ||
| 1639 | return PTR_ERR(n); | ||
| 1640 | old_n = xchg(&rt->dst._neighbour, n); | ||
| 1641 | if (old_n) | ||
| 1642 | neigh_release(old_n); | ||
| 1641 | if (!n || !(n->nud_state & NUD_VALID)) { | 1643 | if (!n || !(n->nud_state & NUD_VALID)) { |
| 1642 | if (n) | 1644 | if (n) |
| 1643 | neigh_event_send(n, NULL); | 1645 | neigh_event_send(n, NULL); |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index a55500cc0b29..f012ebd87b43 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
| @@ -656,7 +656,7 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, int pfxlen, | |||
| 656 | * layer address of our nexhop router | 656 | * layer address of our nexhop router |
| 657 | */ | 657 | */ |
| 658 | 658 | ||
| 659 | if (dst_get_neighbour(&rt->dst) == NULL) | 659 | if (dst_get_neighbour_raw(&rt->dst) == NULL) |
| 660 | ifa->flags &= ~IFA_F_OPTIMISTIC; | 660 | ifa->flags &= ~IFA_F_OPTIMISTIC; |
| 661 | 661 | ||
| 662 | ifa->idev = idev; | 662 | ifa->idev = idev; |
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c index 16560336eb72..9ef1831746ef 100644 --- a/net/ipv6/datagram.c +++ b/net/ipv6/datagram.c | |||
| @@ -33,6 +33,11 @@ | |||
| 33 | #include <linux/errqueue.h> | 33 | #include <linux/errqueue.h> |
| 34 | #include <asm/uaccess.h> | 34 | #include <asm/uaccess.h> |
| 35 | 35 | ||
| 36 | static inline int ipv6_mapped_addr_any(const struct in6_addr *a) | ||
| 37 | { | ||
| 38 | return (ipv6_addr_v4mapped(a) && (a->s6_addr32[3] == 0)); | ||
| 39 | } | ||
| 40 | |||
| 36 | int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | 41 | int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) |
| 37 | { | 42 | { |
| 38 | struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr; | 43 | struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr; |
| @@ -102,10 +107,12 @@ ipv4_connected: | |||
| 102 | 107 | ||
| 103 | ipv6_addr_set_v4mapped(inet->inet_daddr, &np->daddr); | 108 | ipv6_addr_set_v4mapped(inet->inet_daddr, &np->daddr); |
| 104 | 109 | ||
| 105 | if (ipv6_addr_any(&np->saddr)) | 110 | if (ipv6_addr_any(&np->saddr) || |
| 111 | ipv6_mapped_addr_any(&np->saddr)) | ||
| 106 | ipv6_addr_set_v4mapped(inet->inet_saddr, &np->saddr); | 112 | ipv6_addr_set_v4mapped(inet->inet_saddr, &np->saddr); |
| 107 | 113 | ||
| 108 | if (ipv6_addr_any(&np->rcv_saddr)) { | 114 | if (ipv6_addr_any(&np->rcv_saddr) || |
| 115 | ipv6_mapped_addr_any(&np->rcv_saddr)) { | ||
| 109 | ipv6_addr_set_v4mapped(inet->inet_rcv_saddr, | 116 | ipv6_addr_set_v4mapped(inet->inet_rcv_saddr, |
| 110 | &np->rcv_saddr); | 117 | &np->rcv_saddr); |
| 111 | if (sk->sk_prot->rehash) | 118 | if (sk->sk_prot->rehash) |
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c index 54a4678955bf..320d91d20ad7 100644 --- a/net/ipv6/ip6_fib.c +++ b/net/ipv6/ip6_fib.c | |||
| @@ -1455,7 +1455,7 @@ static int fib6_age(struct rt6_info *rt, void *arg) | |||
| 1455 | RT6_TRACE("aging clone %p\n", rt); | 1455 | RT6_TRACE("aging clone %p\n", rt); |
| 1456 | return -1; | 1456 | return -1; |
| 1457 | } else if ((rt->rt6i_flags & RTF_GATEWAY) && | 1457 | } else if ((rt->rt6i_flags & RTF_GATEWAY) && |
| 1458 | (!(dst_get_neighbour(&rt->dst)->flags & NTF_ROUTER))) { | 1458 | (!(dst_get_neighbour_raw(&rt->dst)->flags & NTF_ROUTER))) { |
| 1459 | RT6_TRACE("purging route %p via non-router but gateway\n", | 1459 | RT6_TRACE("purging route %p via non-router but gateway\n", |
| 1460 | rt); | 1460 | rt); |
| 1461 | return -1; | 1461 | return -1; |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 32e5339db0c8..4c882cf4e8a1 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
| @@ -135,10 +135,15 @@ static int ip6_finish_output2(struct sk_buff *skb) | |||
| 135 | skb->len); | 135 | skb->len); |
| 136 | } | 136 | } |
| 137 | 137 | ||
| 138 | rcu_read_lock(); | ||
| 138 | neigh = dst_get_neighbour(dst); | 139 | neigh = dst_get_neighbour(dst); |
| 139 | if (neigh) | 140 | if (neigh) { |
| 140 | return neigh_output(neigh, skb); | 141 | int res = neigh_output(neigh, skb); |
| 141 | 142 | ||
| 143 | rcu_read_unlock(); | ||
| 144 | return res; | ||
| 145 | } | ||
| 146 | rcu_read_unlock(); | ||
| 142 | IP6_INC_STATS_BH(dev_net(dst->dev), | 147 | IP6_INC_STATS_BH(dev_net(dst->dev), |
| 143 | ip6_dst_idev(dst), IPSTATS_MIB_OUTNOROUTES); | 148 | ip6_dst_idev(dst), IPSTATS_MIB_OUTNOROUTES); |
| 144 | kfree_skb(skb); | 149 | kfree_skb(skb); |
| @@ -975,12 +980,14 @@ static int ip6_dst_lookup_tail(struct sock *sk, | |||
| 975 | * dst entry and replace it instead with the | 980 | * dst entry and replace it instead with the |
| 976 | * dst entry of the nexthop router | 981 | * dst entry of the nexthop router |
| 977 | */ | 982 | */ |
| 983 | rcu_read_lock(); | ||
| 978 | n = dst_get_neighbour(*dst); | 984 | n = dst_get_neighbour(*dst); |
| 979 | if (n && !(n->nud_state & NUD_VALID)) { | 985 | if (n && !(n->nud_state & NUD_VALID)) { |
| 980 | struct inet6_ifaddr *ifp; | 986 | struct inet6_ifaddr *ifp; |
| 981 | struct flowi6 fl_gw6; | 987 | struct flowi6 fl_gw6; |
| 982 | int redirect; | 988 | int redirect; |
| 983 | 989 | ||
| 990 | rcu_read_unlock(); | ||
| 984 | ifp = ipv6_get_ifaddr(net, &fl6->saddr, | 991 | ifp = ipv6_get_ifaddr(net, &fl6->saddr, |
| 985 | (*dst)->dev, 1); | 992 | (*dst)->dev, 1); |
| 986 | 993 | ||
| @@ -1000,6 +1007,8 @@ static int ip6_dst_lookup_tail(struct sock *sk, | |||
| 1000 | if ((err = (*dst)->error)) | 1007 | if ((err = (*dst)->error)) |
| 1001 | goto out_err_release; | 1008 | goto out_err_release; |
| 1002 | } | 1009 | } |
| 1010 | } else { | ||
| 1011 | rcu_read_unlock(); | ||
| 1003 | } | 1012 | } |
| 1004 | #endif | 1013 | #endif |
| 1005 | 1014 | ||
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index e8987da06667..9e69eb0ec6dd 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -364,7 +364,7 @@ out: | |||
| 364 | #ifdef CONFIG_IPV6_ROUTER_PREF | 364 | #ifdef CONFIG_IPV6_ROUTER_PREF |
| 365 | static void rt6_probe(struct rt6_info *rt) | 365 | static void rt6_probe(struct rt6_info *rt) |
| 366 | { | 366 | { |
| 367 | struct neighbour *neigh = rt ? dst_get_neighbour(&rt->dst) : NULL; | 367 | struct neighbour *neigh; |
| 368 | /* | 368 | /* |
| 369 | * Okay, this does not seem to be appropriate | 369 | * Okay, this does not seem to be appropriate |
| 370 | * for now, however, we need to check if it | 370 | * for now, however, we need to check if it |
| @@ -373,8 +373,10 @@ static void rt6_probe(struct rt6_info *rt) | |||
| 373 | * Router Reachability Probe MUST be rate-limited | 373 | * Router Reachability Probe MUST be rate-limited |
| 374 | * to no more than one per minute. | 374 | * to no more than one per minute. |
| 375 | */ | 375 | */ |
| 376 | rcu_read_lock(); | ||
| 377 | neigh = rt ? dst_get_neighbour(&rt->dst) : NULL; | ||
| 376 | if (!neigh || (neigh->nud_state & NUD_VALID)) | 378 | if (!neigh || (neigh->nud_state & NUD_VALID)) |
| 377 | return; | 379 | goto out; |
| 378 | read_lock_bh(&neigh->lock); | 380 | read_lock_bh(&neigh->lock); |
| 379 | if (!(neigh->nud_state & NUD_VALID) && | 381 | if (!(neigh->nud_state & NUD_VALID) && |
| 380 | time_after(jiffies, neigh->updated + rt->rt6i_idev->cnf.rtr_probe_interval)) { | 382 | time_after(jiffies, neigh->updated + rt->rt6i_idev->cnf.rtr_probe_interval)) { |
| @@ -387,8 +389,11 @@ static void rt6_probe(struct rt6_info *rt) | |||
| 387 | target = (struct in6_addr *)&neigh->primary_key; | 389 | target = (struct in6_addr *)&neigh->primary_key; |
| 388 | addrconf_addr_solict_mult(target, &mcaddr); | 390 | addrconf_addr_solict_mult(target, &mcaddr); |
| 389 | ndisc_send_ns(rt->rt6i_dev, NULL, target, &mcaddr, NULL); | 391 | ndisc_send_ns(rt->rt6i_dev, NULL, target, &mcaddr, NULL); |
| 390 | } else | 392 | } else { |
| 391 | read_unlock_bh(&neigh->lock); | 393 | read_unlock_bh(&neigh->lock); |
| 394 | } | ||
| 395 | out: | ||
| 396 | rcu_read_unlock(); | ||
| 392 | } | 397 | } |
| 393 | #else | 398 | #else |
| 394 | static inline void rt6_probe(struct rt6_info *rt) | 399 | static inline void rt6_probe(struct rt6_info *rt) |
| @@ -412,8 +417,11 @@ static inline int rt6_check_dev(struct rt6_info *rt, int oif) | |||
| 412 | 417 | ||
| 413 | static inline int rt6_check_neigh(struct rt6_info *rt) | 418 | static inline int rt6_check_neigh(struct rt6_info *rt) |
| 414 | { | 419 | { |
| 415 | struct neighbour *neigh = dst_get_neighbour(&rt->dst); | 420 | struct neighbour *neigh; |
| 416 | int m; | 421 | int m; |
| 422 | |||
| 423 | rcu_read_lock(); | ||
| 424 | neigh = dst_get_neighbour(&rt->dst); | ||
| 417 | if (rt->rt6i_flags & RTF_NONEXTHOP || | 425 | if (rt->rt6i_flags & RTF_NONEXTHOP || |
| 418 | !(rt->rt6i_flags & RTF_GATEWAY)) | 426 | !(rt->rt6i_flags & RTF_GATEWAY)) |
| 419 | m = 1; | 427 | m = 1; |
| @@ -430,6 +438,7 @@ static inline int rt6_check_neigh(struct rt6_info *rt) | |||
| 430 | read_unlock_bh(&neigh->lock); | 438 | read_unlock_bh(&neigh->lock); |
| 431 | } else | 439 | } else |
| 432 | m = 0; | 440 | m = 0; |
| 441 | rcu_read_unlock(); | ||
| 433 | return m; | 442 | return m; |
| 434 | } | 443 | } |
| 435 | 444 | ||
| @@ -769,7 +778,7 @@ static struct rt6_info *rt6_alloc_clone(struct rt6_info *ort, | |||
| 769 | rt->rt6i_dst.plen = 128; | 778 | rt->rt6i_dst.plen = 128; |
| 770 | rt->rt6i_flags |= RTF_CACHE; | 779 | rt->rt6i_flags |= RTF_CACHE; |
| 771 | rt->dst.flags |= DST_HOST; | 780 | rt->dst.flags |= DST_HOST; |
| 772 | dst_set_neighbour(&rt->dst, neigh_clone(dst_get_neighbour(&ort->dst))); | 781 | dst_set_neighbour(&rt->dst, neigh_clone(dst_get_neighbour_raw(&ort->dst))); |
| 773 | } | 782 | } |
| 774 | return rt; | 783 | return rt; |
| 775 | } | 784 | } |
| @@ -803,7 +812,7 @@ restart: | |||
| 803 | dst_hold(&rt->dst); | 812 | dst_hold(&rt->dst); |
| 804 | read_unlock_bh(&table->tb6_lock); | 813 | read_unlock_bh(&table->tb6_lock); |
| 805 | 814 | ||
| 806 | if (!dst_get_neighbour(&rt->dst) && !(rt->rt6i_flags & RTF_NONEXTHOP)) | 815 | if (!dst_get_neighbour_raw(&rt->dst) && !(rt->rt6i_flags & RTF_NONEXTHOP)) |
| 807 | nrt = rt6_alloc_cow(rt, &fl6->daddr, &fl6->saddr); | 816 | nrt = rt6_alloc_cow(rt, &fl6->daddr, &fl6->saddr); |
| 808 | else if (!(rt->dst.flags & DST_HOST)) | 817 | else if (!(rt->dst.flags & DST_HOST)) |
| 809 | nrt = rt6_alloc_clone(rt, &fl6->daddr); | 818 | nrt = rt6_alloc_clone(rt, &fl6->daddr); |
| @@ -1587,7 +1596,7 @@ void rt6_redirect(const struct in6_addr *dest, const struct in6_addr *src, | |||
| 1587 | dst_confirm(&rt->dst); | 1596 | dst_confirm(&rt->dst); |
| 1588 | 1597 | ||
| 1589 | /* Duplicate redirect: silently ignore. */ | 1598 | /* Duplicate redirect: silently ignore. */ |
| 1590 | if (neigh == dst_get_neighbour(&rt->dst)) | 1599 | if (neigh == dst_get_neighbour_raw(&rt->dst)) |
| 1591 | goto out; | 1600 | goto out; |
| 1592 | 1601 | ||
| 1593 | nrt = ip6_rt_copy(rt, dest); | 1602 | nrt = ip6_rt_copy(rt, dest); |
| @@ -1682,7 +1691,7 @@ again: | |||
| 1682 | 1. It is connected route. Action: COW | 1691 | 1. It is connected route. Action: COW |
| 1683 | 2. It is gatewayed route or NONEXTHOP route. Action: clone it. | 1692 | 2. It is gatewayed route or NONEXTHOP route. Action: clone it. |
| 1684 | */ | 1693 | */ |
| 1685 | if (!dst_get_neighbour(&rt->dst) && !(rt->rt6i_flags & RTF_NONEXTHOP)) | 1694 | if (!dst_get_neighbour_raw(&rt->dst) && !(rt->rt6i_flags & RTF_NONEXTHOP)) |
| 1686 | nrt = rt6_alloc_cow(rt, daddr, saddr); | 1695 | nrt = rt6_alloc_cow(rt, daddr, saddr); |
| 1687 | else | 1696 | else |
| 1688 | nrt = rt6_alloc_clone(rt, daddr); | 1697 | nrt = rt6_alloc_clone(rt, daddr); |
| @@ -2326,6 +2335,7 @@ static int rt6_fill_node(struct net *net, | |||
| 2326 | struct nlmsghdr *nlh; | 2335 | struct nlmsghdr *nlh; |
| 2327 | long expires; | 2336 | long expires; |
| 2328 | u32 table; | 2337 | u32 table; |
| 2338 | struct neighbour *n; | ||
| 2329 | 2339 | ||
| 2330 | if (prefix) { /* user wants prefix routes only */ | 2340 | if (prefix) { /* user wants prefix routes only */ |
| 2331 | if (!(rt->rt6i_flags & RTF_PREFIX_RT)) { | 2341 | if (!(rt->rt6i_flags & RTF_PREFIX_RT)) { |
| @@ -2414,8 +2424,11 @@ static int rt6_fill_node(struct net *net, | |||
| 2414 | if (rtnetlink_put_metrics(skb, dst_metrics_ptr(&rt->dst)) < 0) | 2424 | if (rtnetlink_put_metrics(skb, dst_metrics_ptr(&rt->dst)) < 0) |
| 2415 | goto nla_put_failure; | 2425 | goto nla_put_failure; |
| 2416 | 2426 | ||
| 2417 | if (dst_get_neighbour(&rt->dst)) | 2427 | rcu_read_lock(); |
| 2418 | NLA_PUT(skb, RTA_GATEWAY, 16, &dst_get_neighbour(&rt->dst)->primary_key); | 2428 | n = dst_get_neighbour(&rt->dst); |
| 2429 | if (n) | ||
| 2430 | NLA_PUT(skb, RTA_GATEWAY, 16, &n->primary_key); | ||
| 2431 | rcu_read_unlock(); | ||
| 2419 | 2432 | ||
| 2420 | if (rt->dst.dev) | 2433 | if (rt->dst.dev) |
| 2421 | NLA_PUT_U32(skb, RTA_OIF, rt->rt6i_dev->ifindex); | 2434 | NLA_PUT_U32(skb, RTA_OIF, rt->rt6i_dev->ifindex); |
| @@ -2608,12 +2621,14 @@ static int rt6_info_route(struct rt6_info *rt, void *p_arg) | |||
| 2608 | #else | 2621 | #else |
| 2609 | seq_puts(m, "00000000000000000000000000000000 00 "); | 2622 | seq_puts(m, "00000000000000000000000000000000 00 "); |
| 2610 | #endif | 2623 | #endif |
| 2624 | rcu_read_lock(); | ||
| 2611 | n = dst_get_neighbour(&rt->dst); | 2625 | n = dst_get_neighbour(&rt->dst); |
| 2612 | if (n) { | 2626 | if (n) { |
| 2613 | seq_printf(m, "%pi6", n->primary_key); | 2627 | seq_printf(m, "%pi6", n->primary_key); |
| 2614 | } else { | 2628 | } else { |
| 2615 | seq_puts(m, "00000000000000000000000000000000"); | 2629 | seq_puts(m, "00000000000000000000000000000000"); |
| 2616 | } | 2630 | } |
| 2631 | rcu_read_unlock(); | ||
| 2617 | seq_printf(m, " %08x %08x %08x %08x %8s\n", | 2632 | seq_printf(m, " %08x %08x %08x %08x %8s\n", |
| 2618 | rt->rt6i_metric, atomic_read(&rt->dst.__refcnt), | 2633 | rt->rt6i_metric, atomic_read(&rt->dst.__refcnt), |
| 2619 | rt->dst.__use, rt->rt6i_flags, | 2634 | rt->dst.__use, rt->rt6i_flags, |
diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c index be43fd805bd0..2b771dc708a3 100644 --- a/net/netfilter/ipvs/ip_vs_ctl.c +++ b/net/netfilter/ipvs/ip_vs_ctl.c | |||
| @@ -3771,6 +3771,7 @@ err_sock: | |||
| 3771 | void ip_vs_control_cleanup(void) | 3771 | void ip_vs_control_cleanup(void) |
| 3772 | { | 3772 | { |
| 3773 | EnterFunction(2); | 3773 | EnterFunction(2); |
| 3774 | unregister_netdevice_notifier(&ip_vs_dst_notifier); | ||
| 3774 | ip_vs_genl_unregister(); | 3775 | ip_vs_genl_unregister(); |
| 3775 | nf_unregister_sockopt(&ip_vs_sockopts); | 3776 | nf_unregister_sockopt(&ip_vs_sockopts); |
| 3776 | LeaveFunction(2); | 3777 | LeaveFunction(2); |
diff --git a/net/netlabel/Makefile b/net/netlabel/Makefile index ea750e9df65f..d2732fc952e2 100644 --- a/net/netlabel/Makefile +++ b/net/netlabel/Makefile | |||
| @@ -1,8 +1,6 @@ | |||
| 1 | # | 1 | # |
| 2 | # Makefile for the NetLabel subsystem. | 2 | # Makefile for the NetLabel subsystem. |
| 3 | # | 3 | # |
| 4 | # Feb 9, 2006, Paul Moore <paul.moore@hp.com> | ||
| 5 | # | ||
| 6 | 4 | ||
| 7 | # base objects | 5 | # base objects |
| 8 | obj-y := netlabel_user.o netlabel_kapi.o | 6 | obj-y := netlabel_user.o netlabel_kapi.o |
diff --git a/net/netlabel/netlabel_addrlist.c b/net/netlabel/netlabel_addrlist.c index c0519139679e..96b749dacc34 100644 --- a/net/netlabel/netlabel_addrlist.c +++ b/net/netlabel/netlabel_addrlist.c | |||
| @@ -6,7 +6,7 @@ | |||
| 6 | * system manages static and dynamic label mappings for network protocols such | 6 | * system manages static and dynamic label mappings for network protocols such |
| 7 | * as CIPSO and RIPSO. | 7 | * as CIPSO and RIPSO. |
| 8 | * | 8 | * |
| 9 | * Author: Paul Moore <paul.moore@hp.com> | 9 | * Author: Paul Moore <paul@paul-moore.com> |
| 10 | * | 10 | * |
| 11 | */ | 11 | */ |
| 12 | 12 | ||
diff --git a/net/netlabel/netlabel_addrlist.h b/net/netlabel/netlabel_addrlist.h index 2b9644e19de0..fdbc1d2c7352 100644 --- a/net/netlabel/netlabel_addrlist.h +++ b/net/netlabel/netlabel_addrlist.h | |||
| @@ -6,7 +6,7 @@ | |||
| 6 | * system manages static and dynamic label mappings for network protocols such | 6 | * system manages static and dynamic label mappings for network protocols such |
| 7 | * as CIPSO and RIPSO. | 7 | * as CIPSO and RIPSO. |
| 8 | * | 8 | * |
| 9 | * Author: Paul Moore <paul.moore@hp.com> | 9 | * Author: Paul Moore <paul@paul-moore.com> |
| 10 | * | 10 | * |
| 11 | */ | 11 | */ |
| 12 | 12 | ||
diff --git a/net/netlabel/netlabel_cipso_v4.c b/net/netlabel/netlabel_cipso_v4.c index dd53a36d89af..6bf878335d94 100644 --- a/net/netlabel/netlabel_cipso_v4.c +++ b/net/netlabel/netlabel_cipso_v4.c | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | * NetLabel system manages static and dynamic label mappings for network | 5 | * NetLabel system manages static and dynamic label mappings for network |
| 6 | * protocols such as CIPSO and RIPSO. | 6 | * protocols such as CIPSO and RIPSO. |
| 7 | * | 7 | * |
| 8 | * Author: Paul Moore <paul.moore@hp.com> | 8 | * Author: Paul Moore <paul@paul-moore.com> |
| 9 | * | 9 | * |
| 10 | */ | 10 | */ |
| 11 | 11 | ||
diff --git a/net/netlabel/netlabel_cipso_v4.h b/net/netlabel/netlabel_cipso_v4.h index af7f3355103e..d24d774bfd62 100644 --- a/net/netlabel/netlabel_cipso_v4.h +++ b/net/netlabel/netlabel_cipso_v4.h | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | * NetLabel system manages static and dynamic label mappings for network | 5 | * NetLabel system manages static and dynamic label mappings for network |
| 6 | * protocols such as CIPSO and RIPSO. | 6 | * protocols such as CIPSO and RIPSO. |
| 7 | * | 7 | * |
| 8 | * Author: Paul Moore <paul.moore@hp.com> | 8 | * Author: Paul Moore <paul@paul-moore.com> |
| 9 | * | 9 | * |
| 10 | */ | 10 | */ |
| 11 | 11 | ||
diff --git a/net/netlabel/netlabel_domainhash.c b/net/netlabel/netlabel_domainhash.c index 2aa975e5452d..7d8083cde34f 100644 --- a/net/netlabel/netlabel_domainhash.c +++ b/net/netlabel/netlabel_domainhash.c | |||
| @@ -6,7 +6,7 @@ | |||
| 6 | * system manages static and dynamic label mappings for network protocols such | 6 | * system manages static and dynamic label mappings for network protocols such |
| 7 | * as CIPSO and RIPSO. | 7 | * as CIPSO and RIPSO. |
| 8 | * | 8 | * |
| 9 | * Author: Paul Moore <paul.moore@hp.com> | 9 | * Author: Paul Moore <paul@paul-moore.com> |
| 10 | * | 10 | * |
| 11 | */ | 11 | */ |
| 12 | 12 | ||
diff --git a/net/netlabel/netlabel_domainhash.h b/net/netlabel/netlabel_domainhash.h index 0261dda3f2d2..bfcc0f7024c5 100644 --- a/net/netlabel/netlabel_domainhash.h +++ b/net/netlabel/netlabel_domainhash.h | |||
| @@ -6,7 +6,7 @@ | |||
| 6 | * system manages static and dynamic label mappings for network protocols such | 6 | * system manages static and dynamic label mappings for network protocols such |
| 7 | * as CIPSO and RIPSO. | 7 | * as CIPSO and RIPSO. |
| 8 | * | 8 | * |
| 9 | * Author: Paul Moore <paul.moore@hp.com> | 9 | * Author: Paul Moore <paul@paul-moore.com> |
| 10 | * | 10 | * |
| 11 | */ | 11 | */ |
| 12 | 12 | ||
diff --git a/net/netlabel/netlabel_kapi.c b/net/netlabel/netlabel_kapi.c index b528dd928d3c..58107d060846 100644 --- a/net/netlabel/netlabel_kapi.c +++ b/net/netlabel/netlabel_kapi.c | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | * system manages static and dynamic label mappings for network protocols such | 5 | * system manages static and dynamic label mappings for network protocols such |
| 6 | * as CIPSO and RIPSO. | 6 | * as CIPSO and RIPSO. |
| 7 | * | 7 | * |
| 8 | * Author: Paul Moore <paul.moore@hp.com> | 8 | * Author: Paul Moore <paul@paul-moore.com> |
| 9 | * | 9 | * |
| 10 | */ | 10 | */ |
| 11 | 11 | ||
diff --git a/net/netlabel/netlabel_mgmt.c b/net/netlabel/netlabel_mgmt.c index dff8a0809245..bfa555869775 100644 --- a/net/netlabel/netlabel_mgmt.c +++ b/net/netlabel/netlabel_mgmt.c | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | * NetLabel system manages static and dynamic label mappings for network | 5 | * NetLabel system manages static and dynamic label mappings for network |
| 6 | * protocols such as CIPSO and RIPSO. | 6 | * protocols such as CIPSO and RIPSO. |
| 7 | * | 7 | * |
| 8 | * Author: Paul Moore <paul.moore@hp.com> | 8 | * Author: Paul Moore <paul@paul-moore.com> |
| 9 | * | 9 | * |
| 10 | */ | 10 | */ |
| 11 | 11 | ||
diff --git a/net/netlabel/netlabel_mgmt.h b/net/netlabel/netlabel_mgmt.h index 8db37f4c10f7..5a9f31ce5799 100644 --- a/net/netlabel/netlabel_mgmt.h +++ b/net/netlabel/netlabel_mgmt.h | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | * NetLabel system manages static and dynamic label mappings for network | 5 | * NetLabel system manages static and dynamic label mappings for network |
| 6 | * protocols such as CIPSO and RIPSO. | 6 | * protocols such as CIPSO and RIPSO. |
| 7 | * | 7 | * |
| 8 | * Author: Paul Moore <paul.moore@hp.com> | 8 | * Author: Paul Moore <paul@paul-moore.com> |
| 9 | * | 9 | * |
| 10 | */ | 10 | */ |
| 11 | 11 | ||
diff --git a/net/netlabel/netlabel_unlabeled.c b/net/netlabel/netlabel_unlabeled.c index f1ecf848e3ac..e6e823656f9d 100644 --- a/net/netlabel/netlabel_unlabeled.c +++ b/net/netlabel/netlabel_unlabeled.c | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | * NetLabel system. The NetLabel system manages static and dynamic label | 5 | * NetLabel system. The NetLabel system manages static and dynamic label |
| 6 | * mappings for network protocols such as CIPSO and RIPSO. | 6 | * mappings for network protocols such as CIPSO and RIPSO. |
| 7 | * | 7 | * |
| 8 | * Author: Paul Moore <paul.moore@hp.com> | 8 | * Author: Paul Moore <paul@paul-moore.com> |
| 9 | * | 9 | * |
| 10 | */ | 10 | */ |
| 11 | 11 | ||
diff --git a/net/netlabel/netlabel_unlabeled.h b/net/netlabel/netlabel_unlabeled.h index 0bc8dc3f9e3c..700af49022a0 100644 --- a/net/netlabel/netlabel_unlabeled.h +++ b/net/netlabel/netlabel_unlabeled.h | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | * NetLabel system. The NetLabel system manages static and dynamic label | 5 | * NetLabel system. The NetLabel system manages static and dynamic label |
| 6 | * mappings for network protocols such as CIPSO and RIPSO. | 6 | * mappings for network protocols such as CIPSO and RIPSO. |
| 7 | * | 7 | * |
| 8 | * Author: Paul Moore <paul.moore@hp.com> | 8 | * Author: Paul Moore <paul@paul-moore.com> |
| 9 | * | 9 | * |
| 10 | */ | 10 | */ |
| 11 | 11 | ||
diff --git a/net/netlabel/netlabel_user.c b/net/netlabel/netlabel_user.c index a3fd75ac3fa5..9fae63f10298 100644 --- a/net/netlabel/netlabel_user.c +++ b/net/netlabel/netlabel_user.c | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | * NetLabel system manages static and dynamic label mappings for network | 5 | * NetLabel system manages static and dynamic label mappings for network |
| 6 | * protocols such as CIPSO and RIPSO. | 6 | * protocols such as CIPSO and RIPSO. |
| 7 | * | 7 | * |
| 8 | * Author: Paul Moore <paul.moore@hp.com> | 8 | * Author: Paul Moore <paul@paul-moore.com> |
| 9 | * | 9 | * |
| 10 | */ | 10 | */ |
| 11 | 11 | ||
diff --git a/net/netlabel/netlabel_user.h b/net/netlabel/netlabel_user.h index f4fc4c9ad567..81969785e279 100644 --- a/net/netlabel/netlabel_user.h +++ b/net/netlabel/netlabel_user.h | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | * NetLabel system manages static and dynamic label mappings for network | 5 | * NetLabel system manages static and dynamic label mappings for network |
| 6 | * protocols such as CIPSO and RIPSO. | 6 | * protocols such as CIPSO and RIPSO. |
| 7 | * | 7 | * |
| 8 | * Author: Paul Moore <paul.moore@hp.com> | 8 | * Author: Paul Moore <paul@paul-moore.com> |
| 9 | * | 9 | * |
| 10 | */ | 10 | */ |
| 11 | 11 | ||
diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c index 4536ee64383e..4f5510e2bd6f 100644 --- a/net/sched/sch_sfq.c +++ b/net/sched/sch_sfq.c | |||
| @@ -410,7 +410,12 @@ sfq_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
| 410 | /* Return Congestion Notification only if we dropped a packet | 410 | /* Return Congestion Notification only if we dropped a packet |
| 411 | * from this flow. | 411 | * from this flow. |
| 412 | */ | 412 | */ |
| 413 | return (qlen != slot->qlen) ? NET_XMIT_CN : NET_XMIT_SUCCESS; | 413 | if (qlen != slot->qlen) |
| 414 | return NET_XMIT_CN; | ||
| 415 | |||
| 416 | /* As we dropped a packet, better let upper stack know this */ | ||
| 417 | qdisc_tree_decrease_qlen(sch, 1); | ||
| 418 | return NET_XMIT_SUCCESS; | ||
| 414 | } | 419 | } |
| 415 | 420 | ||
| 416 | static struct sk_buff * | 421 | static struct sk_buff * |
diff --git a/net/socket.c b/net/socket.c index b1cbbcd92558..24a77400b65e 100644 --- a/net/socket.c +++ b/net/socket.c | |||
| @@ -1871,8 +1871,14 @@ SYSCALL_DEFINE2(shutdown, int, fd, int, how) | |||
| 1871 | #define COMPAT_NAMELEN(msg) COMPAT_MSG(msg, msg_namelen) | 1871 | #define COMPAT_NAMELEN(msg) COMPAT_MSG(msg, msg_namelen) |
| 1872 | #define COMPAT_FLAGS(msg) COMPAT_MSG(msg, msg_flags) | 1872 | #define COMPAT_FLAGS(msg) COMPAT_MSG(msg, msg_flags) |
| 1873 | 1873 | ||
| 1874 | struct used_address { | ||
| 1875 | struct sockaddr_storage name; | ||
| 1876 | unsigned int name_len; | ||
| 1877 | }; | ||
| 1878 | |||
| 1874 | static int __sys_sendmsg(struct socket *sock, struct msghdr __user *msg, | 1879 | static int __sys_sendmsg(struct socket *sock, struct msghdr __user *msg, |
| 1875 | struct msghdr *msg_sys, unsigned flags, int nosec) | 1880 | struct msghdr *msg_sys, unsigned flags, |
| 1881 | struct used_address *used_address) | ||
| 1876 | { | 1882 | { |
| 1877 | struct compat_msghdr __user *msg_compat = | 1883 | struct compat_msghdr __user *msg_compat = |
| 1878 | (struct compat_msghdr __user *)msg; | 1884 | (struct compat_msghdr __user *)msg; |
| @@ -1953,8 +1959,28 @@ static int __sys_sendmsg(struct socket *sock, struct msghdr __user *msg, | |||
| 1953 | 1959 | ||
| 1954 | if (sock->file->f_flags & O_NONBLOCK) | 1960 | if (sock->file->f_flags & O_NONBLOCK) |
| 1955 | msg_sys->msg_flags |= MSG_DONTWAIT; | 1961 | msg_sys->msg_flags |= MSG_DONTWAIT; |
| 1956 | err = (nosec ? sock_sendmsg_nosec : sock_sendmsg)(sock, msg_sys, | 1962 | /* |
| 1957 | total_len); | 1963 | * If this is sendmmsg() and current destination address is same as |
| 1964 | * previously succeeded address, omit asking LSM's decision. | ||
| 1965 | * used_address->name_len is initialized to UINT_MAX so that the first | ||
| 1966 | * destination address never matches. | ||
| 1967 | */ | ||
| 1968 | if (used_address && used_address->name_len == msg_sys->msg_namelen && | ||
| 1969 | !memcmp(&used_address->name, msg->msg_name, | ||
| 1970 | used_address->name_len)) { | ||
| 1971 | err = sock_sendmsg_nosec(sock, msg_sys, total_len); | ||
| 1972 | goto out_freectl; | ||
| 1973 | } | ||
| 1974 | err = sock_sendmsg(sock, msg_sys, total_len); | ||
| 1975 | /* | ||
| 1976 | * If this is sendmmsg() and sending to current destination address was | ||
| 1977 | * successful, remember it. | ||
| 1978 | */ | ||
| 1979 | if (used_address && err >= 0) { | ||
| 1980 | used_address->name_len = msg_sys->msg_namelen; | ||
| 1981 | memcpy(&used_address->name, msg->msg_name, | ||
| 1982 | used_address->name_len); | ||
| 1983 | } | ||
| 1958 | 1984 | ||
| 1959 | out_freectl: | 1985 | out_freectl: |
| 1960 | if (ctl_buf != ctl) | 1986 | if (ctl_buf != ctl) |
| @@ -1979,7 +2005,7 @@ SYSCALL_DEFINE3(sendmsg, int, fd, struct msghdr __user *, msg, unsigned, flags) | |||
| 1979 | if (!sock) | 2005 | if (!sock) |
| 1980 | goto out; | 2006 | goto out; |
| 1981 | 2007 | ||
| 1982 | err = __sys_sendmsg(sock, msg, &msg_sys, flags, 0); | 2008 | err = __sys_sendmsg(sock, msg, &msg_sys, flags, NULL); |
| 1983 | 2009 | ||
| 1984 | fput_light(sock->file, fput_needed); | 2010 | fput_light(sock->file, fput_needed); |
| 1985 | out: | 2011 | out: |
| @@ -1998,6 +2024,10 @@ int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, | |||
| 1998 | struct mmsghdr __user *entry; | 2024 | struct mmsghdr __user *entry; |
| 1999 | struct compat_mmsghdr __user *compat_entry; | 2025 | struct compat_mmsghdr __user *compat_entry; |
| 2000 | struct msghdr msg_sys; | 2026 | struct msghdr msg_sys; |
| 2027 | struct used_address used_address; | ||
| 2028 | |||
| 2029 | if (vlen > UIO_MAXIOV) | ||
| 2030 | vlen = UIO_MAXIOV; | ||
| 2001 | 2031 | ||
| 2002 | datagrams = 0; | 2032 | datagrams = 0; |
| 2003 | 2033 | ||
| @@ -2005,27 +2035,22 @@ int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, | |||
| 2005 | if (!sock) | 2035 | if (!sock) |
| 2006 | return err; | 2036 | return err; |
| 2007 | 2037 | ||
| 2008 | err = sock_error(sock->sk); | 2038 | used_address.name_len = UINT_MAX; |
| 2009 | if (err) | ||
| 2010 | goto out_put; | ||
| 2011 | |||
| 2012 | entry = mmsg; | 2039 | entry = mmsg; |
| 2013 | compat_entry = (struct compat_mmsghdr __user *)mmsg; | 2040 | compat_entry = (struct compat_mmsghdr __user *)mmsg; |
| 2041 | err = 0; | ||
| 2014 | 2042 | ||
| 2015 | while (datagrams < vlen) { | 2043 | while (datagrams < vlen) { |
| 2016 | /* | ||
| 2017 | * No need to ask LSM for more than the first datagram. | ||
| 2018 | */ | ||
| 2019 | if (MSG_CMSG_COMPAT & flags) { | 2044 | if (MSG_CMSG_COMPAT & flags) { |
| 2020 | err = __sys_sendmsg(sock, (struct msghdr __user *)compat_entry, | 2045 | err = __sys_sendmsg(sock, (struct msghdr __user *)compat_entry, |
| 2021 | &msg_sys, flags, datagrams); | 2046 | &msg_sys, flags, &used_address); |
| 2022 | if (err < 0) | 2047 | if (err < 0) |
| 2023 | break; | 2048 | break; |
| 2024 | err = __put_user(err, &compat_entry->msg_len); | 2049 | err = __put_user(err, &compat_entry->msg_len); |
| 2025 | ++compat_entry; | 2050 | ++compat_entry; |
| 2026 | } else { | 2051 | } else { |
| 2027 | err = __sys_sendmsg(sock, (struct msghdr __user *)entry, | 2052 | err = __sys_sendmsg(sock, (struct msghdr __user *)entry, |
| 2028 | &msg_sys, flags, datagrams); | 2053 | &msg_sys, flags, &used_address); |
| 2029 | if (err < 0) | 2054 | if (err < 0) |
| 2030 | break; | 2055 | break; |
| 2031 | err = put_user(err, &entry->msg_len); | 2056 | err = put_user(err, &entry->msg_len); |
| @@ -2037,29 +2062,11 @@ int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, | |||
| 2037 | ++datagrams; | 2062 | ++datagrams; |
| 2038 | } | 2063 | } |
| 2039 | 2064 | ||
| 2040 | out_put: | ||
| 2041 | fput_light(sock->file, fput_needed); | 2065 | fput_light(sock->file, fput_needed); |
| 2042 | 2066 | ||
| 2043 | if (err == 0) | 2067 | /* We only return an error if no datagrams were able to be sent */ |
| 2044 | return datagrams; | 2068 | if (datagrams != 0) |
| 2045 | |||
| 2046 | if (datagrams != 0) { | ||
| 2047 | /* | ||
| 2048 | * We may send less entries than requested (vlen) if the | ||
| 2049 | * sock is non blocking... | ||
| 2050 | */ | ||
| 2051 | if (err != -EAGAIN) { | ||
| 2052 | /* | ||
| 2053 | * ... or if sendmsg returns an error after we | ||
| 2054 | * send some datagrams, where we record the | ||
| 2055 | * error to return on the next call or if the | ||
| 2056 | * app asks about it using getsockopt(SO_ERROR). | ||
| 2057 | */ | ||
| 2058 | sock->sk->sk_err = -err; | ||
| 2059 | } | ||
| 2060 | |||
| 2061 | return datagrams; | 2069 | return datagrams; |
| 2062 | } | ||
| 2063 | 2070 | ||
| 2064 | return err; | 2071 | return err; |
| 2065 | } | 2072 | } |
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index 9b6a4d1ea8f8..f4385e45a5fc 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c | |||
| @@ -187,6 +187,7 @@ EXPORT_SYMBOL_GPL(xprt_load_transport); | |||
| 187 | /** | 187 | /** |
| 188 | * xprt_reserve_xprt - serialize write access to transports | 188 | * xprt_reserve_xprt - serialize write access to transports |
| 189 | * @task: task that is requesting access to the transport | 189 | * @task: task that is requesting access to the transport |
| 190 | * @xprt: pointer to the target transport | ||
| 190 | * | 191 | * |
| 191 | * This prevents mixing the payload of separate requests, and prevents | 192 | * This prevents mixing the payload of separate requests, and prevents |
| 192 | * transport connects from colliding with writes. No congestion control | 193 | * transport connects from colliding with writes. No congestion control |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 28d2aa109bee..e83e7fee3bc0 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
| @@ -3464,7 +3464,7 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info) | |||
| 3464 | tmp) { | 3464 | tmp) { |
| 3465 | enum ieee80211_band band = nla_type(attr); | 3465 | enum ieee80211_band band = nla_type(attr); |
| 3466 | 3466 | ||
| 3467 | if (band < 0 || band > IEEE80211_NUM_BANDS) { | 3467 | if (band < 0 || band >= IEEE80211_NUM_BANDS) { |
| 3468 | err = -EINVAL; | 3468 | err = -EINVAL; |
| 3469 | goto out_free; | 3469 | goto out_free; |
| 3470 | } | 3470 | } |
diff --git a/net/xfrm/xfrm_algo.c b/net/xfrm/xfrm_algo.c index 58064d9e565d..791ab2e77f3f 100644 --- a/net/xfrm/xfrm_algo.c +++ b/net/xfrm/xfrm_algo.c | |||
| @@ -462,8 +462,8 @@ static struct xfrm_algo_desc ealg_list[] = { | |||
| 462 | .desc = { | 462 | .desc = { |
| 463 | .sadb_alg_id = SADB_X_EALG_AESCTR, | 463 | .sadb_alg_id = SADB_X_EALG_AESCTR, |
| 464 | .sadb_alg_ivlen = 8, | 464 | .sadb_alg_ivlen = 8, |
| 465 | .sadb_alg_minbits = 128, | 465 | .sadb_alg_minbits = 160, |
| 466 | .sadb_alg_maxbits = 256 | 466 | .sadb_alg_maxbits = 288 |
| 467 | } | 467 | } |
| 468 | }, | 468 | }, |
| 469 | }; | 469 | }; |
