diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/9p/protocol.c | 22 | ||||
-rw-r--r-- | net/bridge/br_forward.c | 7 | ||||
-rw-r--r-- | net/core/dev.c | 4 | ||||
-rw-r--r-- | net/core/neighbour.c | 14 | ||||
-rw-r--r-- | net/core/sock.c | 2 | ||||
-rw-r--r-- | net/ipv4/tcp_output.c | 12 | ||||
-rw-r--r-- | net/ipv4/udp.c | 13 | ||||
-rw-r--r-- | net/ipv6/ip6_flowlabel.c | 8 | ||||
-rw-r--r-- | net/ipv6/ip6_output.c | 67 | ||||
-rw-r--r-- | net/ipv6/ip6_tunnel.c | 2 | ||||
-rw-r--r-- | net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c | 25 | ||||
-rw-r--r-- | net/mac80211/tx.c | 2 | ||||
-rw-r--r-- | net/netfilter/nf_conntrack_netlink.c | 15 | ||||
-rw-r--r-- | net/netfilter/xt_sctp.c | 2 | ||||
-rw-r--r-- | net/packet/af_packet.c | 8 | ||||
-rw-r--r-- | net/phonet/pep-gprs.c | 1 | ||||
-rw-r--r-- | net/phonet/pep.c | 2 | ||||
-rw-r--r-- | net/rxrpc/af_rxrpc.c | 5 | ||||
-rw-r--r-- | net/sunrpc/Kconfig | 2 | ||||
-rw-r--r-- | net/wimax/id-table.c | 9 |
20 files changed, 156 insertions, 66 deletions
diff --git a/net/9p/protocol.c b/net/9p/protocol.c index dcd7666824ba..fc70147c771e 100644 --- a/net/9p/protocol.c +++ b/net/9p/protocol.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/errno.h> | 29 | #include <linux/errno.h> |
30 | #include <linux/uaccess.h> | 30 | #include <linux/uaccess.h> |
31 | #include <linux/sched.h> | 31 | #include <linux/sched.h> |
32 | #include <linux/types.h> | ||
32 | #include <net/9p/9p.h> | 33 | #include <net/9p/9p.h> |
33 | #include <net/9p/client.h> | 34 | #include <net/9p/client.h> |
34 | #include "protocol.h" | 35 | #include "protocol.h" |
@@ -160,29 +161,32 @@ p9pdu_vreadf(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap) | |||
160 | break; | 161 | break; |
161 | case 'w':{ | 162 | case 'w':{ |
162 | int16_t *val = va_arg(ap, int16_t *); | 163 | int16_t *val = va_arg(ap, int16_t *); |
163 | if (pdu_read(pdu, val, sizeof(*val))) { | 164 | __le16 le_val; |
165 | if (pdu_read(pdu, &le_val, sizeof(le_val))) { | ||
164 | errcode = -EFAULT; | 166 | errcode = -EFAULT; |
165 | break; | 167 | break; |
166 | } | 168 | } |
167 | *val = cpu_to_le16(*val); | 169 | *val = le16_to_cpu(le_val); |
168 | } | 170 | } |
169 | break; | 171 | break; |
170 | case 'd':{ | 172 | case 'd':{ |
171 | int32_t *val = va_arg(ap, int32_t *); | 173 | int32_t *val = va_arg(ap, int32_t *); |
172 | if (pdu_read(pdu, val, sizeof(*val))) { | 174 | __le32 le_val; |
175 | if (pdu_read(pdu, &le_val, sizeof(le_val))) { | ||
173 | errcode = -EFAULT; | 176 | errcode = -EFAULT; |
174 | break; | 177 | break; |
175 | } | 178 | } |
176 | *val = cpu_to_le32(*val); | 179 | *val = le32_to_cpu(le_val); |
177 | } | 180 | } |
178 | break; | 181 | break; |
179 | case 'q':{ | 182 | case 'q':{ |
180 | int64_t *val = va_arg(ap, int64_t *); | 183 | int64_t *val = va_arg(ap, int64_t *); |
181 | if (pdu_read(pdu, val, sizeof(*val))) { | 184 | __le64 le_val; |
185 | if (pdu_read(pdu, &le_val, sizeof(le_val))) { | ||
182 | errcode = -EFAULT; | 186 | errcode = -EFAULT; |
183 | break; | 187 | break; |
184 | } | 188 | } |
185 | *val = cpu_to_le64(*val); | 189 | *val = le64_to_cpu(le_val); |
186 | } | 190 | } |
187 | break; | 191 | break; |
188 | case 's':{ | 192 | case 's':{ |
@@ -362,19 +366,19 @@ p9pdu_vwritef(struct p9_fcall *pdu, int optional, const char *fmt, va_list ap) | |||
362 | } | 366 | } |
363 | break; | 367 | break; |
364 | case 'w':{ | 368 | case 'w':{ |
365 | int16_t val = va_arg(ap, int); | 369 | __le16 val = cpu_to_le16(va_arg(ap, int)); |
366 | if (pdu_write(pdu, &val, sizeof(val))) | 370 | if (pdu_write(pdu, &val, sizeof(val))) |
367 | errcode = -EFAULT; | 371 | errcode = -EFAULT; |
368 | } | 372 | } |
369 | break; | 373 | break; |
370 | case 'd':{ | 374 | case 'd':{ |
371 | int32_t val = va_arg(ap, int32_t); | 375 | __le32 val = cpu_to_le32(va_arg(ap, int32_t)); |
372 | if (pdu_write(pdu, &val, sizeof(val))) | 376 | if (pdu_write(pdu, &val, sizeof(val))) |
373 | errcode = -EFAULT; | 377 | errcode = -EFAULT; |
374 | } | 378 | } |
375 | break; | 379 | break; |
376 | case 'q':{ | 380 | case 'q':{ |
377 | int64_t val = va_arg(ap, int64_t); | 381 | __le64 val = cpu_to_le64(va_arg(ap, int64_t)); |
378 | if (pdu_write(pdu, &val, sizeof(val))) | 382 | if (pdu_write(pdu, &val, sizeof(val))) |
379 | errcode = -EFAULT; | 383 | errcode = -EFAULT; |
380 | } | 384 | } |
diff --git a/net/bridge/br_forward.c b/net/bridge/br_forward.c index bdd9ccea17ce..d2c27c808d3b 100644 --- a/net/bridge/br_forward.c +++ b/net/bridge/br_forward.c | |||
@@ -67,6 +67,11 @@ static void __br_forward(const struct net_bridge_port *to, struct sk_buff *skb) | |||
67 | { | 67 | { |
68 | struct net_device *indev; | 68 | struct net_device *indev; |
69 | 69 | ||
70 | if (skb_warn_if_lro(skb)) { | ||
71 | kfree_skb(skb); | ||
72 | return; | ||
73 | } | ||
74 | |||
70 | indev = skb->dev; | 75 | indev = skb->dev; |
71 | skb->dev = to->dev; | 76 | skb->dev = to->dev; |
72 | skb_forward_csum(skb); | 77 | skb_forward_csum(skb); |
@@ -89,7 +94,7 @@ void br_deliver(const struct net_bridge_port *to, struct sk_buff *skb) | |||
89 | /* called with rcu_read_lock */ | 94 | /* called with rcu_read_lock */ |
90 | void br_forward(const struct net_bridge_port *to, struct sk_buff *skb) | 95 | void br_forward(const struct net_bridge_port *to, struct sk_buff *skb) |
91 | { | 96 | { |
92 | if (!skb_warn_if_lro(skb) && should_deliver(to, skb)) { | 97 | if (should_deliver(to, skb)) { |
93 | __br_forward(to, skb); | 98 | __br_forward(to, skb); |
94 | return; | 99 | return; |
95 | } | 100 | } |
diff --git a/net/core/dev.c b/net/core/dev.c index 5379b0c1190a..a17e00662363 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -1090,7 +1090,7 @@ int dev_open(struct net_device *dev) | |||
1090 | /* | 1090 | /* |
1091 | * Enable NET_DMA | 1091 | * Enable NET_DMA |
1092 | */ | 1092 | */ |
1093 | dmaengine_get(); | 1093 | net_dmaengine_get(); |
1094 | 1094 | ||
1095 | /* | 1095 | /* |
1096 | * Initialize multicasting status | 1096 | * Initialize multicasting status |
@@ -1172,7 +1172,7 @@ int dev_close(struct net_device *dev) | |||
1172 | /* | 1172 | /* |
1173 | * Shutdown NET_DMA | 1173 | * Shutdown NET_DMA |
1174 | */ | 1174 | */ |
1175 | dmaengine_put(); | 1175 | net_dmaengine_put(); |
1176 | 1176 | ||
1177 | return 0; | 1177 | return 0; |
1178 | } | 1178 | } |
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index f66c58df8953..278a142d1047 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c | |||
@@ -1994,8 +1994,8 @@ static int neightbl_dump_info(struct sk_buff *skb, struct netlink_callback *cb) | |||
1994 | if (!net_eq(neigh_parms_net(p), net)) | 1994 | if (!net_eq(neigh_parms_net(p), net)) |
1995 | continue; | 1995 | continue; |
1996 | 1996 | ||
1997 | if (nidx++ < neigh_skip) | 1997 | if (nidx < neigh_skip) |
1998 | continue; | 1998 | goto next; |
1999 | 1999 | ||
2000 | if (neightbl_fill_param_info(skb, tbl, p, | 2000 | if (neightbl_fill_param_info(skb, tbl, p, |
2001 | NETLINK_CB(cb->skb).pid, | 2001 | NETLINK_CB(cb->skb).pid, |
@@ -2003,6 +2003,8 @@ static int neightbl_dump_info(struct sk_buff *skb, struct netlink_callback *cb) | |||
2003 | RTM_NEWNEIGHTBL, | 2003 | RTM_NEWNEIGHTBL, |
2004 | NLM_F_MULTI) <= 0) | 2004 | NLM_F_MULTI) <= 0) |
2005 | goto out; | 2005 | goto out; |
2006 | next: | ||
2007 | nidx++; | ||
2006 | } | 2008 | } |
2007 | 2009 | ||
2008 | neigh_skip = 0; | 2010 | neigh_skip = 0; |
@@ -2082,12 +2084,10 @@ static int neigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb, | |||
2082 | if (h > s_h) | 2084 | if (h > s_h) |
2083 | s_idx = 0; | 2085 | s_idx = 0; |
2084 | for (n = tbl->hash_buckets[h], idx = 0; n; n = n->next) { | 2086 | for (n = tbl->hash_buckets[h], idx = 0; n; n = n->next) { |
2085 | int lidx; | ||
2086 | if (dev_net(n->dev) != net) | 2087 | if (dev_net(n->dev) != net) |
2087 | continue; | 2088 | continue; |
2088 | lidx = idx++; | 2089 | if (idx < s_idx) |
2089 | if (lidx < s_idx) | 2090 | goto next; |
2090 | continue; | ||
2091 | if (neigh_fill_info(skb, n, NETLINK_CB(cb->skb).pid, | 2091 | if (neigh_fill_info(skb, n, NETLINK_CB(cb->skb).pid, |
2092 | cb->nlh->nlmsg_seq, | 2092 | cb->nlh->nlmsg_seq, |
2093 | RTM_NEWNEIGH, | 2093 | RTM_NEWNEIGH, |
@@ -2096,6 +2096,8 @@ static int neigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb, | |||
2096 | rc = -1; | 2096 | rc = -1; |
2097 | goto out; | 2097 | goto out; |
2098 | } | 2098 | } |
2099 | next: | ||
2100 | idx++; | ||
2099 | } | 2101 | } |
2100 | } | 2102 | } |
2101 | read_unlock_bh(&tbl->lock); | 2103 | read_unlock_bh(&tbl->lock); |
diff --git a/net/core/sock.c b/net/core/sock.c index f3a0d08cbb48..6f2e1337975d 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -696,6 +696,8 @@ int sock_getsockopt(struct socket *sock, int level, int optname, | |||
696 | if (len < 0) | 696 | if (len < 0) |
697 | return -EINVAL; | 697 | return -EINVAL; |
698 | 698 | ||
699 | v.val = 0; | ||
700 | |||
699 | switch(optname) { | 701 | switch(optname) { |
700 | case SO_DEBUG: | 702 | case SO_DEBUG: |
701 | v.val = sock_flag(sk, SOCK_DBG); | 703 | v.val = sock_flag(sk, SOCK_DBG); |
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 557fe16cbfb0..dda42f0bd7a3 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -663,14 +663,10 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it, | |||
663 | th->urg_ptr = 0; | 663 | th->urg_ptr = 0; |
664 | 664 | ||
665 | /* The urg_mode check is necessary during a below snd_una win probe */ | 665 | /* The urg_mode check is necessary during a below snd_una win probe */ |
666 | if (unlikely(tcp_urg_mode(tp))) { | 666 | if (unlikely(tcp_urg_mode(tp) && |
667 | if (between(tp->snd_up, tcb->seq + 1, tcb->seq + 0xFFFF)) { | 667 | between(tp->snd_up, tcb->seq + 1, tcb->seq + 0xFFFF))) { |
668 | th->urg_ptr = htons(tp->snd_up - tcb->seq); | 668 | th->urg_ptr = htons(tp->snd_up - tcb->seq); |
669 | th->urg = 1; | 669 | th->urg = 1; |
670 | } else if (after(tcb->seq + 0xFFFF, tp->snd_nxt)) { | ||
671 | th->urg_ptr = 0xFFFF; | ||
672 | th->urg = 1; | ||
673 | } | ||
674 | } | 670 | } |
675 | 671 | ||
676 | tcp_options_write((__be32 *)(th + 1), tp, &opts, &md5_hash_location); | 672 | tcp_options_write((__be32 *)(th + 1), tp, &opts, &md5_hash_location); |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index b7faffe5c029..c47c989cb1fb 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
@@ -1015,9 +1015,11 @@ static int __udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) | |||
1015 | 1015 | ||
1016 | if ((rc = sock_queue_rcv_skb(sk, skb)) < 0) { | 1016 | if ((rc = sock_queue_rcv_skb(sk, skb)) < 0) { |
1017 | /* Note that an ENOMEM error is charged twice */ | 1017 | /* Note that an ENOMEM error is charged twice */ |
1018 | if (rc == -ENOMEM) | 1018 | if (rc == -ENOMEM) { |
1019 | UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_RCVBUFERRORS, | 1019 | UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_RCVBUFERRORS, |
1020 | is_udplite); | 1020 | is_udplite); |
1021 | atomic_inc(&sk->sk_drops); | ||
1022 | } | ||
1021 | goto drop; | 1023 | goto drop; |
1022 | } | 1024 | } |
1023 | 1025 | ||
@@ -1229,11 +1231,10 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable, | |||
1229 | int proto) | 1231 | int proto) |
1230 | { | 1232 | { |
1231 | struct sock *sk; | 1233 | struct sock *sk; |
1232 | struct udphdr *uh = udp_hdr(skb); | 1234 | struct udphdr *uh; |
1233 | unsigned short ulen; | 1235 | unsigned short ulen; |
1234 | struct rtable *rt = (struct rtable*)skb->dst; | 1236 | struct rtable *rt = (struct rtable*)skb->dst; |
1235 | __be32 saddr = ip_hdr(skb)->saddr; | 1237 | __be32 saddr, daddr; |
1236 | __be32 daddr = ip_hdr(skb)->daddr; | ||
1237 | struct net *net = dev_net(skb->dev); | 1238 | struct net *net = dev_net(skb->dev); |
1238 | 1239 | ||
1239 | /* | 1240 | /* |
@@ -1242,6 +1243,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable, | |||
1242 | if (!pskb_may_pull(skb, sizeof(struct udphdr))) | 1243 | if (!pskb_may_pull(skb, sizeof(struct udphdr))) |
1243 | goto drop; /* No space for header. */ | 1244 | goto drop; /* No space for header. */ |
1244 | 1245 | ||
1246 | uh = udp_hdr(skb); | ||
1245 | ulen = ntohs(uh->len); | 1247 | ulen = ntohs(uh->len); |
1246 | if (ulen > skb->len) | 1248 | if (ulen > skb->len) |
1247 | goto short_packet; | 1249 | goto short_packet; |
@@ -1256,6 +1258,9 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable, | |||
1256 | if (udp4_csum_init(skb, uh, proto)) | 1258 | if (udp4_csum_init(skb, uh, proto)) |
1257 | goto csum_error; | 1259 | goto csum_error; |
1258 | 1260 | ||
1261 | saddr = ip_hdr(skb)->saddr; | ||
1262 | daddr = ip_hdr(skb)->daddr; | ||
1263 | |||
1259 | if (rt->rt_flags & (RTCF_BROADCAST|RTCF_MULTICAST)) | 1264 | if (rt->rt_flags & (RTCF_BROADCAST|RTCF_MULTICAST)) |
1260 | return __udp4_lib_mcast_deliver(net, skb, uh, | 1265 | return __udp4_lib_mcast_deliver(net, skb, uh, |
1261 | saddr, daddr, udptable); | 1266 | saddr, daddr, udptable); |
diff --git a/net/ipv6/ip6_flowlabel.c b/net/ipv6/ip6_flowlabel.c index c62dd247774f..7712578bdc66 100644 --- a/net/ipv6/ip6_flowlabel.c +++ b/net/ipv6/ip6_flowlabel.c | |||
@@ -323,17 +323,21 @@ static struct ip6_flowlabel * | |||
323 | fl_create(struct net *net, struct in6_flowlabel_req *freq, char __user *optval, | 323 | fl_create(struct net *net, struct in6_flowlabel_req *freq, char __user *optval, |
324 | int optlen, int *err_p) | 324 | int optlen, int *err_p) |
325 | { | 325 | { |
326 | struct ip6_flowlabel *fl; | 326 | struct ip6_flowlabel *fl = NULL; |
327 | int olen; | 327 | int olen; |
328 | int addr_type; | 328 | int addr_type; |
329 | int err; | 329 | int err; |
330 | 330 | ||
331 | olen = optlen - CMSG_ALIGN(sizeof(*freq)); | ||
332 | err = -EINVAL; | ||
333 | if (olen > 64 * 1024) | ||
334 | goto done; | ||
335 | |||
331 | err = -ENOMEM; | 336 | err = -ENOMEM; |
332 | fl = kzalloc(sizeof(*fl), GFP_KERNEL); | 337 | fl = kzalloc(sizeof(*fl), GFP_KERNEL); |
333 | if (fl == NULL) | 338 | if (fl == NULL) |
334 | goto done; | 339 | goto done; |
335 | 340 | ||
336 | olen = optlen - CMSG_ALIGN(sizeof(*freq)); | ||
337 | if (olen > 0) { | 341 | if (olen > 0) { |
338 | struct msghdr msg; | 342 | struct msghdr msg; |
339 | struct flowi flowi; | 343 | struct flowi flowi; |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 4b15938bef4d..9fb49c3b518a 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -1105,6 +1105,18 @@ static inline int ip6_ufo_append_data(struct sock *sk, | |||
1105 | return err; | 1105 | return err; |
1106 | } | 1106 | } |
1107 | 1107 | ||
1108 | static inline struct ipv6_opt_hdr *ip6_opt_dup(struct ipv6_opt_hdr *src, | ||
1109 | gfp_t gfp) | ||
1110 | { | ||
1111 | return src ? kmemdup(src, (src->hdrlen + 1) * 8, gfp) : NULL; | ||
1112 | } | ||
1113 | |||
1114 | static inline struct ipv6_rt_hdr *ip6_rthdr_dup(struct ipv6_rt_hdr *src, | ||
1115 | gfp_t gfp) | ||
1116 | { | ||
1117 | return src ? kmemdup(src, (src->hdrlen + 1) * 8, gfp) : NULL; | ||
1118 | } | ||
1119 | |||
1108 | int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, | 1120 | int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, |
1109 | int offset, int len, int odd, struct sk_buff *skb), | 1121 | int offset, int len, int odd, struct sk_buff *skb), |
1110 | void *from, int length, int transhdrlen, | 1122 | void *from, int length, int transhdrlen, |
@@ -1130,17 +1142,37 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, | |||
1130 | * setup for corking | 1142 | * setup for corking |
1131 | */ | 1143 | */ |
1132 | if (opt) { | 1144 | if (opt) { |
1133 | if (np->cork.opt == NULL) { | 1145 | if (WARN_ON(np->cork.opt)) |
1134 | np->cork.opt = kmalloc(opt->tot_len, | ||
1135 | sk->sk_allocation); | ||
1136 | if (unlikely(np->cork.opt == NULL)) | ||
1137 | return -ENOBUFS; | ||
1138 | } else if (np->cork.opt->tot_len < opt->tot_len) { | ||
1139 | printk(KERN_DEBUG "ip6_append_data: invalid option length\n"); | ||
1140 | return -EINVAL; | 1146 | return -EINVAL; |
1141 | } | 1147 | |
1142 | memcpy(np->cork.opt, opt, opt->tot_len); | 1148 | np->cork.opt = kmalloc(opt->tot_len, sk->sk_allocation); |
1143 | inet->cork.flags |= IPCORK_OPT; | 1149 | if (unlikely(np->cork.opt == NULL)) |
1150 | return -ENOBUFS; | ||
1151 | |||
1152 | np->cork.opt->tot_len = opt->tot_len; | ||
1153 | np->cork.opt->opt_flen = opt->opt_flen; | ||
1154 | np->cork.opt->opt_nflen = opt->opt_nflen; | ||
1155 | |||
1156 | np->cork.opt->dst0opt = ip6_opt_dup(opt->dst0opt, | ||
1157 | sk->sk_allocation); | ||
1158 | if (opt->dst0opt && !np->cork.opt->dst0opt) | ||
1159 | return -ENOBUFS; | ||
1160 | |||
1161 | np->cork.opt->dst1opt = ip6_opt_dup(opt->dst1opt, | ||
1162 | sk->sk_allocation); | ||
1163 | if (opt->dst1opt && !np->cork.opt->dst1opt) | ||
1164 | return -ENOBUFS; | ||
1165 | |||
1166 | np->cork.opt->hopopt = ip6_opt_dup(opt->hopopt, | ||
1167 | sk->sk_allocation); | ||
1168 | if (opt->hopopt && !np->cork.opt->hopopt) | ||
1169 | return -ENOBUFS; | ||
1170 | |||
1171 | np->cork.opt->srcrt = ip6_rthdr_dup(opt->srcrt, | ||
1172 | sk->sk_allocation); | ||
1173 | if (opt->srcrt && !np->cork.opt->srcrt) | ||
1174 | return -ENOBUFS; | ||
1175 | |||
1144 | /* need source address above miyazawa*/ | 1176 | /* need source address above miyazawa*/ |
1145 | } | 1177 | } |
1146 | dst_hold(&rt->u.dst); | 1178 | dst_hold(&rt->u.dst); |
@@ -1167,8 +1199,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, | |||
1167 | } else { | 1199 | } else { |
1168 | rt = (struct rt6_info *)inet->cork.dst; | 1200 | rt = (struct rt6_info *)inet->cork.dst; |
1169 | fl = &inet->cork.fl; | 1201 | fl = &inet->cork.fl; |
1170 | if (inet->cork.flags & IPCORK_OPT) | 1202 | opt = np->cork.opt; |
1171 | opt = np->cork.opt; | ||
1172 | transhdrlen = 0; | 1203 | transhdrlen = 0; |
1173 | exthdrlen = 0; | 1204 | exthdrlen = 0; |
1174 | mtu = inet->cork.fragsize; | 1205 | mtu = inet->cork.fragsize; |
@@ -1407,9 +1438,15 @@ error: | |||
1407 | 1438 | ||
1408 | static void ip6_cork_release(struct inet_sock *inet, struct ipv6_pinfo *np) | 1439 | static void ip6_cork_release(struct inet_sock *inet, struct ipv6_pinfo *np) |
1409 | { | 1440 | { |
1410 | inet->cork.flags &= ~IPCORK_OPT; | 1441 | if (np->cork.opt) { |
1411 | kfree(np->cork.opt); | 1442 | kfree(np->cork.opt->dst0opt); |
1412 | np->cork.opt = NULL; | 1443 | kfree(np->cork.opt->dst1opt); |
1444 | kfree(np->cork.opt->hopopt); | ||
1445 | kfree(np->cork.opt->srcrt); | ||
1446 | kfree(np->cork.opt); | ||
1447 | np->cork.opt = NULL; | ||
1448 | } | ||
1449 | |||
1413 | if (inet->cork.dst) { | 1450 | if (inet->cork.dst) { |
1414 | dst_release(inet->cork.dst); | 1451 | dst_release(inet->cork.dst); |
1415 | inet->cork.dst = NULL; | 1452 | inet->cork.dst = NULL; |
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c index 58e2b0d93758..d994c55a5b16 100644 --- a/net/ipv6/ip6_tunnel.c +++ b/net/ipv6/ip6_tunnel.c | |||
@@ -249,8 +249,8 @@ static struct ip6_tnl *ip6_tnl_create(struct net *net, struct ip6_tnl_parm *p) | |||
249 | } | 249 | } |
250 | 250 | ||
251 | t = netdev_priv(dev); | 251 | t = netdev_priv(dev); |
252 | ip6_tnl_dev_init(dev); | ||
253 | t->parms = *p; | 252 | t->parms = *p; |
253 | ip6_tnl_dev_init(dev); | ||
254 | 254 | ||
255 | if ((err = register_netdevice(dev)) < 0) | 255 | if ((err = register_netdevice(dev)) < 0) |
256 | goto failed_free; | 256 | goto failed_free; |
diff --git a/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c b/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c index c455cf4ee756..c323643ffcf9 100644 --- a/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c +++ b/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c | |||
@@ -49,8 +49,19 @@ static bool icmpv6_pkt_to_tuple(const struct sk_buff *skb, | |||
49 | static const u_int8_t invmap[] = { | 49 | static const u_int8_t invmap[] = { |
50 | [ICMPV6_ECHO_REQUEST - 128] = ICMPV6_ECHO_REPLY + 1, | 50 | [ICMPV6_ECHO_REQUEST - 128] = ICMPV6_ECHO_REPLY + 1, |
51 | [ICMPV6_ECHO_REPLY - 128] = ICMPV6_ECHO_REQUEST + 1, | 51 | [ICMPV6_ECHO_REPLY - 128] = ICMPV6_ECHO_REQUEST + 1, |
52 | [ICMPV6_NI_QUERY - 128] = ICMPV6_NI_QUERY + 1, | 52 | [ICMPV6_NI_QUERY - 128] = ICMPV6_NI_REPLY + 1, |
53 | [ICMPV6_NI_REPLY - 128] = ICMPV6_NI_REPLY +1 | 53 | [ICMPV6_NI_REPLY - 128] = ICMPV6_NI_QUERY +1 |
54 | }; | ||
55 | |||
56 | static const u_int8_t noct_valid_new[] = { | ||
57 | [ICMPV6_MGM_QUERY - 130] = 1, | ||
58 | [ICMPV6_MGM_REPORT -130] = 1, | ||
59 | [ICMPV6_MGM_REDUCTION - 130] = 1, | ||
60 | [NDISC_ROUTER_SOLICITATION - 130] = 1, | ||
61 | [NDISC_ROUTER_ADVERTISEMENT - 130] = 1, | ||
62 | [NDISC_NEIGHBOUR_SOLICITATION - 130] = 1, | ||
63 | [NDISC_NEIGHBOUR_ADVERTISEMENT - 130] = 1, | ||
64 | [ICMPV6_MLD2_REPORT - 130] = 1 | ||
54 | }; | 65 | }; |
55 | 66 | ||
56 | static bool icmpv6_invert_tuple(struct nf_conntrack_tuple *tuple, | 67 | static bool icmpv6_invert_tuple(struct nf_conntrack_tuple *tuple, |
@@ -178,6 +189,7 @@ icmpv6_error(struct net *net, struct sk_buff *skb, unsigned int dataoff, | |||
178 | { | 189 | { |
179 | const struct icmp6hdr *icmp6h; | 190 | const struct icmp6hdr *icmp6h; |
180 | struct icmp6hdr _ih; | 191 | struct icmp6hdr _ih; |
192 | int type; | ||
181 | 193 | ||
182 | icmp6h = skb_header_pointer(skb, dataoff, sizeof(_ih), &_ih); | 194 | icmp6h = skb_header_pointer(skb, dataoff, sizeof(_ih), &_ih); |
183 | if (icmp6h == NULL) { | 195 | if (icmp6h == NULL) { |
@@ -194,6 +206,15 @@ icmpv6_error(struct net *net, struct sk_buff *skb, unsigned int dataoff, | |||
194 | return -NF_ACCEPT; | 206 | return -NF_ACCEPT; |
195 | } | 207 | } |
196 | 208 | ||
209 | type = icmp6h->icmp6_type - 130; | ||
210 | if (type >= 0 && type < sizeof(noct_valid_new) && | ||
211 | noct_valid_new[type]) { | ||
212 | skb->nfct = &nf_conntrack_untracked.ct_general; | ||
213 | skb->nfctinfo = IP_CT_NEW; | ||
214 | nf_conntrack_get(skb->nfct); | ||
215 | return NF_ACCEPT; | ||
216 | } | ||
217 | |||
197 | /* is not error message ? */ | 218 | /* is not error message ? */ |
198 | if (icmp6h->icmp6_type >= 128) | 219 | if (icmp6h->icmp6_type >= 128) |
199 | return NF_ACCEPT; | 220 | return NF_ACCEPT; |
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 4278e545638f..94de5033f0b6 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
@@ -1343,6 +1343,8 @@ int ieee80211_master_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1343 | list) { | 1343 | list) { |
1344 | if (!netif_running(sdata->dev)) | 1344 | if (!netif_running(sdata->dev)) |
1345 | continue; | 1345 | continue; |
1346 | if (sdata->vif.type != NL80211_IFTYPE_AP) | ||
1347 | continue; | ||
1346 | if (compare_ether_addr(sdata->dev->dev_addr, | 1348 | if (compare_ether_addr(sdata->dev->dev_addr, |
1347 | hdr->addr2)) { | 1349 | hdr->addr2)) { |
1348 | dev_hold(sdata->dev); | 1350 | dev_hold(sdata->dev); |
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index c32a7e8e3a1b..cb78aa00399e 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c | |||
@@ -434,7 +434,7 @@ static int ctnetlink_conntrack_event(struct notifier_block *this, | |||
434 | } else | 434 | } else |
435 | return NOTIFY_DONE; | 435 | return NOTIFY_DONE; |
436 | 436 | ||
437 | if (!nfnetlink_has_listeners(group)) | 437 | if (!item->report && !nfnetlink_has_listeners(group)) |
438 | return NOTIFY_DONE; | 438 | return NOTIFY_DONE; |
439 | 439 | ||
440 | skb = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC); | 440 | skb = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC); |
@@ -1215,6 +1215,16 @@ ctnetlink_create_conntrack(struct nlattr *cda[], | |||
1215 | } | 1215 | } |
1216 | } | 1216 | } |
1217 | 1217 | ||
1218 | #ifdef CONFIG_NF_NAT_NEEDED | ||
1219 | if (cda[CTA_NAT_SEQ_ADJ_ORIG] || cda[CTA_NAT_SEQ_ADJ_REPLY]) { | ||
1220 | err = ctnetlink_change_nat_seq_adj(ct, cda); | ||
1221 | if (err < 0) { | ||
1222 | rcu_read_unlock(); | ||
1223 | goto err; | ||
1224 | } | ||
1225 | } | ||
1226 | #endif | ||
1227 | |||
1218 | if (cda[CTA_PROTOINFO]) { | 1228 | if (cda[CTA_PROTOINFO]) { |
1219 | err = ctnetlink_change_protoinfo(ct, cda); | 1229 | err = ctnetlink_change_protoinfo(ct, cda); |
1220 | if (err < 0) { | 1230 | if (err < 0) { |
@@ -1492,7 +1502,8 @@ static int ctnetlink_expect_event(struct notifier_block *this, | |||
1492 | } else | 1502 | } else |
1493 | return NOTIFY_DONE; | 1503 | return NOTIFY_DONE; |
1494 | 1504 | ||
1495 | if (!nfnetlink_has_listeners(NFNLGRP_CONNTRACK_EXP_NEW)) | 1505 | if (!item->report && |
1506 | !nfnetlink_has_listeners(NFNLGRP_CONNTRACK_EXP_NEW)) | ||
1496 | return NOTIFY_DONE; | 1507 | return NOTIFY_DONE; |
1497 | 1508 | ||
1498 | skb = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC); | 1509 | skb = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC); |
diff --git a/net/netfilter/xt_sctp.c b/net/netfilter/xt_sctp.c index e223cb43ae8e..a189ada9128f 100644 --- a/net/netfilter/xt_sctp.c +++ b/net/netfilter/xt_sctp.c | |||
@@ -105,7 +105,7 @@ match_packet(const struct sk_buff *skb, | |||
105 | 105 | ||
106 | switch (chunk_match_type) { | 106 | switch (chunk_match_type) { |
107 | case SCTP_CHUNK_MATCH_ALL: | 107 | case SCTP_CHUNK_MATCH_ALL: |
108 | return SCTP_CHUNKMAP_IS_CLEAR(info->chunkmap); | 108 | return SCTP_CHUNKMAP_IS_CLEAR(chunkmapcopy); |
109 | case SCTP_CHUNK_MATCH_ANY: | 109 | case SCTP_CHUNK_MATCH_ANY: |
110 | return false; | 110 | return false; |
111 | case SCTP_CHUNK_MATCH_ONLY: | 111 | case SCTP_CHUNK_MATCH_ONLY: |
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 9454d4ae46df..1fc4a7885c41 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
@@ -222,13 +222,13 @@ static void *packet_lookup_frame(struct packet_sock *po, unsigned int position, | |||
222 | h.raw = po->pg_vec[pg_vec_pos] + (frame_offset * po->frame_size); | 222 | h.raw = po->pg_vec[pg_vec_pos] + (frame_offset * po->frame_size); |
223 | switch (po->tp_version) { | 223 | switch (po->tp_version) { |
224 | case TPACKET_V1: | 224 | case TPACKET_V1: |
225 | if (status != h.h1->tp_status ? TP_STATUS_USER : | 225 | if (status != (h.h1->tp_status ? TP_STATUS_USER : |
226 | TP_STATUS_KERNEL) | 226 | TP_STATUS_KERNEL)) |
227 | return NULL; | 227 | return NULL; |
228 | break; | 228 | break; |
229 | case TPACKET_V2: | 229 | case TPACKET_V2: |
230 | if (status != h.h2->tp_status ? TP_STATUS_USER : | 230 | if (status != (h.h2->tp_status ? TP_STATUS_USER : |
231 | TP_STATUS_KERNEL) | 231 | TP_STATUS_KERNEL)) |
232 | return NULL; | 232 | return NULL; |
233 | break; | 233 | break; |
234 | } | 234 | } |
diff --git a/net/phonet/pep-gprs.c b/net/phonet/pep-gprs.c index 6a91a32a80c1..4aa888584d20 100644 --- a/net/phonet/pep-gprs.c +++ b/net/phonet/pep-gprs.c | |||
@@ -207,7 +207,6 @@ static int gprs_xmit(struct sk_buff *skb, struct net_device *dev) | |||
207 | dev->name, err); | 207 | dev->name, err); |
208 | dev->stats.tx_aborted_errors++; | 208 | dev->stats.tx_aborted_errors++; |
209 | dev->stats.tx_errors++; | 209 | dev->stats.tx_errors++; |
210 | dev_kfree_skb(skb); | ||
211 | } else { | 210 | } else { |
212 | dev->stats.tx_packets++; | 211 | dev->stats.tx_packets++; |
213 | dev->stats.tx_bytes += len; | 212 | dev->stats.tx_bytes += len; |
diff --git a/net/phonet/pep.c b/net/phonet/pep.c index bb3e67849b38..8ad2b5333881 100644 --- a/net/phonet/pep.c +++ b/net/phonet/pep.c | |||
@@ -553,7 +553,7 @@ static int pep_do_rcv(struct sock *sk, struct sk_buff *skb) | |||
553 | { | 553 | { |
554 | struct pep_sock *pn = pep_sk(sk); | 554 | struct pep_sock *pn = pep_sk(sk); |
555 | struct sock *sknode; | 555 | struct sock *sknode; |
556 | struct pnpipehdr *hdr = pnp_hdr(skb); | 556 | struct pnpipehdr *hdr; |
557 | struct sockaddr_pn dst; | 557 | struct sockaddr_pn dst; |
558 | int err = NET_RX_SUCCESS; | 558 | int err = NET_RX_SUCCESS; |
559 | u8 pipe_handle; | 559 | u8 pipe_handle; |
diff --git a/net/rxrpc/af_rxrpc.c b/net/rxrpc/af_rxrpc.c index d7d2bed7a699..eac5e7bb7365 100644 --- a/net/rxrpc/af_rxrpc.c +++ b/net/rxrpc/af_rxrpc.c | |||
@@ -284,13 +284,13 @@ struct rxrpc_call *rxrpc_kernel_begin_call(struct socket *sock, | |||
284 | if (IS_ERR(trans)) { | 284 | if (IS_ERR(trans)) { |
285 | call = ERR_CAST(trans); | 285 | call = ERR_CAST(trans); |
286 | trans = NULL; | 286 | trans = NULL; |
287 | goto out; | 287 | goto out_notrans; |
288 | } | 288 | } |
289 | } else { | 289 | } else { |
290 | trans = rx->trans; | 290 | trans = rx->trans; |
291 | if (!trans) { | 291 | if (!trans) { |
292 | call = ERR_PTR(-ENOTCONN); | 292 | call = ERR_PTR(-ENOTCONN); |
293 | goto out; | 293 | goto out_notrans; |
294 | } | 294 | } |
295 | atomic_inc(&trans->usage); | 295 | atomic_inc(&trans->usage); |
296 | } | 296 | } |
@@ -315,6 +315,7 @@ struct rxrpc_call *rxrpc_kernel_begin_call(struct socket *sock, | |||
315 | rxrpc_put_bundle(trans, bundle); | 315 | rxrpc_put_bundle(trans, bundle); |
316 | out: | 316 | out: |
317 | rxrpc_put_transport(trans); | 317 | rxrpc_put_transport(trans); |
318 | out_notrans: | ||
318 | release_sock(&rx->sk); | 319 | release_sock(&rx->sk); |
319 | _leave(" = %p", call); | 320 | _leave(" = %p", call); |
320 | return call; | 321 | return call; |
diff --git a/net/sunrpc/Kconfig b/net/sunrpc/Kconfig index dcef600d0bf5..5592883e1e4a 100644 --- a/net/sunrpc/Kconfig +++ b/net/sunrpc/Kconfig | |||
@@ -6,7 +6,7 @@ config SUNRPC_GSS | |||
6 | 6 | ||
7 | config SUNRPC_XPRT_RDMA | 7 | config SUNRPC_XPRT_RDMA |
8 | tristate | 8 | tristate |
9 | depends on SUNRPC && INFINIBAND && EXPERIMENTAL | 9 | depends on SUNRPC && INFINIBAND && INFINIBAND_ADDR_TRANS && EXPERIMENTAL |
10 | default SUNRPC && INFINIBAND | 10 | default SUNRPC && INFINIBAND |
11 | help | 11 | help |
12 | This option allows the NFS client and server to support | 12 | This option allows the NFS client and server to support |
diff --git a/net/wimax/id-table.c b/net/wimax/id-table.c index 5e685f7eda90..72273abfcb16 100644 --- a/net/wimax/id-table.c +++ b/net/wimax/id-table.c | |||
@@ -94,12 +94,13 @@ struct wimax_dev *wimax_dev_get_by_genl_info( | |||
94 | list_for_each_entry(wimax_dev, &wimax_id_table, id_table_node) { | 94 | list_for_each_entry(wimax_dev, &wimax_id_table, id_table_node) { |
95 | if (wimax_dev->net_dev->ifindex == ifindex) { | 95 | if (wimax_dev->net_dev->ifindex == ifindex) { |
96 | dev_hold(wimax_dev->net_dev); | 96 | dev_hold(wimax_dev->net_dev); |
97 | break; | 97 | goto found; |
98 | } | 98 | } |
99 | } | 99 | } |
100 | if (wimax_dev == NULL) | 100 | wimax_dev = NULL; |
101 | d_printf(1, NULL, "wimax: no devices found with ifindex %d\n", | 101 | d_printf(1, NULL, "wimax: no devices found with ifindex %d\n", |
102 | ifindex); | 102 | ifindex); |
103 | found: | ||
103 | spin_unlock(&wimax_id_table_lock); | 104 | spin_unlock(&wimax_id_table_lock); |
104 | d_fnend(3, NULL, "(info %p ifindex %d) = %p\n", | 105 | d_fnend(3, NULL, "(info %p ifindex %d) = %p\n", |
105 | info, ifindex, wimax_dev); | 106 | info, ifindex, wimax_dev); |