Linux v3.12.4
This commit is contained in:
parent
636d117377
commit
06c368d019
@ -1,39 +0,0 @@
|
|||||||
Bugzilla: 1015905
|
|
||||||
Upstream-status: 3.13 (should hit stable)
|
|
||||||
|
|
||||||
From 90e4e23d52fd04f228eed2c3d341136c50058b37 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jiri Pirko <jiri@resnulli.us>
|
|
||||||
Date: Wed, 6 Nov 2013 17:52:19 +0100
|
|
||||||
Subject: [PATCH 1/2] ip6_output: fragment outgoing reassembled skb properly
|
|
||||||
|
|
||||||
If reassembled packet would fit into outdev MTU, it is not fragmented
|
|
||||||
according the original frag size and it is send as single big packet.
|
|
||||||
|
|
||||||
The second case is if skb is gso. In that case fragmentation does not happen
|
|
||||||
according to the original frag size.
|
|
||||||
|
|
||||||
This patch fixes these.
|
|
||||||
|
|
||||||
Signed-off-by: Jiri Pirko <jiri@resnulli.us>
|
|
||||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
||||||
---
|
|
||||||
net/ipv6/ip6_output.c | 3 ++-
|
|
||||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
|
|
||||||
index 5b25f85..f80f2fa 100644
|
|
||||||
--- a/net/ipv6/ip6_output.c
|
|
||||||
+++ b/net/ipv6/ip6_output.c
|
|
||||||
@@ -150,7 +150,8 @@ static int ip6_finish_output2(struct sk_buff *skb)
|
|
||||||
static int ip6_finish_output(struct sk_buff *skb)
|
|
||||||
{
|
|
||||||
if ((skb->len > ip6_skb_dst_mtu(skb) && !skb_is_gso(skb)) ||
|
|
||||||
- dst_allfrag(skb_dst(skb)))
|
|
||||||
+ dst_allfrag(skb_dst(skb)) ||
|
|
||||||
+ (IP6CB(skb)->frag_max_size && skb->len > IP6CB(skb)->frag_max_size))
|
|
||||||
return ip6_fragment(skb, ip6_finish_output2);
|
|
||||||
else
|
|
||||||
return ip6_finish_output2(skb);
|
|
||||||
--
|
|
||||||
1.8.3.1
|
|
||||||
|
|
@ -1,499 +0,0 @@
|
|||||||
Bugzilla: 1015905
|
|
||||||
Upstream-status: 3.13 (should hit stable)
|
|
||||||
|
|
||||||
From 5c0df04613dd39fba5d2a43eaf90a2dc1dcd8899 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jiri Pirko <jiri@resnulli.us>
|
|
||||||
Date: Wed, 6 Nov 2013 17:52:20 +0100
|
|
||||||
Subject: [PATCH 2/2] netfilter: push reasm skb through instead of original
|
|
||||||
frag skbs
|
|
||||||
|
|
||||||
Pushing original fragments through causes several problems. For example
|
|
||||||
for matching, frags may not be matched correctly. Take following
|
|
||||||
example:
|
|
||||||
|
|
||||||
<example>
|
|
||||||
On HOSTA do:
|
|
||||||
ip6tables -I INPUT -p icmpv6 -j DROP
|
|
||||||
ip6tables -I INPUT -p icmpv6 -m icmp6 --icmpv6-type 128 -j ACCEPT
|
|
||||||
|
|
||||||
and on HOSTB you do:
|
|
||||||
ping6 HOSTA -s2000 (MTU is 1500)
|
|
||||||
|
|
||||||
Incoming echo requests will be filtered out on HOSTA. This issue does
|
|
||||||
not occur with smaller packets than MTU (where fragmentation does not happen)
|
|
||||||
</example>
|
|
||||||
|
|
||||||
As was discussed previously, the only correct solution seems to be to use
|
|
||||||
reassembled skb instead of separete frags. Doing this has positive side
|
|
||||||
effects in reducing sk_buff by one pointer (nfct_reasm) and also the reams
|
|
||||||
dances in ipvs and conntrack can be removed.
|
|
||||||
|
|
||||||
Future plan is to remove net/ipv6/netfilter/nf_conntrack_reasm.c
|
|
||||||
entirely and use code in net/ipv6/reassembly.c instead.
|
|
||||||
|
|
||||||
Signed-off-by: Jiri Pirko <jiri@resnulli.us>
|
|
||||||
Acked-by: Julian Anastasov <ja@ssi.bg>
|
|
||||||
Signed-off-by: Marcelo Ricardo Leitner <mleitner@redhat.com>
|
|
||||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
||||||
|
|
||||||
Conflicts:
|
|
||||||
include/net/netfilter/ipv6/nf_defrag_ipv6.h
|
|
||||||
net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
|
|
||||||
net/ipv6/netfilter/nf_defrag_ipv6_hooks.c
|
|
||||||
net/netfilter/ipvs/ip_vs_core.c
|
|
||||||
---
|
|
||||||
include/linux/skbuff.h | 32 ---------------
|
|
||||||
include/net/ip_vs.h | 32 +--------------
|
|
||||||
include/net/netfilter/ipv6/nf_defrag_ipv6.h | 5 +--
|
|
||||||
net/core/skbuff.c | 3 --
|
|
||||||
net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c | 54 +------------------------
|
|
||||||
net/ipv6/netfilter/nf_conntrack_reasm.c | 19 +--------
|
|
||||||
net/ipv6/netfilter/nf_defrag_ipv6_hooks.c | 7 +++-
|
|
||||||
net/netfilter/ipvs/ip_vs_core.c | 55 +-------------------------
|
|
||||||
net/netfilter/ipvs/ip_vs_pe_sip.c | 8 +---
|
|
||||||
9 files changed, 13 insertions(+), 202 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
|
|
||||||
index 6bd165b..37b4517 100644
|
|
||||||
--- a/include/linux/skbuff.h
|
|
||||||
+++ b/include/linux/skbuff.h
|
|
||||||
@@ -333,11 +333,6 @@ typedef unsigned int sk_buff_data_t;
|
|
||||||
typedef unsigned char *sk_buff_data_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
-#if defined(CONFIG_NF_DEFRAG_IPV4) || defined(CONFIG_NF_DEFRAG_IPV4_MODULE) || \
|
|
||||||
- defined(CONFIG_NF_DEFRAG_IPV6) || defined(CONFIG_NF_DEFRAG_IPV6_MODULE)
|
|
||||||
-#define NET_SKBUFF_NF_DEFRAG_NEEDED 1
|
|
||||||
-#endif
|
|
||||||
-
|
|
||||||
/**
|
|
||||||
* struct sk_buff - socket buffer
|
|
||||||
* @next: Next buffer in list
|
|
||||||
@@ -370,7 +365,6 @@ typedef unsigned char *sk_buff_data_t;
|
|
||||||
* @protocol: Packet protocol from driver
|
|
||||||
* @destructor: Destruct function
|
|
||||||
* @nfct: Associated connection, if any
|
|
||||||
- * @nfct_reasm: netfilter conntrack re-assembly pointer
|
|
||||||
* @nf_bridge: Saved data about a bridged frame - see br_netfilter.c
|
|
||||||
* @skb_iif: ifindex of device we arrived on
|
|
||||||
* @tc_index: Traffic control index
|
|
||||||
@@ -459,9 +453,6 @@ struct sk_buff {
|
|
||||||
#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
|
|
||||||
struct nf_conntrack *nfct;
|
|
||||||
#endif
|
|
||||||
-#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
|
|
||||||
- struct sk_buff *nfct_reasm;
|
|
||||||
-#endif
|
|
||||||
#ifdef CONFIG_BRIDGE_NETFILTER
|
|
||||||
struct nf_bridge_info *nf_bridge;
|
|
||||||
#endif
|
|
||||||
@@ -2603,18 +2594,6 @@ static inline void nf_conntrack_get(struct nf_conntrack *nfct)
|
|
||||||
atomic_inc(&nfct->use);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
-#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
|
|
||||||
-static inline void nf_conntrack_get_reasm(struct sk_buff *skb)
|
|
||||||
-{
|
|
||||||
- if (skb)
|
|
||||||
- atomic_inc(&skb->users);
|
|
||||||
-}
|
|
||||||
-static inline void nf_conntrack_put_reasm(struct sk_buff *skb)
|
|
||||||
-{
|
|
||||||
- if (skb)
|
|
||||||
- kfree_skb(skb);
|
|
||||||
-}
|
|
||||||
-#endif
|
|
||||||
#ifdef CONFIG_BRIDGE_NETFILTER
|
|
||||||
static inline void nf_bridge_put(struct nf_bridge_info *nf_bridge)
|
|
||||||
{
|
|
||||||
@@ -2633,10 +2612,6 @@ static inline void nf_reset(struct sk_buff *skb)
|
|
||||||
nf_conntrack_put(skb->nfct);
|
|
||||||
skb->nfct = NULL;
|
|
||||||
#endif
|
|
||||||
-#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
|
|
||||||
- nf_conntrack_put_reasm(skb->nfct_reasm);
|
|
||||||
- skb->nfct_reasm = NULL;
|
|
||||||
-#endif
|
|
||||||
#ifdef CONFIG_BRIDGE_NETFILTER
|
|
||||||
nf_bridge_put(skb->nf_bridge);
|
|
||||||
skb->nf_bridge = NULL;
|
|
||||||
@@ -2658,10 +2633,6 @@ static inline void __nf_copy(struct sk_buff *dst, const struct sk_buff *src)
|
|
||||||
nf_conntrack_get(src->nfct);
|
|
||||||
dst->nfctinfo = src->nfctinfo;
|
|
||||||
#endif
|
|
||||||
-#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
|
|
||||||
- dst->nfct_reasm = src->nfct_reasm;
|
|
||||||
- nf_conntrack_get_reasm(src->nfct_reasm);
|
|
||||||
-#endif
|
|
||||||
#ifdef CONFIG_BRIDGE_NETFILTER
|
|
||||||
dst->nf_bridge = src->nf_bridge;
|
|
||||||
nf_bridge_get(src->nf_bridge);
|
|
||||||
@@ -2673,9 +2644,6 @@ static inline void nf_copy(struct sk_buff *dst, const struct sk_buff *src)
|
|
||||||
#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
|
|
||||||
nf_conntrack_put(dst->nfct);
|
|
||||||
#endif
|
|
||||||
-#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
|
|
||||||
- nf_conntrack_put_reasm(dst->nfct_reasm);
|
|
||||||
-#endif
|
|
||||||
#ifdef CONFIG_BRIDGE_NETFILTER
|
|
||||||
nf_bridge_put(dst->nf_bridge);
|
|
||||||
#endif
|
|
||||||
diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h
|
|
||||||
index f0d70f0..ff21521 100644
|
|
||||||
--- a/include/net/ip_vs.h
|
|
||||||
+++ b/include/net/ip_vs.h
|
|
||||||
@@ -109,7 +109,6 @@ extern int ip_vs_conn_tab_size;
|
|
||||||
struct ip_vs_iphdr {
|
|
||||||
__u32 len; /* IPv4 simply where L4 starts
|
|
||||||
IPv6 where L4 Transport Header starts */
|
|
||||||
- __u32 thoff_reasm; /* Transport Header Offset in nfct_reasm skb */
|
|
||||||
__u16 fragoffs; /* IPv6 fragment offset, 0 if first frag (or not frag)*/
|
|
||||||
__s16 protocol;
|
|
||||||
__s32 flags;
|
|
||||||
@@ -117,34 +116,12 @@ struct ip_vs_iphdr {
|
|
||||||
union nf_inet_addr daddr;
|
|
||||||
};
|
|
||||||
|
|
||||||
-/* Dependency to module: nf_defrag_ipv6 */
|
|
||||||
-#if defined(CONFIG_NF_DEFRAG_IPV6) || defined(CONFIG_NF_DEFRAG_IPV6_MODULE)
|
|
||||||
-static inline struct sk_buff *skb_nfct_reasm(const struct sk_buff *skb)
|
|
||||||
-{
|
|
||||||
- return skb->nfct_reasm;
|
|
||||||
-}
|
|
||||||
-static inline void *frag_safe_skb_hp(const struct sk_buff *skb, int offset,
|
|
||||||
- int len, void *buffer,
|
|
||||||
- const struct ip_vs_iphdr *ipvsh)
|
|
||||||
-{
|
|
||||||
- if (unlikely(ipvsh->fragoffs && skb_nfct_reasm(skb)))
|
|
||||||
- return skb_header_pointer(skb_nfct_reasm(skb),
|
|
||||||
- ipvsh->thoff_reasm, len, buffer);
|
|
||||||
-
|
|
||||||
- return skb_header_pointer(skb, offset, len, buffer);
|
|
||||||
-}
|
|
||||||
-#else
|
|
||||||
-static inline struct sk_buff *skb_nfct_reasm(const struct sk_buff *skb)
|
|
||||||
-{
|
|
||||||
- return NULL;
|
|
||||||
-}
|
|
||||||
static inline void *frag_safe_skb_hp(const struct sk_buff *skb, int offset,
|
|
||||||
int len, void *buffer,
|
|
||||||
const struct ip_vs_iphdr *ipvsh)
|
|
||||||
{
|
|
||||||
return skb_header_pointer(skb, offset, len, buffer);
|
|
||||||
}
|
|
||||||
-#endif
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
ip_vs_fill_ip4hdr(const void *nh, struct ip_vs_iphdr *iphdr)
|
|
||||||
@@ -171,19 +148,12 @@ ip_vs_fill_iph_skb(int af, const struct sk_buff *skb, struct ip_vs_iphdr *iphdr)
|
|
||||||
(struct ipv6hdr *)skb_network_header(skb);
|
|
||||||
iphdr->saddr.in6 = iph->saddr;
|
|
||||||
iphdr->daddr.in6 = iph->daddr;
|
|
||||||
- /* ipv6_find_hdr() updates len, flags, thoff_reasm */
|
|
||||||
- iphdr->thoff_reasm = 0;
|
|
||||||
+ /* ipv6_find_hdr() updates len, flags */
|
|
||||||
iphdr->len = 0;
|
|
||||||
iphdr->flags = 0;
|
|
||||||
iphdr->protocol = ipv6_find_hdr(skb, &iphdr->len, -1,
|
|
||||||
&iphdr->fragoffs,
|
|
||||||
&iphdr->flags);
|
|
||||||
- /* get proto from re-assembled packet and it's offset */
|
|
||||||
- if (skb_nfct_reasm(skb))
|
|
||||||
- iphdr->protocol = ipv6_find_hdr(skb_nfct_reasm(skb),
|
|
||||||
- &iphdr->thoff_reasm,
|
|
||||||
- -1, NULL, NULL);
|
|
||||||
-
|
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
diff --git a/include/net/netfilter/ipv6/nf_defrag_ipv6.h b/include/net/netfilter/ipv6/nf_defrag_ipv6.h
|
|
||||||
index fd79c9a..17920d8 100644
|
|
||||||
--- a/include/net/netfilter/ipv6/nf_defrag_ipv6.h
|
|
||||||
+++ b/include/net/netfilter/ipv6/nf_defrag_ipv6.h
|
|
||||||
@@ -6,10 +6,7 @@ extern void nf_defrag_ipv6_enable(void);
|
|
||||||
extern int nf_ct_frag6_init(void);
|
|
||||||
extern void nf_ct_frag6_cleanup(void);
|
|
||||||
extern struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb, u32 user);
|
|
||||||
-extern void nf_ct_frag6_output(unsigned int hooknum, struct sk_buff *skb,
|
|
||||||
- struct net_device *in,
|
|
||||||
- struct net_device *out,
|
|
||||||
- int (*okfn)(struct sk_buff *));
|
|
||||||
+extern void nf_ct_frag6_consume_orig(struct sk_buff *skb);
|
|
||||||
|
|
||||||
struct inet_frags_ctl;
|
|
||||||
|
|
||||||
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
|
|
||||||
index 2c3d0f5..a75022e 100644
|
|
||||||
--- a/net/core/skbuff.c
|
|
||||||
+++ b/net/core/skbuff.c
|
|
||||||
@@ -580,9 +580,6 @@ static void skb_release_head_state(struct sk_buff *skb)
|
|
||||||
#if IS_ENABLED(CONFIG_NF_CONNTRACK)
|
|
||||||
nf_conntrack_put(skb->nfct);
|
|
||||||
#endif
|
|
||||||
-#ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
|
|
||||||
- nf_conntrack_put_reasm(skb->nfct_reasm);
|
|
||||||
-#endif
|
|
||||||
#ifdef CONFIG_BRIDGE_NETFILTER
|
|
||||||
nf_bridge_put(skb->nf_bridge);
|
|
||||||
#endif
|
|
||||||
diff --git a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
|
|
||||||
index c9b6a6e..97cd750 100644
|
|
||||||
--- a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
|
|
||||||
+++ b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
|
|
||||||
@@ -172,63 +172,13 @@ out:
|
|
||||||
return nf_conntrack_confirm(skb);
|
|
||||||
}
|
|
||||||
|
|
||||||
-static unsigned int __ipv6_conntrack_in(struct net *net,
|
|
||||||
- unsigned int hooknum,
|
|
||||||
- struct sk_buff *skb,
|
|
||||||
- const struct net_device *in,
|
|
||||||
- const struct net_device *out,
|
|
||||||
- int (*okfn)(struct sk_buff *))
|
|
||||||
-{
|
|
||||||
- struct sk_buff *reasm = skb->nfct_reasm;
|
|
||||||
- const struct nf_conn_help *help;
|
|
||||||
- struct nf_conn *ct;
|
|
||||||
- enum ip_conntrack_info ctinfo;
|
|
||||||
-
|
|
||||||
- /* This packet is fragmented and has reassembled packet. */
|
|
||||||
- if (reasm) {
|
|
||||||
- /* Reassembled packet isn't parsed yet ? */
|
|
||||||
- if (!reasm->nfct) {
|
|
||||||
- unsigned int ret;
|
|
||||||
-
|
|
||||||
- ret = nf_conntrack_in(net, PF_INET6, hooknum, reasm);
|
|
||||||
- if (ret != NF_ACCEPT)
|
|
||||||
- return ret;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- /* Conntrack helpers need the entire reassembled packet in the
|
|
||||||
- * POST_ROUTING hook. In case of unconfirmed connections NAT
|
|
||||||
- * might reassign a helper, so the entire packet is also
|
|
||||||
- * required.
|
|
||||||
- */
|
|
||||||
- ct = nf_ct_get(reasm, &ctinfo);
|
|
||||||
- if (ct != NULL && !nf_ct_is_untracked(ct)) {
|
|
||||||
- help = nfct_help(ct);
|
|
||||||
- if ((help && help->helper) || !nf_ct_is_confirmed(ct)) {
|
|
||||||
- nf_conntrack_get_reasm(reasm);
|
|
||||||
- NF_HOOK_THRESH(NFPROTO_IPV6, hooknum, reasm,
|
|
||||||
- (struct net_device *)in,
|
|
||||||
- (struct net_device *)out,
|
|
||||||
- okfn, NF_IP6_PRI_CONNTRACK + 1);
|
|
||||||
- return NF_DROP_ERR(-ECANCELED);
|
|
||||||
- }
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- nf_conntrack_get(reasm->nfct);
|
|
||||||
- skb->nfct = reasm->nfct;
|
|
||||||
- skb->nfctinfo = reasm->nfctinfo;
|
|
||||||
- return NF_ACCEPT;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- return nf_conntrack_in(net, PF_INET6, hooknum, skb);
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
static unsigned int ipv6_conntrack_in(unsigned int hooknum,
|
|
||||||
struct sk_buff *skb,
|
|
||||||
const struct net_device *in,
|
|
||||||
const struct net_device *out,
|
|
||||||
int (*okfn)(struct sk_buff *))
|
|
||||||
{
|
|
||||||
- return __ipv6_conntrack_in(dev_net(in), hooknum, skb, in, out, okfn);
|
|
||||||
+ return nf_conntrack_in(dev_net(in), PF_INET6, hooknum, skb);
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned int ipv6_conntrack_local(unsigned int hooknum,
|
|
||||||
@@ -242,7 +192,7 @@ static unsigned int ipv6_conntrack_local(unsigned int hooknum,
|
|
||||||
net_notice_ratelimited("ipv6_conntrack_local: packet too short\n");
|
|
||||||
return NF_ACCEPT;
|
|
||||||
}
|
|
||||||
- return __ipv6_conntrack_in(dev_net(out), hooknum, skb, in, out, okfn);
|
|
||||||
+ return nf_conntrack_in(dev_net(out), PF_INET6, hooknum, skb);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct nf_hook_ops ipv6_conntrack_ops[] __read_mostly = {
|
|
||||||
diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c
|
|
||||||
index dffdc1a..253566a 100644
|
|
||||||
--- a/net/ipv6/netfilter/nf_conntrack_reasm.c
|
|
||||||
+++ b/net/ipv6/netfilter/nf_conntrack_reasm.c
|
|
||||||
@@ -621,31 +621,16 @@ ret_orig:
|
|
||||||
return skb;
|
|
||||||
}
|
|
||||||
|
|
||||||
-void nf_ct_frag6_output(unsigned int hooknum, struct sk_buff *skb,
|
|
||||||
- struct net_device *in, struct net_device *out,
|
|
||||||
- int (*okfn)(struct sk_buff *))
|
|
||||||
+void nf_ct_frag6_consume_orig(struct sk_buff *skb)
|
|
||||||
{
|
|
||||||
struct sk_buff *s, *s2;
|
|
||||||
- unsigned int ret = 0;
|
|
||||||
|
|
||||||
for (s = NFCT_FRAG6_CB(skb)->orig; s;) {
|
|
||||||
- nf_conntrack_put_reasm(s->nfct_reasm);
|
|
||||||
- nf_conntrack_get_reasm(skb);
|
|
||||||
- s->nfct_reasm = skb;
|
|
||||||
-
|
|
||||||
s2 = s->next;
|
|
||||||
s->next = NULL;
|
|
||||||
-
|
|
||||||
- if (ret != -ECANCELED)
|
|
||||||
- ret = NF_HOOK_THRESH(NFPROTO_IPV6, hooknum, s,
|
|
||||||
- in, out, okfn,
|
|
||||||
- NF_IP6_PRI_CONNTRACK_DEFRAG + 1);
|
|
||||||
- else
|
|
||||||
- kfree_skb(s);
|
|
||||||
-
|
|
||||||
+ consume_skb(s);
|
|
||||||
s = s2;
|
|
||||||
}
|
|
||||||
- nf_conntrack_put_reasm(skb);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int nf_ct_net_init(struct net *net)
|
|
||||||
diff --git a/net/ipv6/netfilter/nf_defrag_ipv6_hooks.c b/net/ipv6/netfilter/nf_defrag_ipv6_hooks.c
|
|
||||||
index aacd121..581dd9e 100644
|
|
||||||
--- a/net/ipv6/netfilter/nf_defrag_ipv6_hooks.c
|
|
||||||
+++ b/net/ipv6/netfilter/nf_defrag_ipv6_hooks.c
|
|
||||||
@@ -75,8 +75,11 @@ static unsigned int ipv6_defrag(unsigned int hooknum,
|
|
||||||
if (reasm == skb)
|
|
||||||
return NF_ACCEPT;
|
|
||||||
|
|
||||||
- nf_ct_frag6_output(hooknum, reasm, (struct net_device *)in,
|
|
||||||
- (struct net_device *)out, okfn);
|
|
||||||
+ nf_ct_frag6_consume_orig(reasm);
|
|
||||||
+
|
|
||||||
+ NF_HOOK_THRESH(NFPROTO_IPV6, hooknum, reasm,
|
|
||||||
+ (struct net_device *) in, (struct net_device *) out,
|
|
||||||
+ okfn, NF_IP6_PRI_CONNTRACK_DEFRAG + 1);
|
|
||||||
|
|
||||||
return NF_STOLEN;
|
|
||||||
}
|
|
||||||
diff --git a/net/netfilter/ipvs/ip_vs_core.c b/net/netfilter/ipvs/ip_vs_core.c
|
|
||||||
index 4f69e83..1517b50 100644
|
|
||||||
--- a/net/netfilter/ipvs/ip_vs_core.c
|
|
||||||
+++ b/net/netfilter/ipvs/ip_vs_core.c
|
|
||||||
@@ -1131,12 +1131,6 @@ ip_vs_out(unsigned int hooknum, struct sk_buff *skb, int af)
|
|
||||||
ip_vs_fill_iph_skb(af, skb, &iph);
|
|
||||||
#ifdef CONFIG_IP_VS_IPV6
|
|
||||||
if (af == AF_INET6) {
|
|
||||||
- if (!iph.fragoffs && skb_nfct_reasm(skb)) {
|
|
||||||
- struct sk_buff *reasm = skb_nfct_reasm(skb);
|
|
||||||
- /* Save fw mark for coming frags */
|
|
||||||
- reasm->ipvs_property = 1;
|
|
||||||
- reasm->mark = skb->mark;
|
|
||||||
- }
|
|
||||||
if (unlikely(iph.protocol == IPPROTO_ICMPV6)) {
|
|
||||||
int related;
|
|
||||||
int verdict = ip_vs_out_icmp_v6(skb, &related,
|
|
||||||
@@ -1606,12 +1600,6 @@ ip_vs_in(unsigned int hooknum, struct sk_buff *skb, int af)
|
|
||||||
|
|
||||||
#ifdef CONFIG_IP_VS_IPV6
|
|
||||||
if (af == AF_INET6) {
|
|
||||||
- if (!iph.fragoffs && skb_nfct_reasm(skb)) {
|
|
||||||
- struct sk_buff *reasm = skb_nfct_reasm(skb);
|
|
||||||
- /* Save fw mark for coming frags. */
|
|
||||||
- reasm->ipvs_property = 1;
|
|
||||||
- reasm->mark = skb->mark;
|
|
||||||
- }
|
|
||||||
if (unlikely(iph.protocol == IPPROTO_ICMPV6)) {
|
|
||||||
int related;
|
|
||||||
int verdict = ip_vs_in_icmp_v6(skb, &related, hooknum,
|
|
||||||
@@ -1663,9 +1651,8 @@ ip_vs_in(unsigned int hooknum, struct sk_buff *skb, int af)
|
|
||||||
/* sorry, all this trouble for a no-hit :) */
|
|
||||||
IP_VS_DBG_PKT(12, af, pp, skb, 0,
|
|
||||||
"ip_vs_in: packet continues traversal as normal");
|
|
||||||
- if (iph.fragoffs && !skb_nfct_reasm(skb)) {
|
|
||||||
+ if (iph.fragoffs) {
|
|
||||||
/* Fragment that couldn't be mapped to a conn entry
|
|
||||||
- * and don't have any pointer to a reasm skb
|
|
||||||
* is missing module nf_defrag_ipv6
|
|
||||||
*/
|
|
||||||
IP_VS_DBG_RL("Unhandled frag, load nf_defrag_ipv6\n");
|
|
||||||
@@ -1748,38 +1735,6 @@ ip_vs_local_request4(unsigned int hooknum, struct sk_buff *skb,
|
|
||||||
#ifdef CONFIG_IP_VS_IPV6
|
|
||||||
|
|
||||||
/*
|
|
||||||
- * AF_INET6 fragment handling
|
|
||||||
- * Copy info from first fragment, to the rest of them.
|
|
||||||
- */
|
|
||||||
-static unsigned int
|
|
||||||
-ip_vs_preroute_frag6(unsigned int hooknum, struct sk_buff *skb,
|
|
||||||
- const struct net_device *in,
|
|
||||||
- const struct net_device *out,
|
|
||||||
- int (*okfn)(struct sk_buff *))
|
|
||||||
-{
|
|
||||||
- struct sk_buff *reasm = skb_nfct_reasm(skb);
|
|
||||||
- struct net *net;
|
|
||||||
-
|
|
||||||
- /* Skip if not a "replay" from nf_ct_frag6_output or first fragment.
|
|
||||||
- * ipvs_property is set when checking first fragment
|
|
||||||
- * in ip_vs_in() and ip_vs_out().
|
|
||||||
- */
|
|
||||||
- if (reasm)
|
|
||||||
- IP_VS_DBG(2, "Fragment recv prop:%d\n", reasm->ipvs_property);
|
|
||||||
- if (!reasm || !reasm->ipvs_property)
|
|
||||||
- return NF_ACCEPT;
|
|
||||||
-
|
|
||||||
- net = skb_net(skb);
|
|
||||||
- if (!net_ipvs(net)->enable)
|
|
||||||
- return NF_ACCEPT;
|
|
||||||
-
|
|
||||||
- /* Copy stored fw mark, saved in ip_vs_{in,out} */
|
|
||||||
- skb->mark = reasm->mark;
|
|
||||||
-
|
|
||||||
- return NF_ACCEPT;
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-/*
|
|
||||||
* AF_INET6 handler in NF_INET_LOCAL_IN chain
|
|
||||||
* Schedule and forward packets from remote clients
|
|
||||||
*/
|
|
||||||
@@ -1916,14 +1871,6 @@ static struct nf_hook_ops ip_vs_ops[] __read_mostly = {
|
|
||||||
.priority = 100,
|
|
||||||
},
|
|
||||||
#ifdef CONFIG_IP_VS_IPV6
|
|
||||||
- /* After mangle & nat fetch 2:nd fragment and following */
|
|
||||||
- {
|
|
||||||
- .hook = ip_vs_preroute_frag6,
|
|
||||||
- .owner = THIS_MODULE,
|
|
||||||
- .pf = NFPROTO_IPV6,
|
|
||||||
- .hooknum = NF_INET_PRE_ROUTING,
|
|
||||||
- .priority = NF_IP6_PRI_NAT_DST + 1,
|
|
||||||
- },
|
|
||||||
/* After packet filtering, change source only for VS/NAT */
|
|
||||||
{
|
|
||||||
.hook = ip_vs_reply6,
|
|
||||||
diff --git a/net/netfilter/ipvs/ip_vs_pe_sip.c b/net/netfilter/ipvs/ip_vs_pe_sip.c
|
|
||||||
index 9ef22bd..bed5f70 100644
|
|
||||||
--- a/net/netfilter/ipvs/ip_vs_pe_sip.c
|
|
||||||
+++ b/net/netfilter/ipvs/ip_vs_pe_sip.c
|
|
||||||
@@ -65,7 +65,6 @@ static int get_callid(const char *dptr, unsigned int dataoff,
|
|
||||||
static int
|
|
||||||
ip_vs_sip_fill_param(struct ip_vs_conn_param *p, struct sk_buff *skb)
|
|
||||||
{
|
|
||||||
- struct sk_buff *reasm = skb_nfct_reasm(skb);
|
|
||||||
struct ip_vs_iphdr iph;
|
|
||||||
unsigned int dataoff, datalen, matchoff, matchlen;
|
|
||||||
const char *dptr;
|
|
||||||
@@ -79,15 +78,10 @@ ip_vs_sip_fill_param(struct ip_vs_conn_param *p, struct sk_buff *skb)
|
|
||||||
/* todo: IPv6 fragments:
|
|
||||||
* I think this only should be done for the first fragment. /HS
|
|
||||||
*/
|
|
||||||
- if (reasm) {
|
|
||||||
- skb = reasm;
|
|
||||||
- dataoff = iph.thoff_reasm + sizeof(struct udphdr);
|
|
||||||
- } else
|
|
||||||
- dataoff = iph.len + sizeof(struct udphdr);
|
|
||||||
+ dataoff = iph.len + sizeof(struct udphdr);
|
|
||||||
|
|
||||||
if (dataoff >= skb->len)
|
|
||||||
return -EINVAL;
|
|
||||||
- /* todo: Check if this will mess-up the reasm skb !!! /HS */
|
|
||||||
retc = skb_linearize(skb);
|
|
||||||
if (retc < 0)
|
|
||||||
return retc;
|
|
||||||
--
|
|
||||||
1.8.3.1
|
|
||||||
|
|
@ -1,173 +0,0 @@
|
|||||||
Bugzilla: 1010679
|
|
||||||
Upstream-status: 3.13
|
|
||||||
|
|
||||||
From 908171aa738b5bbcc6241cec46f73fcd57dd00d4 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Pierre Ossman <pierre@ossman.eu>
|
|
||||||
Date: Wed, 6 Nov 2013 20:00:32 +0100
|
|
||||||
Subject: [PATCH 1/2] drm/radeon/audio: correct ACR table
|
|
||||||
|
|
||||||
The values were taken from the HDMI spec, but they assumed
|
|
||||||
exact x/1.001 clocks. Since we round the clocks, we also need
|
|
||||||
to calculate different N and CTS values.
|
|
||||||
|
|
||||||
Note that the N for 25.2/1.001 MHz at 44.1 kHz audio is out of
|
|
||||||
spec. Hopefully this mode is rarely used and/or HDMI sinks
|
|
||||||
tolerate overly large values of N.
|
|
||||||
|
|
||||||
bug:
|
|
||||||
https://bugs.freedesktop.org/show_bug.cgi?id=69675
|
|
||||||
|
|
||||||
Signed-off-by: Pierre Ossman <pierre@ossman.eu>
|
|
||||||
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
|
|
||||||
---
|
|
||||||
drivers/gpu/drm/radeon/r600_hdmi.c | 6 +++---
|
|
||||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c
|
|
||||||
index 4140fe8..e8ca095 100644
|
|
||||||
--- a/drivers/gpu/drm/radeon/r600_hdmi.c
|
|
||||||
+++ b/drivers/gpu/drm/radeon/r600_hdmi.c
|
|
||||||
@@ -57,15 +57,15 @@ enum r600_hdmi_iec_status_bits {
|
|
||||||
static const struct radeon_hdmi_acr r600_hdmi_predefined_acr[] = {
|
|
||||||
/* 32kHz 44.1kHz 48kHz */
|
|
||||||
/* Clock N CTS N CTS N CTS */
|
|
||||||
- { 25175, 4576, 28125, 7007, 31250, 6864, 28125 }, /* 25,20/1.001 MHz */
|
|
||||||
+ { 25175, 4096, 25175, 28224, 125875, 6144, 25175 }, /* 25,20/1.001 MHz */
|
|
||||||
{ 25200, 4096, 25200, 6272, 28000, 6144, 25200 }, /* 25.20 MHz */
|
|
||||||
{ 27000, 4096, 27000, 6272, 30000, 6144, 27000 }, /* 27.00 MHz */
|
|
||||||
{ 27027, 4096, 27027, 6272, 30030, 6144, 27027 }, /* 27.00*1.001 MHz */
|
|
||||||
{ 54000, 4096, 54000, 6272, 60000, 6144, 54000 }, /* 54.00 MHz */
|
|
||||||
{ 54054, 4096, 54054, 6272, 60060, 6144, 54054 }, /* 54.00*1.001 MHz */
|
|
||||||
- { 74176, 11648, 210937, 17836, 234375, 11648, 140625 }, /* 74.25/1.001 MHz */
|
|
||||||
+ { 74176, 4096, 74176, 5733, 75335, 6144, 74176 }, /* 74.25/1.001 MHz */
|
|
||||||
{ 74250, 4096, 74250, 6272, 82500, 6144, 74250 }, /* 74.25 MHz */
|
|
||||||
- { 148352, 11648, 421875, 8918, 234375, 5824, 140625 }, /* 148.50/1.001 MHz */
|
|
||||||
+ { 148352, 4096, 148352, 5733, 150670, 6144, 148352 }, /* 148.50/1.001 MHz */
|
|
||||||
{ 148500, 4096, 148500, 6272, 165000, 6144, 148500 }, /* 148.50 MHz */
|
|
||||||
{ 0, 4096, 0, 6272, 0, 6144, 0 } /* Other */
|
|
||||||
};
|
|
||||||
--
|
|
||||||
1.8.3.1
|
|
||||||
|
|
||||||
|
|
||||||
From 05e4776357fe7217e531cbaaa163e24f688d10ce Mon Sep 17 00:00:00 2001
|
|
||||||
From: Pierre Ossman <pierre@ossman.eu>
|
|
||||||
Date: Wed, 6 Nov 2013 20:09:08 +0100
|
|
||||||
Subject: [PATCH 2/2] drm/radeon/audio: improve ACR calculation
|
|
||||||
|
|
||||||
In order to have any realistic chance of calculating proper
|
|
||||||
ACR values, we need to be able to calculate both N and CTS,
|
|
||||||
not just CTS. We still aim for the ideal N as specified in
|
|
||||||
the HDMI spec though.
|
|
||||||
|
|
||||||
bug:
|
|
||||||
https://bugs.freedesktop.org/show_bug.cgi?id=69675
|
|
||||||
|
|
||||||
Signed-off-by: Pierre Ossman <pierre@ossman.eu>
|
|
||||||
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
|
|
||||||
---
|
|
||||||
drivers/gpu/drm/radeon/r600_hdmi.c | 68 ++++++++++++++++++++++++++------------
|
|
||||||
1 file changed, 46 insertions(+), 22 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c
|
|
||||||
index e8ca095..92c6df7 100644
|
|
||||||
--- a/drivers/gpu/drm/radeon/r600_hdmi.c
|
|
||||||
+++ b/drivers/gpu/drm/radeon/r600_hdmi.c
|
|
||||||
@@ -24,6 +24,7 @@
|
|
||||||
* Authors: Christian König
|
|
||||||
*/
|
|
||||||
#include <linux/hdmi.h>
|
|
||||||
+#include <linux/gcd.h>
|
|
||||||
#include <drm/drmP.h>
|
|
||||||
#include <drm/radeon_drm.h>
|
|
||||||
#include "radeon.h"
|
|
||||||
@@ -67,25 +68,47 @@ static const struct radeon_hdmi_acr r600_hdmi_predefined_acr[] = {
|
|
||||||
{ 74250, 4096, 74250, 6272, 82500, 6144, 74250 }, /* 74.25 MHz */
|
|
||||||
{ 148352, 4096, 148352, 5733, 150670, 6144, 148352 }, /* 148.50/1.001 MHz */
|
|
||||||
{ 148500, 4096, 148500, 6272, 165000, 6144, 148500 }, /* 148.50 MHz */
|
|
||||||
- { 0, 4096, 0, 6272, 0, 6144, 0 } /* Other */
|
|
||||||
};
|
|
||||||
|
|
||||||
+
|
|
||||||
/*
|
|
||||||
- * calculate CTS value if it's not found in the table
|
|
||||||
+ * calculate CTS and N values if they are not found in the table
|
|
||||||
*/
|
|
||||||
-static void r600_hdmi_calc_cts(uint32_t clock, int *CTS, int N, int freq)
|
|
||||||
+static void r600_hdmi_calc_cts(uint32_t clock, int *CTS, int *N, int freq)
|
|
||||||
{
|
|
||||||
- u64 n;
|
|
||||||
- u32 d;
|
|
||||||
-
|
|
||||||
- if (*CTS == 0) {
|
|
||||||
- n = (u64)clock * (u64)N * 1000ULL;
|
|
||||||
- d = 128 * freq;
|
|
||||||
- do_div(n, d);
|
|
||||||
- *CTS = n;
|
|
||||||
- }
|
|
||||||
- DRM_DEBUG("Using ACR timing N=%d CTS=%d for frequency %d\n",
|
|
||||||
- N, *CTS, freq);
|
|
||||||
+ int n, cts;
|
|
||||||
+ unsigned long div, mul;
|
|
||||||
+
|
|
||||||
+ /* Safe, but overly large values */
|
|
||||||
+ n = 128 * freq;
|
|
||||||
+ cts = clock * 1000;
|
|
||||||
+
|
|
||||||
+ /* Smallest valid fraction */
|
|
||||||
+ div = gcd(n, cts);
|
|
||||||
+
|
|
||||||
+ n /= div;
|
|
||||||
+ cts /= div;
|
|
||||||
+
|
|
||||||
+ /*
|
|
||||||
+ * The optimal N is 128*freq/1000. Calculate the closest larger
|
|
||||||
+ * value that doesn't truncate any bits.
|
|
||||||
+ */
|
|
||||||
+ mul = ((128*freq/1000) + (n-1))/n;
|
|
||||||
+
|
|
||||||
+ n *= mul;
|
|
||||||
+ cts *= mul;
|
|
||||||
+
|
|
||||||
+ /* Check that we are in spec (not always possible) */
|
|
||||||
+ if (n < (128*freq/1500))
|
|
||||||
+ printk(KERN_WARNING "Calculated ACR N value is too small. You may experience audio problems.\n");
|
|
||||||
+ if (n > (128*freq/300))
|
|
||||||
+ printk(KERN_WARNING "Calculated ACR N value is too large. You may experience audio problems.\n");
|
|
||||||
+
|
|
||||||
+ *N = n;
|
|
||||||
+ *CTS = cts;
|
|
||||||
+
|
|
||||||
+ DRM_DEBUG("Calculated ACR timing N=%d CTS=%d for frequency %d\n",
|
|
||||||
+ *N, *CTS, freq);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct radeon_hdmi_acr r600_hdmi_acr(uint32_t clock)
|
|
||||||
@@ -93,15 +116,16 @@ struct radeon_hdmi_acr r600_hdmi_acr(uint32_t clock)
|
|
||||||
struct radeon_hdmi_acr res;
|
|
||||||
u8 i;
|
|
||||||
|
|
||||||
- for (i = 0; r600_hdmi_predefined_acr[i].clock != clock &&
|
|
||||||
- r600_hdmi_predefined_acr[i].clock != 0; i++)
|
|
||||||
- ;
|
|
||||||
- res = r600_hdmi_predefined_acr[i];
|
|
||||||
+ /* Precalculated values for common clocks */
|
|
||||||
+ for (i = 0; i < ARRAY_SIZE(r600_hdmi_predefined_acr); i++) {
|
|
||||||
+ if (r600_hdmi_predefined_acr[i].clock == clock)
|
|
||||||
+ return r600_hdmi_predefined_acr[i];
|
|
||||||
+ }
|
|
||||||
|
|
||||||
- /* In case some CTS are missing */
|
|
||||||
- r600_hdmi_calc_cts(clock, &res.cts_32khz, res.n_32khz, 32000);
|
|
||||||
- r600_hdmi_calc_cts(clock, &res.cts_44_1khz, res.n_44_1khz, 44100);
|
|
||||||
- r600_hdmi_calc_cts(clock, &res.cts_48khz, res.n_48khz, 48000);
|
|
||||||
+ /* And odd clocks get manually calculated */
|
|
||||||
+ r600_hdmi_calc_cts(clock, &res.cts_32khz, &res.n_32khz, 32000);
|
|
||||||
+ r600_hdmi_calc_cts(clock, &res.cts_44_1khz, &res.n_44_1khz, 44100);
|
|
||||||
+ r600_hdmi_calc_cts(clock, &res.cts_48khz, &res.n_48khz, 48000);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
--
|
|
||||||
1.8.3.1
|
|
||||||
|
|
@ -1,163 +0,0 @@
|
|||||||
Bugzilla: 902012
|
|
||||||
Upstream-status: 3.13
|
|
||||||
Delivered-To: jwboyer@gmail.com
|
|
||||||
Received: by 10.76.168.104 with SMTP id zv8csp55663oab;
|
|
||||||
Fri, 30 Aug 2013 15:52:46 -0700 (PDT)
|
|
||||||
X-Received: by 10.68.244.168 with SMTP id xh8mr12419215pbc.3.1377903166373;
|
|
||||||
Fri, 30 Aug 2013 15:52:46 -0700 (PDT)
|
|
||||||
Return-Path: <linux-kernel-owner@vger.kernel.org>
|
|
||||||
Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67])
|
|
||||||
by mx.google.com with ESMTP id qc9si280431pac.269.1969.12.31.16.00.00;
|
|
||||||
Fri, 30 Aug 2013 15:52:46 -0700 (PDT)
|
|
||||||
Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67;
|
|
||||||
Authentication-Results: mx.google.com;
|
|
||||||
spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mail=linux-kernel-owner@vger.kernel.org;
|
|
||||||
dkim=neutral (bad format) header.i=@hds.com
|
|
||||||
Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand
|
|
||||||
id S1753535Ab3H3WrV (ORCPT <rfc822;georgezhim@gmail.com>
|
|
||||||
+ 99 others); Fri, 30 Aug 2013 18:47:21 -0400
|
|
||||||
Received: from usindpps04.hds.com ([207.126.252.17]:35636 "EHLO
|
|
||||||
usindpps04.hds.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org
|
|
||||||
with ESMTP id S1752650Ab3H3WrU (ORCPT
|
|
||||||
<rfc822;linux-kernel@vger.kernel.org>);
|
|
||||||
Fri, 30 Aug 2013 18:47:20 -0400
|
|
||||||
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=hds.com; h=subject : to : from : cc
|
|
||||||
: date : message-id : mime-version : content-type :
|
|
||||||
content-transfer-encoding; s=mail1;
|
|
||||||
bh=VofHN8IMnygn2hbqnFjLmX0PPEPbvpzE377u1RxpGOY=;
|
|
||||||
b=piW6J78W57qDXBPJJuodWw/tvf0T//JbxKX6sLPvpuaOG2nBLMHzDqUeTYwFEQqUvdmf
|
|
||||||
ZTkiwsKi0WEku3MKcxJ7veR7wvTZcQ4fGMETFTf1c2J/1JOKpXLnft4ERuW89/FAxw25
|
|
||||||
wQM1ulsuQ3Cncl0I/sIaqMlaMOtvuQ/C8rsHorp+75eFiL6yx1jU5wMbuti4D/NprIET
|
|
||||||
3r57cPZ0YCh6sLjvOgjay6mKyktMToyjHPx6X1TWCSWcwes33Popc1hpadxUdFI/0npL
|
|
||||||
mN3Tttbe7e2RcmkXAZbwg8xj+FwSu3nIRC4G9UpFCsMz518C/AWZj4puwWE6VHZWVvVZ Rg==
|
|
||||||
Received: from usindmail01.hds.com (usindmail03 [207.126.252.22])
|
|
||||||
by usindpps04.hds.com (8.14.5/8.14.5) with ESMTP id r7UMlBjr025492;
|
|
||||||
Fri, 30 Aug 2013 18:47:11 -0400
|
|
||||||
Received: from hds.com (usindnetf5d-vlan47float.corp.hds.com [10.74.73.11])
|
|
||||||
by usindmail01.hds.com (8.14.1/8.14.1) with ESMTP id r7UMl8SG058466;
|
|
||||||
Fri, 30 Aug 2013 18:47:10 -0400 (EDT)
|
|
||||||
Subject: [PATCH v2 1/2] elevator: Fix a race in elevator switching and md
|
|
||||||
device initialization
|
|
||||||
To: linux-kernel@vger.kernel.org
|
|
||||||
From: Tomoki Sekiyama <tomoki.sekiyama@hds.com>
|
|
||||||
Cc: axboe@kernel.dk, tj@kernel.org, seiji.aguchi@hds.com,
|
|
||||||
vgoyal@redhat.com, majianpeng@gmail.com
|
|
||||||
Date: Fri, 30 Aug 2013 18:47:07 -0400
|
|
||||||
Message-ID: <20130830224707.21812.63516.stgit@hds.com>
|
|
||||||
User-Agent: StGit/0.16
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset="utf-8"
|
|
||||||
Content-Transfer-Encoding: 7bit
|
|
||||||
X-Proofpoint-SPF-Result: pass
|
|
||||||
X-Proofpoint-SPF-Record: v=spf1 mx ip4:207.126.244.0/26 ip4:207.126.252.0/25 include:mktomail.com
|
|
||||||
include:cloud.hds.com ~all
|
|
||||||
X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.10.8794,1.0.431,0.0.0000
|
|
||||||
definitions=2013-08-30_09:2013-08-30,2013-08-30,1970-01-01 signatures=0
|
|
||||||
X-Proofpoint-Spam-Details: rule=notspam policy=outbound_policy score=0 spamscore=0 suspectscore=1
|
|
||||||
phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx
|
|
||||||
scancount=1 engine=7.0.1-1305240000 definitions=main-1308300162
|
|
||||||
Sender: linux-kernel-owner@vger.kernel.org
|
|
||||||
Precedence: bulk
|
|
||||||
List-ID: <linux-kernel.vger.kernel.org>
|
|
||||||
X-Mailing-List: linux-kernel@vger.kernel.org
|
|
||||||
|
|
||||||
The soft lockup below happens at the boot time of the system using dm
|
|
||||||
multipath and the udev rules to switch scheduler.
|
|
||||||
|
|
||||||
[ 356.127001] BUG: soft lockup - CPU#3 stuck for 22s! [sh:483]
|
|
||||||
[ 356.127001] RIP: 0010:[<ffffffff81072a7d>] [<ffffffff81072a7d>] lock_timer_base.isra.35+0x1d/0x50
|
|
||||||
...
|
|
||||||
[ 356.127001] Call Trace:
|
|
||||||
[ 356.127001] [<ffffffff81073810>] try_to_del_timer_sync+0x20/0x70
|
|
||||||
[ 356.127001] [<ffffffff8118b08a>] ? kmem_cache_alloc_node_trace+0x20a/0x230
|
|
||||||
[ 356.127001] [<ffffffff810738b2>] del_timer_sync+0x52/0x60
|
|
||||||
[ 356.127001] [<ffffffff812ece22>] cfq_exit_queue+0x32/0xf0
|
|
||||||
[ 356.127001] [<ffffffff812c98df>] elevator_exit+0x2f/0x50
|
|
||||||
[ 356.127001] [<ffffffff812c9f21>] elevator_change+0xf1/0x1c0
|
|
||||||
[ 356.127001] [<ffffffff812caa50>] elv_iosched_store+0x20/0x50
|
|
||||||
[ 356.127001] [<ffffffff812d1d09>] queue_attr_store+0x59/0xb0
|
|
||||||
[ 356.127001] [<ffffffff812143f6>] sysfs_write_file+0xc6/0x140
|
|
||||||
[ 356.127001] [<ffffffff811a326d>] vfs_write+0xbd/0x1e0
|
|
||||||
[ 356.127001] [<ffffffff811a3ca9>] SyS_write+0x49/0xa0
|
|
||||||
[ 356.127001] [<ffffffff8164e899>] system_call_fastpath+0x16/0x1b
|
|
||||||
|
|
||||||
This is caused by a race between md device initialization by multipathd and
|
|
||||||
shell script to switch the scheduler using sysfs.
|
|
||||||
|
|
||||||
- multipathd:
|
|
||||||
SyS_ioctl -> do_vfs_ioctl -> dm_ctl_ioctl -> ctl_ioctl -> table_load
|
|
||||||
-> dm_setup_md_queue -> blk_init_allocated_queue -> elevator_init
|
|
||||||
q->elevator = elevator_alloc(q, e); // not yet initialized
|
|
||||||
|
|
||||||
- sh -c 'echo deadline > /sys/$DEVPATH/queue/scheduler':
|
|
||||||
elevator_switch (in the call trace above)
|
|
||||||
struct elevator_queue *old = q->elevator;
|
|
||||||
q->elevator = elevator_alloc(q, new_e);
|
|
||||||
elevator_exit(old); // lockup! (*)
|
|
||||||
|
|
||||||
- multipathd: (cont.)
|
|
||||||
err = e->ops.elevator_init_fn(q); // init fails; q->elevator is modified
|
|
||||||
|
|
||||||
(*) When del_timer_sync() is called, lock_timer_base() will loop infinitely
|
|
||||||
while timer->base == NULL. In this case, as timer will never initialized,
|
|
||||||
it results in lockup.
|
|
||||||
|
|
||||||
This patch introduces acquisition of q->sysfs_lock around elevator_init()
|
|
||||||
into blk_init_allocated_queue(), to provide mutual exclusion between
|
|
||||||
initialization of the q->scheduler and switching of the scheduler.
|
|
||||||
|
|
||||||
This should fix this bugzilla:
|
|
||||||
https://bugzilla.redhat.com/show_bug.cgi?id=902012
|
|
||||||
|
|
||||||
Signed-off-by: Tomoki Sekiyama <tomoki.sekiyama@hds.com>
|
|
||||||
---
|
|
||||||
block/blk-core.c | 10 +++++++++-
|
|
||||||
block/elevator.c | 6 ++++++
|
|
||||||
2 files changed, 15 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/block/blk-core.c b/block/blk-core.c
|
|
||||||
index 93a18d1..2f6275f 100644
|
|
||||||
--- a/block/blk-core.c
|
|
||||||
+++ b/block/blk-core.c
|
|
||||||
@@ -739,9 +739,17 @@ blk_init_allocated_queue(struct request_queue *q, request_fn_proc *rfn,
|
|
||||||
|
|
||||||
q->sg_reserved_size = INT_MAX;
|
|
||||||
|
|
||||||
+ /* Protect q->elevator from elevator_change */
|
|
||||||
+ mutex_lock(&q->sysfs_lock);
|
|
||||||
+
|
|
||||||
/* init elevator */
|
|
||||||
- if (elevator_init(q, NULL))
|
|
||||||
+ if (elevator_init(q, NULL)) {
|
|
||||||
+ mutex_unlock(&q->sysfs_lock);
|
|
||||||
return NULL;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ mutex_unlock(&q->sysfs_lock);
|
|
||||||
+
|
|
||||||
return q;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(blk_init_allocated_queue);
|
|
||||||
diff --git a/block/elevator.c b/block/elevator.c
|
|
||||||
index 668394d..02d4390 100644
|
|
||||||
--- a/block/elevator.c
|
|
||||||
+++ b/block/elevator.c
|
|
||||||
@@ -186,6 +186,12 @@ int elevator_init(struct request_queue *q, char *name)
|
|
||||||
struct elevator_type *e = NULL;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
+ /*
|
|
||||||
+ * q->sysfs_lock must be held to provide mutual exclusion between
|
|
||||||
+ * elevator_switch() and here.
|
|
||||||
+ */
|
|
||||||
+ lockdep_assert_held(&q->sysfs_lock);
|
|
||||||
+
|
|
||||||
if (unlikely(q->elevator))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
|
|
||||||
the body of a message to majordomo@vger.kernel.org
|
|
||||||
More majordomo info at http://vger.kernel.org/majordomo-info.html
|
|
||||||
Please read the FAQ at http://www.tux.org/lkml/
|
|
@ -1,122 +0,0 @@
|
|||||||
Bugzilla: 902012
|
|
||||||
Upstream-status: 3.13
|
|
||||||
Delivered-To: jwboyer@gmail.com
|
|
||||||
Received: by 10.76.168.104 with SMTP id zv8csp55623oab;
|
|
||||||
Fri, 30 Aug 2013 15:51:42 -0700 (PDT)
|
|
||||||
X-Received: by 10.67.30.70 with SMTP id kc6mr13149193pad.32.1377903101609;
|
|
||||||
Fri, 30 Aug 2013 15:51:41 -0700 (PDT)
|
|
||||||
Return-Path: <linux-kernel-owner@vger.kernel.org>
|
|
||||||
Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67])
|
|
||||||
by mx.google.com with ESMTP id gg2si304840pac.217.1969.12.31.16.00.00;
|
|
||||||
Fri, 30 Aug 2013 15:51:41 -0700 (PDT)
|
|
||||||
Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67;
|
|
||||||
Authentication-Results: mx.google.com;
|
|
||||||
spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mail=linux-kernel-owner@vger.kernel.org;
|
|
||||||
dkim=neutral (bad format) header.i=@hds.com
|
|
||||||
Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand
|
|
||||||
id S1756106Ab3H3WrX (ORCPT <rfc822;georgezhim@gmail.com>
|
|
||||||
+ 99 others); Fri, 30 Aug 2013 18:47:23 -0400
|
|
||||||
Received: from usindpps04.hds.com ([207.126.252.17]:35640 "EHLO
|
|
||||||
usindpps04.hds.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org
|
|
||||||
with ESMTP id S1752650Ab3H3WrW (ORCPT
|
|
||||||
<rfc822;linux-kernel@vger.kernel.org>);
|
|
||||||
Fri, 30 Aug 2013 18:47:22 -0400
|
|
||||||
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=hds.com; h=subject : to : from : cc
|
|
||||||
: date : message-id : in-reply-to : references : mime-version :
|
|
||||||
content-type : content-transfer-encoding; s=mail1;
|
|
||||||
bh=xbQuWVaSJrPfWG5E7bXFAbOFjf/sBaRZsPmpVgy0CYk=;
|
|
||||||
b=NW/A8Imu32MXoBi5FLrQ0FsK66RTWMQo1bFRtgQplVEQQIAXyf1XhCaAZyTkTplc0iEx
|
|
||||||
ovyGZHvLbmGL6w3I3pxkCFz1BPJCqoZtvQITir/WvfzyadYOK1cz+vuBUQSCmfkacvS/
|
|
||||||
w37h1jLAjsvWXkl0GY7pxB9HJMXdeLnhhuWxtNU8m8rKZ7t3LSByMeQi5/3OTkNojDEe
|
|
||||||
70cKeZXCPQ/UIDJAF4cpSVXia5FwoJISjXvQIrvqkYhFelzq3OHMcC482PdpqNB475h3
|
|
||||||
yHHJ83HFOLRulUQdOG5ZVTB9qRg0zxRx/oedeXwzturFke68noRRa4f4izQ8sCwsWOCI Dw==
|
|
||||||
Received: from usindmail01.hds.com (usindmail03 [207.126.252.22])
|
|
||||||
by usindpps04.hds.com (8.14.5/8.14.5) with ESMTP id r7UMlHIc025543;
|
|
||||||
Fri, 30 Aug 2013 18:47:17 -0400
|
|
||||||
Received: from hds.com (usindnetf5d-vlan47float.corp.hds.com [10.74.73.11])
|
|
||||||
by usindmail01.hds.com (8.14.1/8.14.1) with ESMTP id r7UMlGiC058545;
|
|
||||||
Fri, 30 Aug 2013 18:47:17 -0400 (EDT)
|
|
||||||
Subject: [PATCH v2 2/2] elevator: acquire q->sysfs_lock in elevator_change()
|
|
||||||
To: linux-kernel@vger.kernel.org
|
|
||||||
From: Tomoki Sekiyama <tomoki.sekiyama@hds.com>
|
|
||||||
Cc: axboe@kernel.dk, tj@kernel.org, seiji.aguchi@hds.com,
|
|
||||||
vgoyal@redhat.com, majianpeng@gmail.com
|
|
||||||
Date: Fri, 30 Aug 2013 18:47:16 -0400
|
|
||||||
Message-ID: <20130830224716.21812.99333.stgit@hds.com>
|
|
||||||
In-Reply-To: <20130830224707.21812.63516.stgit@hds.com>
|
|
||||||
References: <20130830224707.21812.63516.stgit@hds.com>
|
|
||||||
User-Agent: StGit/0.16
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset="utf-8"
|
|
||||||
Content-Transfer-Encoding: 7bit
|
|
||||||
X-Proofpoint-SPF-Result: pass
|
|
||||||
X-Proofpoint-SPF-Record: v=spf1 mx ip4:207.126.244.0/26 ip4:207.126.252.0/25 include:mktomail.com
|
|
||||||
include:cloud.hds.com ~all
|
|
||||||
X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.10.8794,1.0.431,0.0.0000
|
|
||||||
definitions=2013-08-30_09:2013-08-30,2013-08-30,1970-01-01 signatures=0
|
|
||||||
X-Proofpoint-Spam-Details: rule=notspam policy=outbound_policy score=0 spamscore=0 suspectscore=1
|
|
||||||
phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx
|
|
||||||
scancount=1 engine=7.0.1-1305240000 definitions=main-1308300162
|
|
||||||
Sender: linux-kernel-owner@vger.kernel.org
|
|
||||||
Precedence: bulk
|
|
||||||
List-ID: <linux-kernel.vger.kernel.org>
|
|
||||||
X-Mailing-List: linux-kernel@vger.kernel.org
|
|
||||||
|
|
||||||
Add locking of q->sysfs_lock into elevator_change() (an exported function)
|
|
||||||
to ensure it is held to protect q->elevator from elevator_init(), even if
|
|
||||||
elevator_change() is called from non-sysfs paths.
|
|
||||||
sysfs path (elv_iosched_store) uses __elevator_change(), non-locking
|
|
||||||
version, as the lock is already taken by elv_iosched_store().
|
|
||||||
|
|
||||||
Signed-off-by: Tomoki Sekiyama <tomoki.sekiyama@hds.com>
|
|
||||||
---
|
|
||||||
block/elevator.c | 16 ++++++++++++++--
|
|
||||||
1 file changed, 14 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/block/elevator.c b/block/elevator.c
|
|
||||||
index 02d4390..6d765f7 100644
|
|
||||||
--- a/block/elevator.c
|
|
||||||
+++ b/block/elevator.c
|
|
||||||
@@ -965,7 +965,7 @@ fail_init:
|
|
||||||
/*
|
|
||||||
* Switch this queue to the given IO scheduler.
|
|
||||||
*/
|
|
||||||
-int elevator_change(struct request_queue *q, const char *name)
|
|
||||||
+static int __elevator_change(struct request_queue *q, const char *name)
|
|
||||||
{
|
|
||||||
char elevator_name[ELV_NAME_MAX];
|
|
||||||
struct elevator_type *e;
|
|
||||||
@@ -987,6 +987,18 @@ int elevator_change(struct request_queue *q, const char *name)
|
|
||||||
|
|
||||||
return elevator_switch(q, e);
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+int elevator_change(struct request_queue *q, const char *name)
|
|
||||||
+{
|
|
||||||
+ int ret;
|
|
||||||
+
|
|
||||||
+ /* Protect q->elevator from elevator_init() */
|
|
||||||
+ mutex_lock(&q->sysfs_lock);
|
|
||||||
+ ret = __elevator_change(q, name);
|
|
||||||
+ mutex_unlock(&q->sysfs_lock);
|
|
||||||
+
|
|
||||||
+ return ret;
|
|
||||||
+}
|
|
||||||
EXPORT_SYMBOL(elevator_change);
|
|
||||||
|
|
||||||
ssize_t elv_iosched_store(struct request_queue *q, const char *name,
|
|
||||||
@@ -997,7 +1009,7 @@ ssize_t elv_iosched_store(struct request_queue *q, const char *name,
|
|
||||||
if (!q->elevator)
|
|
||||||
return count;
|
|
||||||
|
|
||||||
- ret = elevator_change(q, name);
|
|
||||||
+ ret = __elevator_change(q, name);
|
|
||||||
if (!ret)
|
|
||||||
return count;
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
|
|
||||||
the body of a message to majordomo@vger.kernel.org
|
|
||||||
More majordomo info at http://vger.kernel.org/majordomo-info.html
|
|
||||||
Please read the FAQ at http://www.tux.org/lkml/
|
|
@ -1,253 +0,0 @@
|
|||||||
Bugzilla: 1035887
|
|
||||||
Upstream-status: 3.13
|
|
||||||
|
|
||||||
From 4be402ba6158068d53ab0268f1affa9d82dae2ec Mon Sep 17 00:00:00 2001
|
|
||||||
From: Hannes Frederic Sowa <hannes@stressinduktion.org>
|
|
||||||
Date: Fri, 22 Nov 2013 23:46:12 +0000
|
|
||||||
Subject: [PATCH] inet: fix addr_len/msg->msg_namelen assignment in recv_error
|
|
||||||
and rxpmtu functions
|
|
||||||
|
|
||||||
Commit bceaa90240b6019ed73b49965eac7d167610be69 ("inet: prevent leakage
|
|
||||||
of uninitialized memory to user in recv syscalls") conditionally updated
|
|
||||||
addr_len if the msg_name is written to. The recv_error and rxpmtu
|
|
||||||
functions relied on the recvmsg functions to set up addr_len before.
|
|
||||||
|
|
||||||
As this does not happen any more we have to pass addr_len to those
|
|
||||||
functions as well and set it to the size of the corresponding sockaddr
|
|
||||||
length.
|
|
||||||
|
|
||||||
This broke traceroute and such.
|
|
||||||
|
|
||||||
Fixes: bceaa90240b6 ("inet: prevent leakage of uninitialized memory to user in recv syscalls")
|
|
||||||
Reported-by: Brad Spengler <spender@grsecurity.net>
|
|
||||||
Reported-by: Tom Labanowski
|
|
||||||
Cc: mpb <mpb.mail@gmail.com>
|
|
||||||
Cc: David S. Miller <davem@davemloft.net>
|
|
||||||
Cc: Eric Dumazet <eric.dumazet@gmail.com>
|
|
||||||
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
|
|
||||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
||||||
---
|
|
||||||
include/net/ip.h | 2 +-
|
|
||||||
include/net/ipv6.h | 4 ++--
|
|
||||||
include/net/ping.h | 3 ++-
|
|
||||||
net/ipv4/ip_sockglue.c | 3 ++-
|
|
||||||
net/ipv4/ping.c | 5 +++--
|
|
||||||
net/ipv4/raw.c | 2 +-
|
|
||||||
net/ipv4/udp.c | 2 +-
|
|
||||||
net/ipv6/datagram.c | 7 +++++--
|
|
||||||
net/ipv6/ping.c | 3 ++-
|
|
||||||
net/ipv6/raw.c | 4 ++--
|
|
||||||
net/ipv6/udp.c | 4 ++--
|
|
||||||
net/l2tp/l2tp_ip6.c | 2 +-
|
|
||||||
12 files changed, 24 insertions(+), 17 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/include/net/ip.h b/include/net/ip.h
|
|
||||||
index 5e52688..301f10c 100644
|
|
||||||
--- a/include/net/ip.h
|
|
||||||
+++ b/include/net/ip.h
|
|
||||||
@@ -464,7 +464,7 @@ extern int compat_ip_getsockopt(struct sock *sk, int level,
|
|
||||||
int optname, char __user *optval, int __user *optlen);
|
|
||||||
extern int ip_ra_control(struct sock *sk, unsigned char on, void (*destructor)(struct sock *));
|
|
||||||
|
|
||||||
-extern int ip_recv_error(struct sock *sk, struct msghdr *msg, int len);
|
|
||||||
+extern int ip_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len);
|
|
||||||
extern void ip_icmp_error(struct sock *sk, struct sk_buff *skb, int err,
|
|
||||||
__be16 port, u32 info, u8 *payload);
|
|
||||||
extern void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 dport,
|
|
||||||
diff --git a/include/net/ipv6.h b/include/net/ipv6.h
|
|
||||||
index bbf1c8f..5529d79 100644
|
|
||||||
--- a/include/net/ipv6.h
|
|
||||||
+++ b/include/net/ipv6.h
|
|
||||||
@@ -802,8 +802,8 @@ extern int compat_ipv6_getsockopt(struct sock *sk,
|
|
||||||
extern int ip6_datagram_connect(struct sock *sk,
|
|
||||||
struct sockaddr *addr, int addr_len);
|
|
||||||
|
|
||||||
-extern int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len);
|
|
||||||
-extern int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len);
|
|
||||||
+extern int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len);
|
|
||||||
+extern int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len, int *addr_len);
|
|
||||||
extern void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err, __be16 port,
|
|
||||||
u32 info, u8 *payload);
|
|
||||||
extern void ipv6_local_error(struct sock *sk, int err, struct flowi6 *fl6, u32 info);
|
|
||||||
diff --git a/include/net/ping.h b/include/net/ping.h
|
|
||||||
index 5db0224..2b496e9 100644
|
|
||||||
--- a/include/net/ping.h
|
|
||||||
+++ b/include/net/ping.h
|
|
||||||
@@ -31,7 +31,8 @@
|
|
||||||
|
|
||||||
/* Compatibility glue so we can support IPv6 when it's compiled as a module */
|
|
||||||
struct pingv6_ops {
|
|
||||||
- int (*ipv6_recv_error)(struct sock *sk, struct msghdr *msg, int len);
|
|
||||||
+ int (*ipv6_recv_error)(struct sock *sk, struct msghdr *msg, int len,
|
|
||||||
+ int *addr_len);
|
|
||||||
int (*ip6_datagram_recv_ctl)(struct sock *sk, struct msghdr *msg,
|
|
||||||
struct sk_buff *skb);
|
|
||||||
int (*icmpv6_err_convert)(u8 type, u8 code, int *err);
|
|
||||||
diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c
|
|
||||||
index d9c4f11..23e6ab0 100644
|
|
||||||
--- a/net/ipv4/ip_sockglue.c
|
|
||||||
+++ b/net/ipv4/ip_sockglue.c
|
|
||||||
@@ -368,7 +368,7 @@ void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 port, u32 inf
|
|
||||||
/*
|
|
||||||
* Handle MSG_ERRQUEUE
|
|
||||||
*/
|
|
||||||
-int ip_recv_error(struct sock *sk, struct msghdr *msg, int len)
|
|
||||||
+int ip_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len)
|
|
||||||
{
|
|
||||||
struct sock_exterr_skb *serr;
|
|
||||||
struct sk_buff *skb, *skb2;
|
|
||||||
@@ -405,6 +405,7 @@ int ip_recv_error(struct sock *sk, struct msghdr *msg, int len)
|
|
||||||
serr->addr_offset);
|
|
||||||
sin->sin_port = serr->port;
|
|
||||||
memset(&sin->sin_zero, 0, sizeof(sin->sin_zero));
|
|
||||||
+ *addr_len = sizeof(*sin);
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(&errhdr.ee, &serr->ee, sizeof(struct sock_extended_err));
|
|
||||||
diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c
|
|
||||||
index 92fb6ff..ac31877 100644
|
|
||||||
--- a/net/ipv4/ping.c
|
|
||||||
+++ b/net/ipv4/ping.c
|
|
||||||
@@ -838,10 +838,11 @@ int ping_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
|
|
||||||
|
|
||||||
if (flags & MSG_ERRQUEUE) {
|
|
||||||
if (family == AF_INET) {
|
|
||||||
- return ip_recv_error(sk, msg, len);
|
|
||||||
+ return ip_recv_error(sk, msg, len, addr_len);
|
|
||||||
#if IS_ENABLED(CONFIG_IPV6)
|
|
||||||
} else if (family == AF_INET6) {
|
|
||||||
- return pingv6_ops.ipv6_recv_error(sk, msg, len);
|
|
||||||
+ return pingv6_ops.ipv6_recv_error(sk, msg, len,
|
|
||||||
+ addr_len);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c
|
|
||||||
index ca4c3f1..7d3db78 100644
|
|
||||||
--- a/net/ipv4/raw.c
|
|
||||||
+++ b/net/ipv4/raw.c
|
|
||||||
@@ -695,7 +695,7 @@ static int raw_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
if (flags & MSG_ERRQUEUE) {
|
|
||||||
- err = ip_recv_error(sk, msg, len);
|
|
||||||
+ err = ip_recv_error(sk, msg, len, addr_len);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
|
|
||||||
index a7003de..1ef8794 100644
|
|
||||||
--- a/net/ipv4/udp.c
|
|
||||||
+++ b/net/ipv4/udp.c
|
|
||||||
@@ -1210,7 +1210,7 @@ int udp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
|
|
||||||
bool slow;
|
|
||||||
|
|
||||||
if (flags & MSG_ERRQUEUE)
|
|
||||||
- return ip_recv_error(sk, msg, len);
|
|
||||||
+ return ip_recv_error(sk, msg, len, addr_len);
|
|
||||||
|
|
||||||
try_again:
|
|
||||||
skb = __skb_recv_datagram(sk, flags | (noblock ? MSG_DONTWAIT : 0),
|
|
||||||
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c
|
|
||||||
index 48b6bd2..7a0fd80 100644
|
|
||||||
--- a/net/ipv6/datagram.c
|
|
||||||
+++ b/net/ipv6/datagram.c
|
|
||||||
@@ -318,7 +318,7 @@ void ipv6_local_rxpmtu(struct sock *sk, struct flowi6 *fl6, u32 mtu)
|
|
||||||
/*
|
|
||||||
* Handle MSG_ERRQUEUE
|
|
||||||
*/
|
|
||||||
-int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len)
|
|
||||||
+int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len)
|
|
||||||
{
|
|
||||||
struct ipv6_pinfo *np = inet6_sk(sk);
|
|
||||||
struct sock_exterr_skb *serr;
|
|
||||||
@@ -369,6 +369,7 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len)
|
|
||||||
&sin->sin6_addr);
|
|
||||||
sin->sin6_scope_id = 0;
|
|
||||||
}
|
|
||||||
+ *addr_len = sizeof(*sin);
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(&errhdr.ee, &serr->ee, sizeof(struct sock_extended_err));
|
|
||||||
@@ -423,7 +424,8 @@ EXPORT_SYMBOL_GPL(ipv6_recv_error);
|
|
||||||
/*
|
|
||||||
* Handle IPV6_RECVPATHMTU
|
|
||||||
*/
|
|
||||||
-int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len)
|
|
||||||
+int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len,
|
|
||||||
+ int *addr_len)
|
|
||||||
{
|
|
||||||
struct ipv6_pinfo *np = inet6_sk(sk);
|
|
||||||
struct sk_buff *skb;
|
|
||||||
@@ -457,6 +459,7 @@ int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len)
|
|
||||||
sin->sin6_port = 0;
|
|
||||||
sin->sin6_scope_id = mtu_info.ip6m_addr.sin6_scope_id;
|
|
||||||
sin->sin6_addr = mtu_info.ip6m_addr.sin6_addr;
|
|
||||||
+ *addr_len = sizeof(*sin);
|
|
||||||
}
|
|
||||||
|
|
||||||
put_cmsg(msg, SOL_IPV6, IPV6_PATHMTU, sizeof(mtu_info), &mtu_info);
|
|
||||||
diff --git a/net/ipv6/ping.c b/net/ipv6/ping.c
|
|
||||||
index 18f19df..7856e96 100644
|
|
||||||
--- a/net/ipv6/ping.c
|
|
||||||
+++ b/net/ipv6/ping.c
|
|
||||||
@@ -57,7 +57,8 @@ static struct inet_protosw pingv6_protosw = {
|
|
||||||
|
|
||||||
|
|
||||||
/* Compatibility glue so we can support IPv6 when it's compiled as a module */
|
|
||||||
-static int dummy_ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len)
|
|
||||||
+static int dummy_ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len,
|
|
||||||
+ int *addr_len)
|
|
||||||
{
|
|
||||||
return -EAFNOSUPPORT;
|
|
||||||
}
|
|
||||||
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
|
|
||||||
index 2f303bf..430067c 100644
|
|
||||||
--- a/net/ipv6/raw.c
|
|
||||||
+++ b/net/ipv6/raw.c
|
|
||||||
@@ -467,10 +467,10 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk,
|
|
||||||
return -EOPNOTSUPP;
|
|
||||||
|
|
||||||
if (flags & MSG_ERRQUEUE)
|
|
||||||
- return ipv6_recv_error(sk, msg, len);
|
|
||||||
+ return ipv6_recv_error(sk, msg, len, addr_len);
|
|
||||||
|
|
||||||
if (np->rxpmtu && np->rxopt.bits.rxpmtu)
|
|
||||||
- return ipv6_recv_rxpmtu(sk, msg, len);
|
|
||||||
+ return ipv6_recv_rxpmtu(sk, msg, len, addr_len);
|
|
||||||
|
|
||||||
skb = skb_recv_datagram(sk, flags, noblock, &err);
|
|
||||||
if (!skb)
|
|
||||||
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
|
|
||||||
index a59beed..3d2758d 100644
|
|
||||||
--- a/net/ipv6/udp.c
|
|
||||||
+++ b/net/ipv6/udp.c
|
|
||||||
@@ -375,10 +375,10 @@ int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk,
|
|
||||||
bool slow;
|
|
||||||
|
|
||||||
if (flags & MSG_ERRQUEUE)
|
|
||||||
- return ipv6_recv_error(sk, msg, len);
|
|
||||||
+ return ipv6_recv_error(sk, msg, len, addr_len);
|
|
||||||
|
|
||||||
if (np->rxpmtu && np->rxopt.bits.rxpmtu)
|
|
||||||
- return ipv6_recv_rxpmtu(sk, msg, len);
|
|
||||||
+ return ipv6_recv_rxpmtu(sk, msg, len, addr_len);
|
|
||||||
|
|
||||||
try_again:
|
|
||||||
skb = __skb_recv_datagram(sk, flags | (noblock ? MSG_DONTWAIT : 0),
|
|
||||||
diff --git a/net/l2tp/l2tp_ip6.c b/net/l2tp/l2tp_ip6.c
|
|
||||||
index b8a6039..e6e8408 100644
|
|
||||||
--- a/net/l2tp/l2tp_ip6.c
|
|
||||||
+++ b/net/l2tp/l2tp_ip6.c
|
|
||||||
@@ -665,7 +665,7 @@ static int l2tp_ip6_recvmsg(struct kiocb *iocb, struct sock *sk,
|
|
||||||
*addr_len = sizeof(*lsa);
|
|
||||||
|
|
||||||
if (flags & MSG_ERRQUEUE)
|
|
||||||
- return ipv6_recv_error(sk, msg, len);
|
|
||||||
+ return ipv6_recv_error(sk, msg, len, addr_len);
|
|
||||||
|
|
||||||
skb = skb_recv_datagram(sk, flags, noblock, &err);
|
|
||||||
if (!skb)
|
|
||||||
--
|
|
||||||
1.8.3.1
|
|
||||||
|
|
@ -1,256 +0,0 @@
|
|||||||
Bugzilla: 1035887
|
|
||||||
Upstream-status: 3.13
|
|
||||||
|
|
||||||
From bceaa90240b6019ed73b49965eac7d167610be69 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Hannes Frederic Sowa <hannes@stressinduktion.org>
|
|
||||||
Date: Mon, 18 Nov 2013 04:20:45 +0100
|
|
||||||
Subject: [PATCH] inet: prevent leakage of uninitialized memory to user in recv
|
|
||||||
syscalls
|
|
||||||
|
|
||||||
Only update *addr_len when we actually fill in sockaddr, otherwise we
|
|
||||||
can return uninitialized memory from the stack to the caller in the
|
|
||||||
recvfrom, recvmmsg and recvmsg syscalls. Drop the the (addr_len == NULL)
|
|
||||||
checks because we only get called with a valid addr_len pointer either
|
|
||||||
from sock_common_recvmsg or inet_recvmsg.
|
|
||||||
|
|
||||||
If a blocking read waits on a socket which is concurrently shut down we
|
|
||||||
now return zero and set msg_msgnamelen to 0.
|
|
||||||
|
|
||||||
Reported-by: mpb <mpb.mail@gmail.com>
|
|
||||||
Suggested-by: Eric Dumazet <eric.dumazet@gmail.com>
|
|
||||||
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
|
|
||||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
||||||
---
|
|
||||||
net/ieee802154/dgram.c | 3 +--
|
|
||||||
net/ipv4/ping.c | 19 +++++++------------
|
|
||||||
net/ipv4/raw.c | 4 +---
|
|
||||||
net/ipv4/udp.c | 7 +------
|
|
||||||
net/ipv6/raw.c | 4 +---
|
|
||||||
net/ipv6/udp.c | 5 +----
|
|
||||||
net/l2tp/l2tp_ip.c | 4 +---
|
|
||||||
net/phonet/datagram.c | 9 ++++-----
|
|
||||||
8 files changed, 17 insertions(+), 38 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/net/ieee802154/dgram.c b/net/ieee802154/dgram.c
|
|
||||||
index 581a595..1865fdf 100644
|
|
||||||
--- a/net/ieee802154/dgram.c
|
|
||||||
+++ b/net/ieee802154/dgram.c
|
|
||||||
@@ -315,9 +315,8 @@ static int dgram_recvmsg(struct kiocb *iocb, struct sock *sk,
|
|
||||||
if (saddr) {
|
|
||||||
saddr->family = AF_IEEE802154;
|
|
||||||
saddr->addr = mac_cb(skb)->sa;
|
|
||||||
- }
|
|
||||||
- if (addr_len)
|
|
||||||
*addr_len = sizeof(*saddr);
|
|
||||||
+ }
|
|
||||||
|
|
||||||
if (flags & MSG_TRUNC)
|
|
||||||
copied = skb->len;
|
|
||||||
diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c
|
|
||||||
index 9afbdb1..aacefa0 100644
|
|
||||||
--- a/net/ipv4/ping.c
|
|
||||||
+++ b/net/ipv4/ping.c
|
|
||||||
@@ -830,8 +830,6 @@ int ping_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
|
|
||||||
{
|
|
||||||
struct inet_sock *isk = inet_sk(sk);
|
|
||||||
int family = sk->sk_family;
|
|
||||||
- struct sockaddr_in *sin;
|
|
||||||
- struct sockaddr_in6 *sin6;
|
|
||||||
struct sk_buff *skb;
|
|
||||||
int copied, err;
|
|
||||||
|
|
||||||
@@ -841,13 +839,6 @@ int ping_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
|
|
||||||
if (flags & MSG_OOB)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
- if (addr_len) {
|
|
||||||
- if (family == AF_INET)
|
|
||||||
- *addr_len = sizeof(*sin);
|
|
||||||
- else if (family == AF_INET6 && addr_len)
|
|
||||||
- *addr_len = sizeof(*sin6);
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
if (flags & MSG_ERRQUEUE) {
|
|
||||||
if (family == AF_INET) {
|
|
||||||
return ip_recv_error(sk, msg, len);
|
|
||||||
@@ -877,11 +868,13 @@ int ping_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
|
|
||||||
|
|
||||||
/* Copy the address and add cmsg data. */
|
|
||||||
if (family == AF_INET) {
|
|
||||||
- sin = (struct sockaddr_in *) msg->msg_name;
|
|
||||||
+ struct sockaddr_in *sin = (struct sockaddr_in *)msg->msg_name;
|
|
||||||
+
|
|
||||||
sin->sin_family = AF_INET;
|
|
||||||
sin->sin_port = 0 /* skb->h.uh->source */;
|
|
||||||
sin->sin_addr.s_addr = ip_hdr(skb)->saddr;
|
|
||||||
memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
|
|
||||||
+ *addr_len = sizeof(*sin);
|
|
||||||
|
|
||||||
if (isk->cmsg_flags)
|
|
||||||
ip_cmsg_recv(msg, skb);
|
|
||||||
@@ -890,17 +883,19 @@ int ping_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
|
|
||||||
} else if (family == AF_INET6) {
|
|
||||||
struct ipv6_pinfo *np = inet6_sk(sk);
|
|
||||||
struct ipv6hdr *ip6 = ipv6_hdr(skb);
|
|
||||||
- sin6 = (struct sockaddr_in6 *) msg->msg_name;
|
|
||||||
+ struct sockaddr_in6 *sin6 =
|
|
||||||
+ (struct sockaddr_in6 *)msg->msg_name;
|
|
||||||
+
|
|
||||||
sin6->sin6_family = AF_INET6;
|
|
||||||
sin6->sin6_port = 0;
|
|
||||||
sin6->sin6_addr = ip6->saddr;
|
|
||||||
-
|
|
||||||
sin6->sin6_flowinfo = 0;
|
|
||||||
if (np->sndflow)
|
|
||||||
sin6->sin6_flowinfo = ip6_flowinfo(ip6);
|
|
||||||
|
|
||||||
sin6->sin6_scope_id = ipv6_iface_scope_id(&sin6->sin6_addr,
|
|
||||||
IP6CB(skb)->iif);
|
|
||||||
+ *addr_len = sizeof(*sin6);
|
|
||||||
|
|
||||||
if (inet6_sk(sk)->rxopt.all)
|
|
||||||
pingv6_ops.ip6_datagram_recv_ctl(sk, msg, skb);
|
|
||||||
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c
|
|
||||||
index 41e1d28..5cb8ddb 100644
|
|
||||||
--- a/net/ipv4/raw.c
|
|
||||||
+++ b/net/ipv4/raw.c
|
|
||||||
@@ -696,9 +696,6 @@ static int raw_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
|
|
||||||
if (flags & MSG_OOB)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
- if (addr_len)
|
|
||||||
- *addr_len = sizeof(*sin);
|
|
||||||
-
|
|
||||||
if (flags & MSG_ERRQUEUE) {
|
|
||||||
err = ip_recv_error(sk, msg, len);
|
|
||||||
goto out;
|
|
||||||
@@ -726,6 +723,7 @@ static int raw_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
|
|
||||||
sin->sin_addr.s_addr = ip_hdr(skb)->saddr;
|
|
||||||
sin->sin_port = 0;
|
|
||||||
memset(&sin->sin_zero, 0, sizeof(sin->sin_zero));
|
|
||||||
+ *addr_len = sizeof(*sin);
|
|
||||||
}
|
|
||||||
if (inet->cmsg_flags)
|
|
||||||
ip_cmsg_recv(msg, skb);
|
|
||||||
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
|
|
||||||
index 89909dd..998431c 100644
|
|
||||||
--- a/net/ipv4/udp.c
|
|
||||||
+++ b/net/ipv4/udp.c
|
|
||||||
@@ -1235,12 +1235,6 @@ int udp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
|
|
||||||
int is_udplite = IS_UDPLITE(sk);
|
|
||||||
bool slow;
|
|
||||||
|
|
||||||
- /*
|
|
||||||
- * Check any passed addresses
|
|
||||||
- */
|
|
||||||
- if (addr_len)
|
|
||||||
- *addr_len = sizeof(*sin);
|
|
||||||
-
|
|
||||||
if (flags & MSG_ERRQUEUE)
|
|
||||||
return ip_recv_error(sk, msg, len);
|
|
||||||
|
|
||||||
@@ -1302,6 +1296,7 @@ try_again:
|
|
||||||
sin->sin_port = udp_hdr(skb)->source;
|
|
||||||
sin->sin_addr.s_addr = ip_hdr(skb)->saddr;
|
|
||||||
memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
|
|
||||||
+ *addr_len = sizeof(*sin);
|
|
||||||
}
|
|
||||||
if (inet->cmsg_flags)
|
|
||||||
ip_cmsg_recv(msg, skb);
|
|
||||||
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
|
|
||||||
index 3c00842..e24ff1d 100644
|
|
||||||
--- a/net/ipv6/raw.c
|
|
||||||
+++ b/net/ipv6/raw.c
|
|
||||||
@@ -465,9 +465,6 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk,
|
|
||||||
if (flags & MSG_OOB)
|
|
||||||
return -EOPNOTSUPP;
|
|
||||||
|
|
||||||
- if (addr_len)
|
|
||||||
- *addr_len=sizeof(*sin6);
|
|
||||||
-
|
|
||||||
if (flags & MSG_ERRQUEUE)
|
|
||||||
return ipv6_recv_error(sk, msg, len);
|
|
||||||
|
|
||||||
@@ -506,6 +503,7 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk,
|
|
||||||
sin6->sin6_flowinfo = 0;
|
|
||||||
sin6->sin6_scope_id = ipv6_iface_scope_id(&sin6->sin6_addr,
|
|
||||||
IP6CB(skb)->iif);
|
|
||||||
+ *addr_len = sizeof(*sin6);
|
|
||||||
}
|
|
||||||
|
|
||||||
sock_recv_ts_and_drops(msg, sk, skb);
|
|
||||||
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
|
|
||||||
index f3893e8..81eb8cf 100644
|
|
||||||
--- a/net/ipv6/udp.c
|
|
||||||
+++ b/net/ipv6/udp.c
|
|
||||||
@@ -392,9 +392,6 @@ int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk,
|
|
||||||
int is_udp4;
|
|
||||||
bool slow;
|
|
||||||
|
|
||||||
- if (addr_len)
|
|
||||||
- *addr_len = sizeof(struct sockaddr_in6);
|
|
||||||
-
|
|
||||||
if (flags & MSG_ERRQUEUE)
|
|
||||||
return ipv6_recv_error(sk, msg, len);
|
|
||||||
|
|
||||||
@@ -480,7 +477,7 @@ try_again:
|
|
||||||
ipv6_iface_scope_id(&sin6->sin6_addr,
|
|
||||||
IP6CB(skb)->iif);
|
|
||||||
}
|
|
||||||
-
|
|
||||||
+ *addr_len = sizeof(*sin6);
|
|
||||||
}
|
|
||||||
if (is_udp4) {
|
|
||||||
if (inet->cmsg_flags)
|
|
||||||
diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c
|
|
||||||
index 571db8d..da1a1ce 100644
|
|
||||||
--- a/net/l2tp/l2tp_ip.c
|
|
||||||
+++ b/net/l2tp/l2tp_ip.c
|
|
||||||
@@ -518,9 +518,6 @@ static int l2tp_ip_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *m
|
|
||||||
if (flags & MSG_OOB)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
- if (addr_len)
|
|
||||||
- *addr_len = sizeof(*sin);
|
|
||||||
-
|
|
||||||
skb = skb_recv_datagram(sk, flags, noblock, &err);
|
|
||||||
if (!skb)
|
|
||||||
goto out;
|
|
||||||
@@ -543,6 +540,7 @@ static int l2tp_ip_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *m
|
|
||||||
sin->sin_addr.s_addr = ip_hdr(skb)->saddr;
|
|
||||||
sin->sin_port = 0;
|
|
||||||
memset(&sin->sin_zero, 0, sizeof(sin->sin_zero));
|
|
||||||
+ *addr_len = sizeof(*sin);
|
|
||||||
}
|
|
||||||
if (inet->cmsg_flags)
|
|
||||||
ip_cmsg_recv(msg, skb);
|
|
||||||
diff --git a/net/phonet/datagram.c b/net/phonet/datagram.c
|
|
||||||
index 12c30f3..38946b2 100644
|
|
||||||
--- a/net/phonet/datagram.c
|
|
||||||
+++ b/net/phonet/datagram.c
|
|
||||||
@@ -139,9 +139,6 @@ static int pn_recvmsg(struct kiocb *iocb, struct sock *sk,
|
|
||||||
MSG_CMSG_COMPAT))
|
|
||||||
goto out_nofree;
|
|
||||||
|
|
||||||
- if (addr_len)
|
|
||||||
- *addr_len = sizeof(sa);
|
|
||||||
-
|
|
||||||
skb = skb_recv_datagram(sk, flags, noblock, &rval);
|
|
||||||
if (skb == NULL)
|
|
||||||
goto out_nofree;
|
|
||||||
@@ -162,8 +159,10 @@ static int pn_recvmsg(struct kiocb *iocb, struct sock *sk,
|
|
||||||
|
|
||||||
rval = (flags & MSG_TRUNC) ? skb->len : copylen;
|
|
||||||
|
|
||||||
- if (msg->msg_name != NULL)
|
|
||||||
- memcpy(msg->msg_name, &sa, sizeof(struct sockaddr_pn));
|
|
||||||
+ if (msg->msg_name != NULL) {
|
|
||||||
+ memcpy(msg->msg_name, &sa, sizeof(sa));
|
|
||||||
+ *addr_len = sizeof(sa);
|
|
||||||
+ }
|
|
||||||
|
|
||||||
out:
|
|
||||||
skb_free_datagram(sk, skb);
|
|
||||||
--
|
|
||||||
1.8.3.1
|
|
||||||
|
|
@ -1,50 +0,0 @@
|
|||||||
Bugzilla: 982153
|
|
||||||
Upstream-status: 3.13
|
|
||||||
|
|
||||||
From 05104a4e8713b27291c7bb49c1e7e68b4e243571 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Neil Horman <nhorman@tuxdriver.com>
|
|
||||||
Date: Fri, 27 Sep 2013 16:53:35 +0000
|
|
||||||
Subject: iommu: Remove stack trace from broken irq remapping warning
|
|
||||||
|
|
||||||
The warning for the irq remapping broken check in intel_irq_remapping.c is
|
|
||||||
pretty pointless. We need the warning, but we know where its comming from, the
|
|
||||||
stack trace will always be the same, and it needlessly triggers things like
|
|
||||||
Abrt. This changes the warning to just print a text warning about BIOS being
|
|
||||||
broken, without the stack trace, then sets the appropriate taint bit. Since we
|
|
||||||
automatically disable irq remapping, theres no need to contiue making Abrt jump
|
|
||||||
at this problem
|
|
||||||
|
|
||||||
Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
|
|
||||||
CC: Joerg Roedel <joro@8bytes.org>
|
|
||||||
CC: Bjorn Helgaas <bhelgaas@google.com>
|
|
||||||
CC: Andy Lutomirski <luto@amacapital.net>
|
|
||||||
CC: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
|
||||||
CC: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
|
|
||||||
Signed-off-by: Joerg Roedel <joro@8bytes.org>
|
|
||||||
---
|
|
||||||
diff --git a/drivers/iommu/intel_irq_remapping.c b/drivers/iommu/intel_irq_remapping.c
|
|
||||||
index f71673d..b97d70b 100644
|
|
||||||
--- a/drivers/iommu/intel_irq_remapping.c
|
|
||||||
+++ b/drivers/iommu/intel_irq_remapping.c
|
|
||||||
@@ -525,12 +525,13 @@ static int __init intel_irq_remapping_supported(void)
|
|
||||||
if (disable_irq_remap)
|
|
||||||
return 0;
|
|
||||||
if (irq_remap_broken) {
|
|
||||||
- WARN_TAINT(1, TAINT_FIRMWARE_WORKAROUND,
|
|
||||||
- "This system BIOS has enabled interrupt remapping\n"
|
|
||||||
- "on a chipset that contains an erratum making that\n"
|
|
||||||
- "feature unstable. To maintain system stability\n"
|
|
||||||
- "interrupt remapping is being disabled. Please\n"
|
|
||||||
- "contact your BIOS vendor for an update\n");
|
|
||||||
+ printk(KERN_WARNING
|
|
||||||
+ "This system BIOS has enabled interrupt remapping\n"
|
|
||||||
+ "on a chipset that contains an erratum making that\n"
|
|
||||||
+ "feature unstable. To maintain system stability\n"
|
|
||||||
+ "interrupt remapping is being disabled. Please\n"
|
|
||||||
+ "contact your BIOS vendor for an update\n");
|
|
||||||
+ add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK);
|
|
||||||
disable_irq_remap = 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
--
|
|
||||||
cgit v0.9.2
|
|
@ -1,43 +0,0 @@
|
|||||||
Bugzilla: 1030015
|
|
||||||
Upstream-status: 3.13
|
|
||||||
|
|
||||||
From 0e033e04c2678dbbe74a46b23fffb7bb918c288e Mon Sep 17 00:00:00 2001
|
|
||||||
From: Hannes Frederic Sowa <hannes@stressinduktion.org>
|
|
||||||
Date: Tue, 5 Nov 2013 02:41:27 +0100
|
|
||||||
Subject: [PATCH] ipv6: fix headroom calculation in udp6_ufo_fragment
|
|
||||||
|
|
||||||
Commit 1e2bd517c108816220f262d7954b697af03b5f9c ("udp6: Fix udp
|
|
||||||
fragmentation for tunnel traffic.") changed the calculation if
|
|
||||||
there is enough space to include a fragment header in the skb from a
|
|
||||||
skb->mac_header dervived one to skb_headroom. Because we already peeled
|
|
||||||
off the skb to transport_header this is wrong. Change this back to check
|
|
||||||
if we have enough room before the mac_header.
|
|
||||||
|
|
||||||
This fixes a panic Saran Neti reported. He used the tbf scheduler which
|
|
||||||
skb_gso_segments the skb. The offsets get negative and we panic in memcpy
|
|
||||||
because the skb was erroneously not expanded at the head.
|
|
||||||
|
|
||||||
Reported-by: Saran Neti <Saran.Neti@telus.com>
|
|
||||||
Cc: Pravin B Shelar <pshelar@nicira.com>
|
|
||||||
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
|
|
||||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
||||||
---
|
|
||||||
net/ipv6/udp_offload.c | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/net/ipv6/udp_offload.c b/net/ipv6/udp_offload.c
|
|
||||||
index 08e23b0..e7359f9 100644
|
|
||||||
--- a/net/ipv6/udp_offload.c
|
|
||||||
+++ b/net/ipv6/udp_offload.c
|
|
||||||
@@ -90,7 +90,7 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb,
|
|
||||||
|
|
||||||
/* Check if there is enough headroom to insert fragment header. */
|
|
||||||
tnl_hlen = skb_tnl_header_len(skb);
|
|
||||||
- if (skb_headroom(skb) < (tnl_hlen + frag_hdr_sz)) {
|
|
||||||
+ if (skb->mac_header < (tnl_hlen + frag_hdr_sz)) {
|
|
||||||
if (gso_pskb_expand_head(skb, tnl_hlen + frag_hdr_sz))
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
--
|
|
||||||
1.8.3.1
|
|
||||||
|
|
77
kernel.spec
77
kernel.spec
@ -74,7 +74,7 @@ Summary: The Linux kernel
|
|||||||
%if 0%{?released_kernel}
|
%if 0%{?released_kernel}
|
||||||
|
|
||||||
# Do we have a -stable update to apply?
|
# Do we have a -stable update to apply?
|
||||||
%define stable_update 3
|
%define stable_update 4
|
||||||
# Is it a -stable RC?
|
# Is it a -stable RC?
|
||||||
%define stable_rc 0
|
%define stable_rc 0
|
||||||
# Set rpm version accordingly
|
# Set rpm version accordingly
|
||||||
@ -708,22 +708,6 @@ Patch22000: weird-root-dentry-name-debug.patch
|
|||||||
|
|
||||||
Patch25047: drm-radeon-Disable-writeback-by-default-on-ppc.patch
|
Patch25047: drm-radeon-Disable-writeback-by-default-on-ppc.patch
|
||||||
|
|
||||||
#rhbz 985522
|
|
||||||
Patch25107: ntp-Make-periodic-RTC-update-more-reliable.patch
|
|
||||||
|
|
||||||
#rhbz 902012
|
|
||||||
Patch25114: elevator-Fix-a-race-in-elevator-switching-and-md.patch
|
|
||||||
Patch25115: elevator-acquire-q-sysfs_lock-in-elevator_change.patch
|
|
||||||
|
|
||||||
#rhbz 974072
|
|
||||||
Patch25116: rt2800-add-support-for-rf3070.patch
|
|
||||||
|
|
||||||
#rhbz 982153
|
|
||||||
Patch25123: iommu-Remove-stack-trace-from-broken-irq-remapping-warning.patch
|
|
||||||
|
|
||||||
#rhbz 998732
|
|
||||||
Patch25124: vfio-iommu-Fixed-interaction-of-VFIO_IOMMU_MAP_DMA.patch
|
|
||||||
|
|
||||||
#rhbz 896695
|
#rhbz 896695
|
||||||
Patch25127: 0002-iwlwifi-don-t-WARN-on-bad-firmware-state.patch
|
Patch25127: 0002-iwlwifi-don-t-WARN-on-bad-firmware-state.patch
|
||||||
|
|
||||||
@ -735,19 +719,9 @@ Patch25129: cpupower-Fix-segfault-due-to-incorrect-getopt_long-a.patch
|
|||||||
|
|
||||||
Patch25140: drm-qxl-backport-fixes-for-Fedora.patch
|
Patch25140: drm-qxl-backport-fixes-for-Fedora.patch
|
||||||
|
|
||||||
#CVE-2013-4563 rhbz 1030015 1030017
|
|
||||||
Patch25145: ipv6-fix-headroom-calculation-in-udp6_ufo_fragment.patch
|
|
||||||
|
|
||||||
#rhbz 1015905
|
|
||||||
Patch25146: 0001-ip6_output-fragment-outgoing-reassembled-skb-properl.patch
|
|
||||||
Patch25147: 0002-netfilter-push-reasm-skb-through-instead-of-original.patch
|
|
||||||
|
|
||||||
#rhbz 1011362
|
#rhbz 1011362
|
||||||
Patch25148: alx-Reset-phy-speed-after-resume.patch
|
Patch25148: alx-Reset-phy-speed-after-resume.patch
|
||||||
|
|
||||||
#rhbz 1010679
|
|
||||||
Patch25149: drm-radeon-24hz-audio-fixes.patch
|
|
||||||
|
|
||||||
# Fix 15sec NFS mount delay
|
# Fix 15sec NFS mount delay
|
||||||
Patch25152: sunrpc-create-a-new-dummy-pipe-for-gssd-to-hold-open.patch
|
Patch25152: sunrpc-create-a-new-dummy-pipe-for-gssd-to-hold-open.patch
|
||||||
Patch25153: sunrpc-replace-gssd_running-with-more-reliable-check.patch
|
Patch25153: sunrpc-replace-gssd_running-with-more-reliable-check.patch
|
||||||
@ -756,16 +730,6 @@ Patch25154: nfs-check-gssd-running-before-krb5i-auth.patch
|
|||||||
#CVE-2013-6382 rhbz 1033603 1034670
|
#CVE-2013-6382 rhbz 1033603 1034670
|
||||||
Patch25157: xfs-underflow-bug-in-xfs_attrlist_by_handle.patch
|
Patch25157: xfs-underflow-bug-in-xfs_attrlist_by_handle.patch
|
||||||
|
|
||||||
#rhbz 1022733
|
|
||||||
Patch25158: via-velocity-fix-netif_receive_skb-use-in-irq-disable.patch
|
|
||||||
|
|
||||||
#rhbz 998342
|
|
||||||
Patch25159: usbnet-fix-status-interrupt-urb-handling.patch
|
|
||||||
|
|
||||||
#CVE-2013-6405 rhbz 1035875 1035887
|
|
||||||
Patch25161: inet-prevent-leakage-of-uninitialized-memory-to-user.patch
|
|
||||||
Patch25162: inet-fix-addr_len-msg_namelen-assignment-in-recv_error-and-rxpmtu-functions.patch
|
|
||||||
|
|
||||||
#rhbz 958826
|
#rhbz 958826
|
||||||
Patch25164: dell-laptop.patch
|
Patch25164: dell-laptop.patch
|
||||||
|
|
||||||
@ -1441,22 +1405,6 @@ ApplyPatch ath9k_rx_dma_stop_check.patch
|
|||||||
|
|
||||||
ApplyPatch drm-radeon-Disable-writeback-by-default-on-ppc.patch
|
ApplyPatch drm-radeon-Disable-writeback-by-default-on-ppc.patch
|
||||||
|
|
||||||
#rhbz 985522
|
|
||||||
ApplyPatch ntp-Make-periodic-RTC-update-more-reliable.patch
|
|
||||||
|
|
||||||
#rhbz 902012
|
|
||||||
ApplyPatch elevator-Fix-a-race-in-elevator-switching-and-md.patch
|
|
||||||
ApplyPatch elevator-acquire-q-sysfs_lock-in-elevator_change.patch
|
|
||||||
|
|
||||||
#rhbz 974072
|
|
||||||
ApplyPatch rt2800-add-support-for-rf3070.patch
|
|
||||||
|
|
||||||
#rhbz 982153
|
|
||||||
ApplyPatch iommu-Remove-stack-trace-from-broken-irq-remapping-warning.patch
|
|
||||||
|
|
||||||
#rhbz 998732
|
|
||||||
ApplyPatch vfio-iommu-Fixed-interaction-of-VFIO_IOMMU_MAP_DMA.patch
|
|
||||||
|
|
||||||
#rhbz 896695
|
#rhbz 896695
|
||||||
ApplyPatch 0002-iwlwifi-don-t-WARN-on-bad-firmware-state.patch
|
ApplyPatch 0002-iwlwifi-don-t-WARN-on-bad-firmware-state.patch
|
||||||
|
|
||||||
@ -1468,19 +1416,9 @@ ApplyPatch cpupower-Fix-segfault-due-to-incorrect-getopt_long-a.patch
|
|||||||
|
|
||||||
ApplyPatch drm-qxl-backport-fixes-for-Fedora.patch
|
ApplyPatch drm-qxl-backport-fixes-for-Fedora.patch
|
||||||
|
|
||||||
#CVE-2013-4563 rhbz 1030015 1030017
|
|
||||||
ApplyPatch ipv6-fix-headroom-calculation-in-udp6_ufo_fragment.patch
|
|
||||||
|
|
||||||
#rhbz 1015905
|
|
||||||
ApplyPatch 0001-ip6_output-fragment-outgoing-reassembled-skb-properl.patch
|
|
||||||
ApplyPatch 0002-netfilter-push-reasm-skb-through-instead-of-original.patch
|
|
||||||
|
|
||||||
#rhbz 1011362
|
#rhbz 1011362
|
||||||
ApplyPatch alx-Reset-phy-speed-after-resume.patch
|
ApplyPatch alx-Reset-phy-speed-after-resume.patch
|
||||||
|
|
||||||
#rhbz 1010679
|
|
||||||
ApplyPatch drm-radeon-24hz-audio-fixes.patch
|
|
||||||
|
|
||||||
# Fix 15sec NFS mount delay
|
# Fix 15sec NFS mount delay
|
||||||
ApplyPatch sunrpc-create-a-new-dummy-pipe-for-gssd-to-hold-open.patch
|
ApplyPatch sunrpc-create-a-new-dummy-pipe-for-gssd-to-hold-open.patch
|
||||||
ApplyPatch sunrpc-replace-gssd_running-with-more-reliable-check.patch
|
ApplyPatch sunrpc-replace-gssd_running-with-more-reliable-check.patch
|
||||||
@ -1489,16 +1427,6 @@ ApplyPatch nfs-check-gssd-running-before-krb5i-auth.patch
|
|||||||
#CVE-2013-6382 rhbz 1033603 1034670
|
#CVE-2013-6382 rhbz 1033603 1034670
|
||||||
ApplyPatch xfs-underflow-bug-in-xfs_attrlist_by_handle.patch
|
ApplyPatch xfs-underflow-bug-in-xfs_attrlist_by_handle.patch
|
||||||
|
|
||||||
#rhbz 1022733
|
|
||||||
ApplyPatch via-velocity-fix-netif_receive_skb-use-in-irq-disable.patch
|
|
||||||
|
|
||||||
#rhbz 998342
|
|
||||||
ApplyPatch usbnet-fix-status-interrupt-urb-handling.patch
|
|
||||||
|
|
||||||
#CVE-2013-6405 rhbz 1035875 1035887
|
|
||||||
ApplyPatch inet-prevent-leakage-of-uninitialized-memory-to-user.patch
|
|
||||||
ApplyPatch inet-fix-addr_len-msg_namelen-assignment-in-recv_error-and-rxpmtu-functions.patch
|
|
||||||
|
|
||||||
#rhbz 958826
|
#rhbz 958826
|
||||||
ApplyPatch dell-laptop.patch
|
ApplyPatch dell-laptop.patch
|
||||||
|
|
||||||
@ -2305,6 +2233,9 @@ fi
|
|||||||
# ||----w |
|
# ||----w |
|
||||||
# || ||
|
# || ||
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Dec 09 2013 Justin M. Forbes <jforbes@fedoraproject.org> - 3.12.4-1
|
||||||
|
- Linux v3.12.4
|
||||||
|
|
||||||
* Thu Dec 05 2013 Josh Boyer <jwboyer@fedoraproject.org>
|
* Thu Dec 05 2013 Josh Boyer <jwboyer@fedoraproject.org>
|
||||||
- Add various fixes for keys crashes and an SELinux issue (rhbz 1035000)
|
- Add various fixes for keys crashes and an SELinux issue (rhbz 1035000)
|
||||||
|
|
||||||
|
@ -1,47 +0,0 @@
|
|||||||
Bugzilla: 985522
|
|
||||||
Upstream-status: 3.13
|
|
||||||
|
|
||||||
From a97ad0c4b447a132a322cedc3a5f7fa4cab4b304 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Miroslav Lichvar <mlichvar@redhat.com>
|
|
||||||
Date: Thu, 1 Aug 2013 19:31:35 +0200
|
|
||||||
Subject: [PATCH] ntp: Make periodic RTC update more reliable
|
|
||||||
|
|
||||||
The current code requires that the scheduled update of the RTC happens
|
|
||||||
in the closest tick to the half of the second. This seems to be
|
|
||||||
difficult to achieve reliably. The scheduled work may be missing the
|
|
||||||
target time by a tick or two and be constantly rescheduled every second.
|
|
||||||
|
|
||||||
Relax the limit to 10 ticks. As a typical RTC drifts in the 11-minute
|
|
||||||
update interval by several milliseconds, this shouldn't affect the
|
|
||||||
overall accuracy of the RTC much.
|
|
||||||
|
|
||||||
Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>
|
|
||||||
Signed-off-by: John Stultz <john.stultz@linaro.org>
|
|
||||||
---
|
|
||||||
kernel/time/ntp.c | 3 ++-
|
|
||||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c
|
|
||||||
index 8f5b3b9..ab1fa7c 100644
|
|
||||||
--- a/kernel/time/ntp.c
|
|
||||||
+++ b/kernel/time/ntp.c
|
|
||||||
@@ -475,6 +475,7 @@ static void sync_cmos_clock(struct work_struct *work)
|
|
||||||
* called as close as possible to 500 ms before the new second starts.
|
|
||||||
* This code is run on a timer. If the clock is set, that timer
|
|
||||||
* may not expire at the correct time. Thus, we adjust...
|
|
||||||
+ * We want the clock to be within a couple of ticks from the target.
|
|
||||||
*/
|
|
||||||
if (!ntp_synced()) {
|
|
||||||
/*
|
|
||||||
@@ -485,7 +486,7 @@ static void sync_cmos_clock(struct work_struct *work)
|
|
||||||
}
|
|
||||||
|
|
||||||
getnstimeofday(&now);
|
|
||||||
- if (abs(now.tv_nsec - (NSEC_PER_SEC / 2)) <= tick_nsec / 2) {
|
|
||||||
+ if (abs(now.tv_nsec - (NSEC_PER_SEC / 2)) <= tick_nsec * 5) {
|
|
||||||
struct timespec adjust = now;
|
|
||||||
|
|
||||||
fail = -ENODEV;
|
|
||||||
--
|
|
||||||
1.7.9.5
|
|
||||||
|
|
@ -1,87 +0,0 @@
|
|||||||
Bugzilla: 974072
|
|
||||||
Upstream-status: 3.13
|
|
||||||
|
|
||||||
Add support for new RF chip ID: 3070. It seems to be the same as 5370,
|
|
||||||
maybe vendor just put wrong value on the eeprom, but add this id anyway
|
|
||||||
since devices with it showed on the marked.
|
|
||||||
|
|
||||||
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
|
||||||
|
|
||||||
diff --git a/drivers/net/wireless/rt2x00/rt2800.h b/drivers/net/wireless/rt2x00/rt2800.h
|
|
||||||
index fa33b5e..e3eb952 100644
|
|
||||||
--- a/drivers/net/wireless/rt2x00/rt2800.h
|
|
||||||
+++ b/drivers/net/wireless/rt2x00/rt2800.h
|
|
||||||
@@ -52,6 +52,7 @@
|
|
||||||
* RF3322 2.4G 2T2R(RT3352/RT3371/RT3372/RT3391/RT3392)
|
|
||||||
* RF3053 2.4G/5G 3T3R(RT3883/RT3563/RT3573/RT3593/RT3662)
|
|
||||||
* RF5592 2.4G/5G 2T2R
|
|
||||||
+ * RF3070 2.4G 1T1R
|
|
||||||
* RF5360 2.4G 1T1R
|
|
||||||
* RF5370 2.4G 1T1R
|
|
||||||
* RF5390 2.4G 1T1R
|
|
||||||
@@ -70,6 +71,7 @@
|
|
||||||
#define RF3322 0x000c
|
|
||||||
#define RF3053 0x000d
|
|
||||||
#define RF5592 0x000f
|
|
||||||
+#define RF3070 0x3070
|
|
||||||
#define RF3290 0x3290
|
|
||||||
#define RF5360 0x5360
|
|
||||||
#define RF5370 0x5370
|
|
||||||
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
|
|
||||||
index 88ce656..d2f638f 100644
|
|
||||||
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
|
|
||||||
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
|
|
||||||
@@ -3152,6 +3152,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
|
|
||||||
case RF3322:
|
|
||||||
rt2800_config_channel_rf3322(rt2x00dev, conf, rf, info);
|
|
||||||
break;
|
|
||||||
+ case RF3070:
|
|
||||||
case RF5360:
|
|
||||||
case RF5370:
|
|
||||||
case RF5372:
|
|
||||||
@@ -3166,7 +3167,8 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
|
|
||||||
rt2800_config_channel_rf2xxx(rt2x00dev, conf, rf, info);
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (rt2x00_rf(rt2x00dev, RF3290) ||
|
|
||||||
+ if (rt2x00_rf(rt2x00dev, RF3070) ||
|
|
||||||
+ rt2x00_rf(rt2x00dev, RF3290) ||
|
|
||||||
rt2x00_rf(rt2x00dev, RF3322) ||
|
|
||||||
rt2x00_rf(rt2x00dev, RF5360) ||
|
|
||||||
rt2x00_rf(rt2x00dev, RF5370) ||
|
|
||||||
@@ -4264,6 +4266,7 @@ void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev)
|
|
||||||
rt2800_rfcsr_write(rt2x00dev, 7, rfcsr);
|
|
||||||
break;
|
|
||||||
case RF3053:
|
|
||||||
+ case RF3070:
|
|
||||||
case RF3290:
|
|
||||||
case RF5360:
|
|
||||||
case RF5370:
|
|
||||||
@@ -7021,6 +7024,7 @@ static int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
|
|
||||||
case RF3022:
|
|
||||||
case RF3052:
|
|
||||||
case RF3053:
|
|
||||||
+ case RF3070:
|
|
||||||
case RF3290:
|
|
||||||
case RF3320:
|
|
||||||
case RF3322:
|
|
||||||
@@ -7543,6 +7547,7 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
|
|
||||||
rt2x00_rf(rt2x00dev, RF2020) ||
|
|
||||||
rt2x00_rf(rt2x00dev, RF3021) ||
|
|
||||||
rt2x00_rf(rt2x00dev, RF3022) ||
|
|
||||||
+ rt2x00_rf(rt2x00dev, RF3070) ||
|
|
||||||
rt2x00_rf(rt2x00dev, RF3290) ||
|
|
||||||
rt2x00_rf(rt2x00dev, RF3320) ||
|
|
||||||
rt2x00_rf(rt2x00dev, RF3322) ||
|
|
||||||
@@ -7671,6 +7676,7 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
|
|
||||||
case RF3320:
|
|
||||||
case RF3052:
|
|
||||||
case RF3053:
|
|
||||||
+ case RF3070:
|
|
||||||
case RF3290:
|
|
||||||
case RF5360:
|
|
||||||
case RF5370:
|
|
||||||
--
|
|
||||||
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
|
|
||||||
the body of a message to majordomo@vger.kernel.org
|
|
||||||
More majordomo info at http://vger.kernel.org/majordomo-info.html
|
|
2
sources
2
sources
@ -1,2 +1,2 @@
|
|||||||
cc6ee608854e0da4b64f6c1ff8b6398c linux-3.12.tar.xz
|
cc6ee608854e0da4b64f6c1ff8b6398c linux-3.12.tar.xz
|
||||||
b7a603bf67e69936cf049fc6b37d9085 patch-3.12.3.xz
|
511b5a2f0de55b5e91fd293766ce182b patch-3.12.4.xz
|
||||||
|
@ -1,40 +0,0 @@
|
|||||||
Bugzilla: 998342
|
|
||||||
Upstream-status: 3.13
|
|
||||||
|
|
||||||
From 52f48d0d9aaa621ffa5e08d79da99a3f8c93b848 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Felix Fietkau <nbd@openwrt.org>
|
|
||||||
Date: Tue, 12 Nov 2013 16:34:41 +0100
|
|
||||||
Subject: [PATCH] usbnet: fix status interrupt urb handling
|
|
||||||
|
|
||||||
Since commit 7b0c5f21f348a66de495868b8df0284e8dfd6bbf
|
|
||||||
"sierra_net: keep status interrupt URB active", sierra_net triggers
|
|
||||||
status interrupt polling before the net_device is opened (in order to
|
|
||||||
properly receive the sync message response).
|
|
||||||
|
|
||||||
To be able to receive further interrupts, the interrupt urb needs to be
|
|
||||||
re-submitted, so this patch removes the bogus check for netif_running().
|
|
||||||
|
|
||||||
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
|
||||||
Tested-by: Dan Williams <dcbw@redhat.com>
|
|
||||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
||||||
---
|
|
||||||
drivers/net/usb/usbnet.c | 3 ---
|
|
||||||
1 file changed, 3 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
|
|
||||||
index 90a429b..8494bb5 100644
|
|
||||||
--- a/drivers/net/usb/usbnet.c
|
|
||||||
+++ b/drivers/net/usb/usbnet.c
|
|
||||||
@@ -204,9 +204,6 @@ static void intr_complete (struct urb *urb)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (!netif_running (dev->net))
|
|
||||||
- return;
|
|
||||||
-
|
|
||||||
status = usb_submit_urb (urb, GFP_ATOMIC);
|
|
||||||
if (status != 0)
|
|
||||||
netif_err(dev, timer, dev->net,
|
|
||||||
--
|
|
||||||
1.8.3.1
|
|
||||||
|
|
@ -1,42 +0,0 @@
|
|||||||
Bugzilla: 998732
|
|
||||||
Upstream-status: 3.13
|
|
||||||
|
|
||||||
From: Julian Stecklina <jsteckli@os.info.tu-dresden.de>
|
|
||||||
Subject: [PATCH] vfio, iommu: Fixed interaction of VFIO_IOMMU_MAP_DMA with IOMMU address limits
|
|
||||||
|
|
||||||
The BUG_ON in drivers/iommu/intel-iommu.c:785 can be triggered from userspace via
|
|
||||||
VFIO by calling the VFIO_IOMMU_MAP_DMA ioctl on a vfio device with any address
|
|
||||||
beyond the addressing capabilities of the IOMMU. The problem is that the ioctl code
|
|
||||||
calls iommu_iova_to_phys before it calls iommu_map. iommu_map handles the case that
|
|
||||||
it gets addresses beyond the addressing capabilities of its IOMMU.
|
|
||||||
intel_iommu_iova_to_phys does not.
|
|
||||||
|
|
||||||
This patch fixes iommu_iova_to_phys to return NULL for addresses beyond what the
|
|
||||||
IOMMU can handle. This in turn causes the ioctl call to fail in iommu_map and
|
|
||||||
(correctly) return EFAULT to the user with a helpful warning message in the kernel
|
|
||||||
log.
|
|
||||||
|
|
||||||
Signed-off-by: Julian Stecklina <jsteckli@os.inf.tu-dresden.de>
|
|
||||||
---
|
|
||||||
drivers/iommu/intel-iommu.c | 6 +++++-
|
|
||||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
|
|
||||||
index eec0d3e..61303db 100644
|
|
||||||
--- a/drivers/iommu/intel-iommu.c
|
|
||||||
+++ b/drivers/iommu/intel-iommu.c
|
|
||||||
@@ -782,7 +782,11 @@ static struct dma_pte *pfn_to_dma_pte(struct dmar_domain *domain,
|
|
||||||
int offset;
|
|
||||||
|
|
||||||
BUG_ON(!domain->pgd);
|
|
||||||
- BUG_ON(addr_width < BITS_PER_LONG && pfn >> addr_width);
|
|
||||||
+
|
|
||||||
+ if (addr_width < BITS_PER_LONG && pfn >> addr_width)
|
|
||||||
+ /* Address beyond IOMMU's addressing capabilities. */
|
|
||||||
+ return NULL;
|
|
||||||
+
|
|
||||||
parent = domain->pgd;
|
|
||||||
|
|
||||||
while (level > 0) {
|
|
||||||
--
|
|
||||||
1.8.3.1
|
|
@ -1,121 +0,0 @@
|
|||||||
Bugzilla: 1022733
|
|
||||||
Upstream: Submitted for 3.13 and 3.12.y stable
|
|
||||||
Delivered-To: jwboyer@gmail.com
|
|
||||||
Received: by 10.76.104.107 with SMTP id gd11csp116929oab;
|
|
||||||
Mon, 25 Nov 2013 15:45:36 -0800 (PST)
|
|
||||||
X-Received: by 10.68.254.105 with SMTP id ah9mr20726084pbd.87.1385423136297;
|
|
||||||
Mon, 25 Nov 2013 15:45:36 -0800 (PST)
|
|
||||||
Return-Path: <netdev-owner@vger.kernel.org>
|
|
||||||
Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67])
|
|
||||||
by mx.google.com with ESMTP id am2si28999873pad.96.2013.11.25.15.44.53
|
|
||||||
for <multiple recipients>;
|
|
||||||
Mon, 25 Nov 2013 15:45:36 -0800 (PST)
|
|
||||||
Received-SPF: pass (google.com: best guess record for domain of netdev-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67;
|
|
||||||
Authentication-Results: mx.google.com;
|
|
||||||
spf=pass (google.com: best guess record for domain of netdev-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mail=netdev-owner@vger.kernel.org
|
|
||||||
Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand
|
|
||||||
id S1753536Ab3KYXl6 (ORCPT <rfc822;lnxuff@gmail.com> + 99 others);
|
|
||||||
Mon, 25 Nov 2013 18:41:58 -0500
|
|
||||||
Received: from violet.fr.zoreil.com ([92.243.8.30]:57806 "EHLO
|
|
||||||
violet.fr.zoreil.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org
|
|
||||||
with ESMTP id S1751913Ab3KYXlz (ORCPT
|
|
||||||
<rfc822;netdev@vger.kernel.org>); Mon, 25 Nov 2013 18:41:55 -0500
|
|
||||||
Received: from violet.fr.zoreil.com (localhost [127.0.0.1])
|
|
||||||
by violet.fr.zoreil.com (8.14.5/8.14.5) with ESMTP id rAPNewrt012676;
|
|
||||||
Tue, 26 Nov 2013 00:40:58 +0100
|
|
||||||
Received: (from romieu@localhost)
|
|
||||||
by violet.fr.zoreil.com (8.14.5/8.14.5/Submit) id rAPNewbX012675;
|
|
||||||
Tue, 26 Nov 2013 00:40:58 +0100
|
|
||||||
Date: Tue, 26 Nov 2013 00:40:58 +0100
|
|
||||||
From: Francois Romieu <romieu@fr.zoreil.com>
|
|
||||||
To: netdev@vger.kernel.org
|
|
||||||
Cc: David Miller <davem@davemloft.net>,
|
|
||||||
"Alex A. Schmidt" <aaschmidt1@gmail.com>,
|
|
||||||
Michele Baldessari <michele@acksyn.org>,
|
|
||||||
Jamie Heilman <jamie@audible.transient.net>,
|
|
||||||
Julia Lawall <Julia.Lawall@lip6.fr>
|
|
||||||
Subject: [PATCH net 1/1] via-velocity: fix netif_receive_skb use in irq
|
|
||||||
disabled section.
|
|
||||||
Message-ID: <20131125234058.GA12566@electric-eye.fr.zoreil.com>
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=us-ascii
|
|
||||||
Content-Disposition: inline
|
|
||||||
X-Organisation: Land of Sunshine Inc.
|
|
||||||
User-Agent: Mutt/1.5.21 (2010-09-15)
|
|
||||||
Sender: netdev-owner@vger.kernel.org
|
|
||||||
Precedence: bulk
|
|
||||||
List-ID: <netdev.vger.kernel.org>
|
|
||||||
X-Mailing-List: netdev@vger.kernel.org
|
|
||||||
|
|
||||||
2fdac010bdcf10a30711b6924612dfc40daf19b8 ("via-velocity.c: update napi
|
|
||||||
implementation") overlooked an irq disabling spinlock when the Rx part
|
|
||||||
of the NAPI poll handler was converted from netif_rx to netif_receive_skb.
|
|
||||||
|
|
||||||
NAPI Rx processing can be taken out of the locked section with a pair of
|
|
||||||
napi_{disable / enable} since it only races with the MTU change function.
|
|
||||||
|
|
||||||
An heavier rework of the NAPI locking would be able to perform NAPI Tx
|
|
||||||
before Rx where I simply removed one of velocity_tx_srv calls.
|
|
||||||
|
|
||||||
References: https://bugzilla.redhat.com/show_bug.cgi?id=1022733
|
|
||||||
Fixes: 2fdac010bdcf (via-velocity.c: update napi implementation)
|
|
||||||
Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
|
|
||||||
Tested-by: Alex A. Schmidt <aaschmidt1@gmail.com>
|
|
||||||
Cc: Jamie Heilman <jamie@audible.transient.net>
|
|
||||||
Cc: Michele Baldessari <michele@acksyn.org>
|
|
||||||
Cc: Julia Lawall <Julia.Lawall@lip6.fr>
|
|
||||||
---
|
|
||||||
|
|
||||||
It is relevant for stable 3.11.x and 3.12.y.
|
|
||||||
|
|
||||||
drivers/net/ethernet/via/via-velocity.c | 11 ++++++-----
|
|
||||||
1 file changed, 6 insertions(+), 5 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/drivers/net/ethernet/via/via-velocity.c b/drivers/net/ethernet/via/via-velocity.c
|
|
||||||
index d022bf9..ad61d26 100644
|
|
||||||
--- a/drivers/net/ethernet/via/via-velocity.c
|
|
||||||
+++ b/drivers/net/ethernet/via/via-velocity.c
|
|
||||||
@@ -2172,16 +2172,13 @@ static int velocity_poll(struct napi_struct *napi, int budget)
|
|
||||||
unsigned int rx_done;
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
- spin_lock_irqsave(&vptr->lock, flags);
|
|
||||||
/*
|
|
||||||
* Do rx and tx twice for performance (taken from the VIA
|
|
||||||
* out-of-tree driver).
|
|
||||||
*/
|
|
||||||
- rx_done = velocity_rx_srv(vptr, budget / 2);
|
|
||||||
- velocity_tx_srv(vptr);
|
|
||||||
- rx_done += velocity_rx_srv(vptr, budget - rx_done);
|
|
||||||
+ rx_done = velocity_rx_srv(vptr, budget);
|
|
||||||
+ spin_lock_irqsave(&vptr->lock, flags);
|
|
||||||
velocity_tx_srv(vptr);
|
|
||||||
-
|
|
||||||
/* If budget not fully consumed, exit the polling mode */
|
|
||||||
if (rx_done < budget) {
|
|
||||||
napi_complete(napi);
|
|
||||||
@@ -2342,6 +2339,8 @@ static int velocity_change_mtu(struct net_device *dev, int new_mtu)
|
|
||||||
if (ret < 0)
|
|
||||||
goto out_free_tmp_vptr_1;
|
|
||||||
|
|
||||||
+ napi_disable(&vptr->napi);
|
|
||||||
+
|
|
||||||
spin_lock_irqsave(&vptr->lock, flags);
|
|
||||||
|
|
||||||
netif_stop_queue(dev);
|
|
||||||
@@ -2362,6 +2361,8 @@ static int velocity_change_mtu(struct net_device *dev, int new_mtu)
|
|
||||||
|
|
||||||
velocity_give_many_rx_descs(vptr);
|
|
||||||
|
|
||||||
+ napi_enable(&vptr->napi);
|
|
||||||
+
|
|
||||||
mac_enable_int(vptr->mac_regs);
|
|
||||||
netif_start_queue(dev);
|
|
||||||
|
|
||||||
--
|
|
||||||
1.8.3.1
|
|
||||||
|
|
||||||
--
|
|
||||||
To unsubscribe from this list: send the line "unsubscribe netdev" in
|
|
||||||
the body of a message to majordomo@vger.kernel.org
|
|
||||||
More majordomo info at http://vger.kernel.org/majordomo-info.html
|
|
Loading…
Reference in New Issue
Block a user