diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/dsa/slave.c | 1 | ||||
| -rw-r--r-- | net/ipv4/ip_forward.c | 3 | ||||
| -rw-r--r-- | net/ipv4/ping.c | 5 | ||||
| -rw-r--r-- | net/ipv4/route.c | 9 | ||||
| -rw-r--r-- | net/ipv4/udp_diag.c | 4 | ||||
| -rw-r--r-- | net/ipv6/ip6_fib.c | 45 | ||||
| -rw-r--r-- | net/ipv6/route.c | 6 | ||||
| -rw-r--r-- | net/ipv6/xfrm6_policy.c | 10 | ||||
| -rw-r--r-- | net/llc/sysctl_net_llc.c | 8 | ||||
| -rw-r--r-- | net/mac80211/pm.c | 29 | ||||
| -rw-r--r-- | net/mac80211/rx.c | 2 | ||||
| -rw-r--r-- | net/sched/cls_bpf.c | 15 | ||||
| -rw-r--r-- | net/sctp/associola.c | 1 | ||||
| -rw-r--r-- | net/socket.c | 3 | ||||
| -rw-r--r-- | net/wireless/nl80211.c | 9 | ||||
| -rw-r--r-- | net/wireless/util.c | 6 |
16 files changed, 97 insertions, 59 deletions
diff --git a/net/dsa/slave.c b/net/dsa/slave.c index 515569ffde8a..589aafd01fc5 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c | |||
| @@ -46,6 +46,7 @@ void dsa_slave_mii_bus_init(struct dsa_switch *ds) | |||
| 46 | snprintf(ds->slave_mii_bus->id, MII_BUS_ID_SIZE, "dsa-%d:%.2x", | 46 | snprintf(ds->slave_mii_bus->id, MII_BUS_ID_SIZE, "dsa-%d:%.2x", |
| 47 | ds->index, ds->pd->sw_addr); | 47 | ds->index, ds->pd->sw_addr); |
| 48 | ds->slave_mii_bus->parent = ds->master_dev; | 48 | ds->slave_mii_bus->parent = ds->master_dev; |
| 49 | ds->slave_mii_bus->phy_mask = ~ds->phys_mii_mask; | ||
| 49 | } | 50 | } |
| 50 | 51 | ||
| 51 | 52 | ||
diff --git a/net/ipv4/ip_forward.c b/net/ipv4/ip_forward.c index 3a83ce5efa80..787b3c294ce6 100644 --- a/net/ipv4/ip_forward.c +++ b/net/ipv4/ip_forward.c | |||
| @@ -129,7 +129,8 @@ int ip_forward(struct sk_buff *skb) | |||
| 129 | * We now generate an ICMP HOST REDIRECT giving the route | 129 | * We now generate an ICMP HOST REDIRECT giving the route |
| 130 | * we calculated. | 130 | * we calculated. |
| 131 | */ | 131 | */ |
| 132 | if (rt->rt_flags&RTCF_DOREDIRECT && !opt->srr && !skb_sec_path(skb)) | 132 | if (IPCB(skb)->flags & IPSKB_DOREDIRECT && !opt->srr && |
| 133 | !skb_sec_path(skb)) | ||
| 133 | ip_rt_send_redirect(skb); | 134 | ip_rt_send_redirect(skb); |
| 134 | 135 | ||
| 135 | skb->priority = rt_tos2priority(iph->tos); | 136 | skb->priority = rt_tos2priority(iph->tos); |
diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c index c0d82f78d364..2a3720fb5a5f 100644 --- a/net/ipv4/ping.c +++ b/net/ipv4/ping.c | |||
| @@ -966,8 +966,11 @@ bool ping_rcv(struct sk_buff *skb) | |||
| 966 | 966 | ||
| 967 | sk = ping_lookup(net, skb, ntohs(icmph->un.echo.id)); | 967 | sk = ping_lookup(net, skb, ntohs(icmph->un.echo.id)); |
| 968 | if (sk != NULL) { | 968 | if (sk != NULL) { |
| 969 | struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC); | ||
| 970 | |||
| 969 | pr_debug("rcv on socket %p\n", sk); | 971 | pr_debug("rcv on socket %p\n", sk); |
| 970 | ping_queue_rcv_skb(sk, skb_get(skb)); | 972 | if (skb2) |
| 973 | ping_queue_rcv_skb(sk, skb2); | ||
| 971 | sock_put(sk); | 974 | sock_put(sk); |
| 972 | return true; | 975 | return true; |
| 973 | } | 976 | } |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 6a2155b02602..d58dd0ec3e53 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
| @@ -1554,11 +1554,10 @@ static int __mkroute_input(struct sk_buff *skb, | |||
| 1554 | 1554 | ||
| 1555 | do_cache = res->fi && !itag; | 1555 | do_cache = res->fi && !itag; |
| 1556 | if (out_dev == in_dev && err && IN_DEV_TX_REDIRECTS(out_dev) && | 1556 | if (out_dev == in_dev && err && IN_DEV_TX_REDIRECTS(out_dev) && |
| 1557 | skb->protocol == htons(ETH_P_IP) && | ||
| 1557 | (IN_DEV_SHARED_MEDIA(out_dev) || | 1558 | (IN_DEV_SHARED_MEDIA(out_dev) || |
| 1558 | inet_addr_onlink(out_dev, saddr, FIB_RES_GW(*res)))) { | 1559 | inet_addr_onlink(out_dev, saddr, FIB_RES_GW(*res)))) |
| 1559 | flags |= RTCF_DOREDIRECT; | 1560 | IPCB(skb)->flags |= IPSKB_DOREDIRECT; |
| 1560 | do_cache = false; | ||
| 1561 | } | ||
| 1562 | 1561 | ||
| 1563 | if (skb->protocol != htons(ETH_P_IP)) { | 1562 | if (skb->protocol != htons(ETH_P_IP)) { |
| 1564 | /* Not IP (i.e. ARP). Do not create route, if it is | 1563 | /* Not IP (i.e. ARP). Do not create route, if it is |
| @@ -2303,6 +2302,8 @@ static int rt_fill_info(struct net *net, __be32 dst, __be32 src, | |||
| 2303 | r->rtm_flags = (rt->rt_flags & ~0xFFFF) | RTM_F_CLONED; | 2302 | r->rtm_flags = (rt->rt_flags & ~0xFFFF) | RTM_F_CLONED; |
| 2304 | if (rt->rt_flags & RTCF_NOTIFY) | 2303 | if (rt->rt_flags & RTCF_NOTIFY) |
| 2305 | r->rtm_flags |= RTM_F_NOTIFY; | 2304 | r->rtm_flags |= RTM_F_NOTIFY; |
| 2305 | if (IPCB(skb)->flags & IPSKB_DOREDIRECT) | ||
| 2306 | r->rtm_flags |= RTCF_DOREDIRECT; | ||
| 2306 | 2307 | ||
| 2307 | if (nla_put_be32(skb, RTA_DST, dst)) | 2308 | if (nla_put_be32(skb, RTA_DST, dst)) |
| 2308 | goto nla_put_failure; | 2309 | goto nla_put_failure; |
diff --git a/net/ipv4/udp_diag.c b/net/ipv4/udp_diag.c index 7927db0a9279..4a000f1dd757 100644 --- a/net/ipv4/udp_diag.c +++ b/net/ipv4/udp_diag.c | |||
| @@ -99,11 +99,13 @@ static void udp_dump(struct udp_table *table, struct sk_buff *skb, struct netlin | |||
| 99 | s_slot = cb->args[0]; | 99 | s_slot = cb->args[0]; |
| 100 | num = s_num = cb->args[1]; | 100 | num = s_num = cb->args[1]; |
| 101 | 101 | ||
| 102 | for (slot = s_slot; slot <= table->mask; num = s_num = 0, slot++) { | 102 | for (slot = s_slot; slot <= table->mask; s_num = 0, slot++) { |
| 103 | struct sock *sk; | 103 | struct sock *sk; |
| 104 | struct hlist_nulls_node *node; | 104 | struct hlist_nulls_node *node; |
| 105 | struct udp_hslot *hslot = &table->hash[slot]; | 105 | struct udp_hslot *hslot = &table->hash[slot]; |
| 106 | 106 | ||
| 107 | num = 0; | ||
| 108 | |||
| 107 | if (hlist_nulls_empty(&hslot->head)) | 109 | if (hlist_nulls_empty(&hslot->head)) |
| 108 | continue; | 110 | continue; |
| 109 | 111 | ||
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c index b2d1838897c9..f1c6d5e98322 100644 --- a/net/ipv6/ip6_fib.c +++ b/net/ipv6/ip6_fib.c | |||
| @@ -659,6 +659,29 @@ static int fib6_commit_metrics(struct dst_entry *dst, | |||
| 659 | return 0; | 659 | return 0; |
| 660 | } | 660 | } |
| 661 | 661 | ||
| 662 | static void fib6_purge_rt(struct rt6_info *rt, struct fib6_node *fn, | ||
| 663 | struct net *net) | ||
| 664 | { | ||
| 665 | if (atomic_read(&rt->rt6i_ref) != 1) { | ||
| 666 | /* This route is used as dummy address holder in some split | ||
| 667 | * nodes. It is not leaked, but it still holds other resources, | ||
| 668 | * which must be released in time. So, scan ascendant nodes | ||
| 669 | * and replace dummy references to this route with references | ||
| 670 | * to still alive ones. | ||
| 671 | */ | ||
| 672 | while (fn) { | ||
| 673 | if (!(fn->fn_flags & RTN_RTINFO) && fn->leaf == rt) { | ||
| 674 | fn->leaf = fib6_find_prefix(net, fn); | ||
| 675 | atomic_inc(&fn->leaf->rt6i_ref); | ||
| 676 | rt6_release(rt); | ||
| 677 | } | ||
| 678 | fn = fn->parent; | ||
| 679 | } | ||
| 680 | /* No more references are possible at this point. */ | ||
| 681 | BUG_ON(atomic_read(&rt->rt6i_ref) != 1); | ||
| 682 | } | ||
| 683 | } | ||
| 684 | |||
| 662 | /* | 685 | /* |
| 663 | * Insert routing information in a node. | 686 | * Insert routing information in a node. |
| 664 | */ | 687 | */ |
| @@ -807,11 +830,12 @@ add: | |||
| 807 | rt->dst.rt6_next = iter->dst.rt6_next; | 830 | rt->dst.rt6_next = iter->dst.rt6_next; |
| 808 | atomic_inc(&rt->rt6i_ref); | 831 | atomic_inc(&rt->rt6i_ref); |
| 809 | inet6_rt_notify(RTM_NEWROUTE, rt, info); | 832 | inet6_rt_notify(RTM_NEWROUTE, rt, info); |
| 810 | rt6_release(iter); | ||
| 811 | if (!(fn->fn_flags & RTN_RTINFO)) { | 833 | if (!(fn->fn_flags & RTN_RTINFO)) { |
| 812 | info->nl_net->ipv6.rt6_stats->fib_route_nodes++; | 834 | info->nl_net->ipv6.rt6_stats->fib_route_nodes++; |
| 813 | fn->fn_flags |= RTN_RTINFO; | 835 | fn->fn_flags |= RTN_RTINFO; |
| 814 | } | 836 | } |
| 837 | fib6_purge_rt(iter, fn, info->nl_net); | ||
| 838 | rt6_release(iter); | ||
| 815 | } | 839 | } |
| 816 | 840 | ||
| 817 | return 0; | 841 | return 0; |
| @@ -1322,24 +1346,7 @@ static void fib6_del_route(struct fib6_node *fn, struct rt6_info **rtp, | |||
| 1322 | fn = fib6_repair_tree(net, fn); | 1346 | fn = fib6_repair_tree(net, fn); |
| 1323 | } | 1347 | } |
| 1324 | 1348 | ||
| 1325 | if (atomic_read(&rt->rt6i_ref) != 1) { | 1349 | fib6_purge_rt(rt, fn, net); |
| 1326 | /* This route is used as dummy address holder in some split | ||
| 1327 | * nodes. It is not leaked, but it still holds other resources, | ||
| 1328 | * which must be released in time. So, scan ascendant nodes | ||
| 1329 | * and replace dummy references to this route with references | ||
| 1330 | * to still alive ones. | ||
| 1331 | */ | ||
| 1332 | while (fn) { | ||
| 1333 | if (!(fn->fn_flags & RTN_RTINFO) && fn->leaf == rt) { | ||
| 1334 | fn->leaf = fib6_find_prefix(net, fn); | ||
| 1335 | atomic_inc(&fn->leaf->rt6i_ref); | ||
| 1336 | rt6_release(rt); | ||
| 1337 | } | ||
| 1338 | fn = fn->parent; | ||
| 1339 | } | ||
| 1340 | /* No more references are possible at this point. */ | ||
| 1341 | BUG_ON(atomic_read(&rt->rt6i_ref) != 1); | ||
| 1342 | } | ||
| 1343 | 1350 | ||
| 1344 | inet6_rt_notify(RTM_DELROUTE, rt, info); | 1351 | inet6_rt_notify(RTM_DELROUTE, rt, info); |
| 1345 | rt6_release(rt); | 1352 | rt6_release(rt); |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 166e33bed222..495965358d22 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -1242,12 +1242,16 @@ restart: | |||
| 1242 | rt = net->ipv6.ip6_null_entry; | 1242 | rt = net->ipv6.ip6_null_entry; |
| 1243 | else if (rt->dst.error) { | 1243 | else if (rt->dst.error) { |
| 1244 | rt = net->ipv6.ip6_null_entry; | 1244 | rt = net->ipv6.ip6_null_entry; |
| 1245 | } else if (rt == net->ipv6.ip6_null_entry) { | 1245 | goto out; |
| 1246 | } | ||
| 1247 | |||
| 1248 | if (rt == net->ipv6.ip6_null_entry) { | ||
| 1246 | fn = fib6_backtrack(fn, &fl6->saddr); | 1249 | fn = fib6_backtrack(fn, &fl6->saddr); |
| 1247 | if (fn) | 1250 | if (fn) |
| 1248 | goto restart; | 1251 | goto restart; |
| 1249 | } | 1252 | } |
| 1250 | 1253 | ||
| 1254 | out: | ||
| 1251 | dst_hold(&rt->dst); | 1255 | dst_hold(&rt->dst); |
| 1252 | 1256 | ||
| 1253 | read_unlock_bh(&table->tb6_lock); | 1257 | read_unlock_bh(&table->tb6_lock); |
diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c index 5f983644373a..48bf5a06847b 100644 --- a/net/ipv6/xfrm6_policy.c +++ b/net/ipv6/xfrm6_policy.c | |||
| @@ -130,12 +130,18 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl, int reverse) | |||
| 130 | { | 130 | { |
| 131 | struct flowi6 *fl6 = &fl->u.ip6; | 131 | struct flowi6 *fl6 = &fl->u.ip6; |
| 132 | int onlyproto = 0; | 132 | int onlyproto = 0; |
| 133 | u16 offset = skb_network_header_len(skb); | ||
| 134 | const struct ipv6hdr *hdr = ipv6_hdr(skb); | 133 | const struct ipv6hdr *hdr = ipv6_hdr(skb); |
| 134 | u16 offset = sizeof(*hdr); | ||
| 135 | struct ipv6_opt_hdr *exthdr; | 135 | struct ipv6_opt_hdr *exthdr; |
| 136 | const unsigned char *nh = skb_network_header(skb); | 136 | const unsigned char *nh = skb_network_header(skb); |
| 137 | u8 nexthdr = nh[IP6CB(skb)->nhoff]; | 137 | u16 nhoff = IP6CB(skb)->nhoff; |
| 138 | int oif = 0; | 138 | int oif = 0; |
| 139 | u8 nexthdr; | ||
| 140 | |||
| 141 | if (!nhoff) | ||
| 142 | nhoff = offsetof(struct ipv6hdr, nexthdr); | ||
| 143 | |||
| 144 | nexthdr = nh[nhoff]; | ||
| 139 | 145 | ||
| 140 | if (skb_dst(skb)) | 146 | if (skb_dst(skb)) |
| 141 | oif = skb_dst(skb)->dev->ifindex; | 147 | oif = skb_dst(skb)->dev->ifindex; |
diff --git a/net/llc/sysctl_net_llc.c b/net/llc/sysctl_net_llc.c index 612a5ddaf93b..799bafc2af39 100644 --- a/net/llc/sysctl_net_llc.c +++ b/net/llc/sysctl_net_llc.c | |||
| @@ -18,28 +18,28 @@ static struct ctl_table llc2_timeout_table[] = { | |||
| 18 | { | 18 | { |
| 19 | .procname = "ack", | 19 | .procname = "ack", |
| 20 | .data = &sysctl_llc2_ack_timeout, | 20 | .data = &sysctl_llc2_ack_timeout, |
| 21 | .maxlen = sizeof(long), | 21 | .maxlen = sizeof(sysctl_llc2_ack_timeout), |
| 22 | .mode = 0644, | 22 | .mode = 0644, |
| 23 | .proc_handler = proc_dointvec_jiffies, | 23 | .proc_handler = proc_dointvec_jiffies, |
| 24 | }, | 24 | }, |
| 25 | { | 25 | { |
| 26 | .procname = "busy", | 26 | .procname = "busy", |
| 27 | .data = &sysctl_llc2_busy_timeout, | 27 | .data = &sysctl_llc2_busy_timeout, |
| 28 | .maxlen = sizeof(long), | 28 | .maxlen = sizeof(sysctl_llc2_busy_timeout), |
| 29 | .mode = 0644, | 29 | .mode = 0644, |
| 30 | .proc_handler = proc_dointvec_jiffies, | 30 | .proc_handler = proc_dointvec_jiffies, |
| 31 | }, | 31 | }, |
| 32 | { | 32 | { |
| 33 | .procname = "p", | 33 | .procname = "p", |
| 34 | .data = &sysctl_llc2_p_timeout, | 34 | .data = &sysctl_llc2_p_timeout, |
| 35 | .maxlen = sizeof(long), | 35 | .maxlen = sizeof(sysctl_llc2_p_timeout), |
| 36 | .mode = 0644, | 36 | .mode = 0644, |
| 37 | .proc_handler = proc_dointvec_jiffies, | 37 | .proc_handler = proc_dointvec_jiffies, |
| 38 | }, | 38 | }, |
| 39 | { | 39 | { |
| 40 | .procname = "rej", | 40 | .procname = "rej", |
| 41 | .data = &sysctl_llc2_rej_timeout, | 41 | .data = &sysctl_llc2_rej_timeout, |
| 42 | .maxlen = sizeof(long), | 42 | .maxlen = sizeof(sysctl_llc2_rej_timeout), |
| 43 | .mode = 0644, | 43 | .mode = 0644, |
| 44 | .proc_handler = proc_dointvec_jiffies, | 44 | .proc_handler = proc_dointvec_jiffies, |
| 45 | }, | 45 | }, |
diff --git a/net/mac80211/pm.c b/net/mac80211/pm.c index 4c5192e0d66c..4a95fe3cffbc 100644 --- a/net/mac80211/pm.c +++ b/net/mac80211/pm.c | |||
| @@ -86,20 +86,6 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan) | |||
| 86 | } | 86 | } |
| 87 | } | 87 | } |
| 88 | 88 | ||
| 89 | /* tear down aggregation sessions and remove STAs */ | ||
| 90 | mutex_lock(&local->sta_mtx); | ||
| 91 | list_for_each_entry(sta, &local->sta_list, list) { | ||
| 92 | if (sta->uploaded) { | ||
| 93 | enum ieee80211_sta_state state; | ||
| 94 | |||
| 95 | state = sta->sta_state; | ||
| 96 | for (; state > IEEE80211_STA_NOTEXIST; state--) | ||
| 97 | WARN_ON(drv_sta_state(local, sta->sdata, sta, | ||
| 98 | state, state - 1)); | ||
| 99 | } | ||
| 100 | } | ||
| 101 | mutex_unlock(&local->sta_mtx); | ||
| 102 | |||
| 103 | /* remove all interfaces that were created in the driver */ | 89 | /* remove all interfaces that were created in the driver */ |
| 104 | list_for_each_entry(sdata, &local->interfaces, list) { | 90 | list_for_each_entry(sdata, &local->interfaces, list) { |
| 105 | if (!ieee80211_sdata_running(sdata)) | 91 | if (!ieee80211_sdata_running(sdata)) |
| @@ -111,6 +97,21 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan) | |||
| 111 | case NL80211_IFTYPE_STATION: | 97 | case NL80211_IFTYPE_STATION: |
| 112 | ieee80211_mgd_quiesce(sdata); | 98 | ieee80211_mgd_quiesce(sdata); |
| 113 | break; | 99 | break; |
| 100 | case NL80211_IFTYPE_WDS: | ||
| 101 | /* tear down aggregation sessions and remove STAs */ | ||
| 102 | mutex_lock(&local->sta_mtx); | ||
| 103 | sta = sdata->u.wds.sta; | ||
| 104 | if (sta && sta->uploaded) { | ||
| 105 | enum ieee80211_sta_state state; | ||
| 106 | |||
| 107 | state = sta->sta_state; | ||
| 108 | for (; state > IEEE80211_STA_NOTEXIST; state--) | ||
| 109 | WARN_ON(drv_sta_state(local, sta->sdata, | ||
| 110 | sta, state, | ||
| 111 | state - 1)); | ||
| 112 | } | ||
| 113 | mutex_unlock(&local->sta_mtx); | ||
| 114 | break; | ||
| 114 | default: | 115 | default: |
| 115 | break; | 116 | break; |
| 116 | } | 117 | } |
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 683b10f46505..d69ca513848e 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
| @@ -272,7 +272,7 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local, | |||
| 272 | else if (rate && rate->flags & IEEE80211_RATE_ERP_G) | 272 | else if (rate && rate->flags & IEEE80211_RATE_ERP_G) |
| 273 | channel_flags |= IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ; | 273 | channel_flags |= IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ; |
| 274 | else if (rate) | 274 | else if (rate) |
| 275 | channel_flags |= IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ; | 275 | channel_flags |= IEEE80211_CHAN_CCK | IEEE80211_CHAN_2GHZ; |
| 276 | else | 276 | else |
| 277 | channel_flags |= IEEE80211_CHAN_2GHZ; | 277 | channel_flags |= IEEE80211_CHAN_2GHZ; |
| 278 | put_unaligned_le16(channel_flags, pos); | 278 | put_unaligned_le16(channel_flags, pos); |
diff --git a/net/sched/cls_bpf.c b/net/sched/cls_bpf.c index 84c8219c3e1c..f59adf8a4cd7 100644 --- a/net/sched/cls_bpf.c +++ b/net/sched/cls_bpf.c | |||
| @@ -180,6 +180,11 @@ static int cls_bpf_modify_existing(struct net *net, struct tcf_proto *tp, | |||
| 180 | } | 180 | } |
| 181 | 181 | ||
| 182 | bpf_size = bpf_len * sizeof(*bpf_ops); | 182 | bpf_size = bpf_len * sizeof(*bpf_ops); |
| 183 | if (bpf_size != nla_len(tb[TCA_BPF_OPS])) { | ||
| 184 | ret = -EINVAL; | ||
| 185 | goto errout; | ||
| 186 | } | ||
| 187 | |||
| 183 | bpf_ops = kzalloc(bpf_size, GFP_KERNEL); | 188 | bpf_ops = kzalloc(bpf_size, GFP_KERNEL); |
| 184 | if (bpf_ops == NULL) { | 189 | if (bpf_ops == NULL) { |
| 185 | ret = -ENOMEM; | 190 | ret = -ENOMEM; |
| @@ -215,15 +220,21 @@ static u32 cls_bpf_grab_new_handle(struct tcf_proto *tp, | |||
| 215 | struct cls_bpf_head *head) | 220 | struct cls_bpf_head *head) |
| 216 | { | 221 | { |
| 217 | unsigned int i = 0x80000000; | 222 | unsigned int i = 0x80000000; |
| 223 | u32 handle; | ||
| 218 | 224 | ||
| 219 | do { | 225 | do { |
| 220 | if (++head->hgen == 0x7FFFFFFF) | 226 | if (++head->hgen == 0x7FFFFFFF) |
| 221 | head->hgen = 1; | 227 | head->hgen = 1; |
| 222 | } while (--i > 0 && cls_bpf_get(tp, head->hgen)); | 228 | } while (--i > 0 && cls_bpf_get(tp, head->hgen)); |
| 223 | if (i == 0) | 229 | |
| 230 | if (unlikely(i == 0)) { | ||
| 224 | pr_err("Insufficient number of handles\n"); | 231 | pr_err("Insufficient number of handles\n"); |
| 232 | handle = 0; | ||
| 233 | } else { | ||
| 234 | handle = head->hgen; | ||
| 235 | } | ||
| 225 | 236 | ||
| 226 | return i; | 237 | return handle; |
| 227 | } | 238 | } |
| 228 | 239 | ||
| 229 | static int cls_bpf_change(struct net *net, struct sk_buff *in_skb, | 240 | static int cls_bpf_change(struct net *net, struct sk_buff *in_skb, |
diff --git a/net/sctp/associola.c b/net/sctp/associola.c index f791edd64d6c..26d06dbcc1c8 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c | |||
| @@ -1182,7 +1182,6 @@ void sctp_assoc_update(struct sctp_association *asoc, | |||
| 1182 | asoc->peer.peer_hmacs = new->peer.peer_hmacs; | 1182 | asoc->peer.peer_hmacs = new->peer.peer_hmacs; |
| 1183 | new->peer.peer_hmacs = NULL; | 1183 | new->peer.peer_hmacs = NULL; |
| 1184 | 1184 | ||
| 1185 | sctp_auth_key_put(asoc->asoc_shared_key); | ||
| 1186 | sctp_auth_asoc_init_active_key(asoc, GFP_ATOMIC); | 1185 | sctp_auth_asoc_init_active_key(asoc, GFP_ATOMIC); |
| 1187 | } | 1186 | } |
| 1188 | 1187 | ||
diff --git a/net/socket.c b/net/socket.c index a2c33a4dc7ba..418795caa897 100644 --- a/net/socket.c +++ b/net/socket.c | |||
| @@ -869,9 +869,6 @@ static ssize_t sock_splice_read(struct file *file, loff_t *ppos, | |||
| 869 | static struct sock_iocb *alloc_sock_iocb(struct kiocb *iocb, | 869 | static struct sock_iocb *alloc_sock_iocb(struct kiocb *iocb, |
| 870 | struct sock_iocb *siocb) | 870 | struct sock_iocb *siocb) |
| 871 | { | 871 | { |
| 872 | if (!is_sync_kiocb(iocb)) | ||
| 873 | BUG(); | ||
| 874 | |||
| 875 | siocb->kiocb = iocb; | 872 | siocb->kiocb = iocb; |
| 876 | iocb->private = siocb; | 873 | iocb->private = siocb; |
| 877 | return siocb; | 874 | return siocb; |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 7ca4b5133123..8887c6e5fca8 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
| @@ -2854,6 +2854,9 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info) | |||
| 2854 | if (!rdev->ops->get_key) | 2854 | if (!rdev->ops->get_key) |
| 2855 | return -EOPNOTSUPP; | 2855 | return -EOPNOTSUPP; |
| 2856 | 2856 | ||
| 2857 | if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) | ||
| 2858 | return -ENOENT; | ||
| 2859 | |||
| 2857 | msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); | 2860 | msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); |
| 2858 | if (!msg) | 2861 | if (!msg) |
| 2859 | return -ENOMEM; | 2862 | return -ENOMEM; |
| @@ -2873,10 +2876,6 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info) | |||
| 2873 | nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr)) | 2876 | nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr)) |
| 2874 | goto nla_put_failure; | 2877 | goto nla_put_failure; |
| 2875 | 2878 | ||
| 2876 | if (pairwise && mac_addr && | ||
| 2877 | !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) | ||
| 2878 | return -ENOENT; | ||
| 2879 | |||
| 2880 | err = rdev_get_key(rdev, dev, key_idx, pairwise, mac_addr, &cookie, | 2879 | err = rdev_get_key(rdev, dev, key_idx, pairwise, mac_addr, &cookie, |
| 2881 | get_key_callback); | 2880 | get_key_callback); |
| 2882 | 2881 | ||
| @@ -3047,7 +3046,7 @@ static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info) | |||
| 3047 | wdev_lock(dev->ieee80211_ptr); | 3046 | wdev_lock(dev->ieee80211_ptr); |
| 3048 | err = nl80211_key_allowed(dev->ieee80211_ptr); | 3047 | err = nl80211_key_allowed(dev->ieee80211_ptr); |
| 3049 | 3048 | ||
| 3050 | if (key.type == NL80211_KEYTYPE_PAIRWISE && mac_addr && | 3049 | if (key.type == NL80211_KEYTYPE_GROUP && mac_addr && |
| 3051 | !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) | 3050 | !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) |
| 3052 | err = -ENOENT; | 3051 | err = -ENOENT; |
| 3053 | 3052 | ||
diff --git a/net/wireless/util.c b/net/wireless/util.c index d0ac795445b7..5488c3662f7d 100644 --- a/net/wireless/util.c +++ b/net/wireless/util.c | |||
| @@ -308,6 +308,12 @@ unsigned int __attribute_const__ ieee80211_hdrlen(__le16 fc) | |||
| 308 | goto out; | 308 | goto out; |
| 309 | } | 309 | } |
| 310 | 310 | ||
| 311 | if (ieee80211_is_mgmt(fc)) { | ||
| 312 | if (ieee80211_has_order(fc)) | ||
| 313 | hdrlen += IEEE80211_HT_CTL_LEN; | ||
| 314 | goto out; | ||
| 315 | } | ||
| 316 | |||
| 311 | if (ieee80211_is_ctl(fc)) { | 317 | if (ieee80211_is_ctl(fc)) { |
| 312 | /* | 318 | /* |
| 313 | * ACK and CTS are 10 bytes, all others 16. To see how | 319 | * ACK and CTS are 10 bytes, all others 16. To see how |
