* [PATCH] netfilter: ipv4: fix NULL dereference @ 2016-03-23 14:27 Liping Zhang 2016-03-24 8:00 ` Nikolay Borisov 2016-03-24 20:22 ` Pablo Neira Ayuso 0 siblings, 2 replies; 8+ messages in thread From: Liping Zhang @ 2016-03-23 14:27 UTC (permalink / raw) To: netfilter-devel, pablo, kaber, davem; +Cc: kernel, Liping Zhang From: Liping Zhang <liping.zhang@spreadtrum.com> Commit fa50d974d104 ("ipv4: Namespaceify ip_default_ttl sysctl knob") introduce the namespaceify ip_default_ttl, but sk_buff->sk maybe NULL, so sock_net(skb->sk) will dereference the NULL pointer and oops will happen. Signed-off-by: Liping Zhang <liping.zhang@spreadtrum.com> --- net/bridge/netfilter/nft_reject_bridge.c | 20 ++++++++++---------- net/ipv4/netfilter/ipt_SYNPROXY.c | 16 ++++++++++------ 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/net/bridge/netfilter/nft_reject_bridge.c b/net/bridge/netfilter/nft_reject_bridge.c index adc8d72..77f7e7a 100644 --- a/net/bridge/netfilter/nft_reject_bridge.c +++ b/net/bridge/netfilter/nft_reject_bridge.c @@ -40,7 +40,8 @@ static void nft_reject_br_push_etherhdr(struct sk_buff *oldskb, /* We cannot use oldskb->dev, it can be either bridge device (NF_BRIDGE INPUT) * or the bridge port (NF_BRIDGE PREROUTING). */ -static void nft_reject_br_send_v4_tcp_reset(struct sk_buff *oldskb, +static void nft_reject_br_send_v4_tcp_reset(struct net *net, + struct sk_buff *oldskb, const struct net_device *dev, int hook) { @@ -48,7 +49,6 @@ static void nft_reject_br_send_v4_tcp_reset(struct sk_buff *oldskb, struct iphdr *niph; const struct tcphdr *oth; struct tcphdr _oth; - struct net *net = sock_net(oldskb->sk); if (!nft_bridge_iphdr_validate(oldskb)) return; @@ -75,7 +75,8 @@ static void nft_reject_br_send_v4_tcp_reset(struct sk_buff *oldskb, br_deliver(br_port_get_rcu(dev), nskb); } -static void nft_reject_br_send_v4_unreach(struct sk_buff *oldskb, +static void nft_reject_br_send_v4_unreach(struct net *net, + struct sk_buff *oldskb, const struct net_device *dev, int hook, u8 code) { @@ -86,7 +87,6 @@ static void nft_reject_br_send_v4_unreach(struct sk_buff *oldskb, void *payload; __wsum csum; u8 proto; - struct net *net = sock_net(oldskb->sk); if (oldskb->csum_bad || !nft_bridge_iphdr_validate(oldskb)) return; @@ -273,17 +273,17 @@ static void nft_reject_bridge_eval(const struct nft_expr *expr, case htons(ETH_P_IP): switch (priv->type) { case NFT_REJECT_ICMP_UNREACH: - nft_reject_br_send_v4_unreach(pkt->skb, pkt->in, - pkt->hook, + nft_reject_br_send_v4_unreach(pkt->net, pkt->skb, + pkt->in, pkt->hook, priv->icmp_code); break; case NFT_REJECT_TCP_RST: - nft_reject_br_send_v4_tcp_reset(pkt->skb, pkt->in, - pkt->hook); + nft_reject_br_send_v4_tcp_reset(pkt->net, pkt->skb, + pkt->in, pkt->hook); break; case NFT_REJECT_ICMPX_UNREACH: - nft_reject_br_send_v4_unreach(pkt->skb, pkt->in, - pkt->hook, + nft_reject_br_send_v4_unreach(pkt->net, pkt->skb, + pkt->in, pkt->hook, nft_reject_icmp_code(priv->icmp_code)); break; } diff --git a/net/ipv4/netfilter/ipt_SYNPROXY.c b/net/ipv4/netfilter/ipt_SYNPROXY.c index 7b8fbb3..6b4f501 100644 --- a/net/ipv4/netfilter/ipt_SYNPROXY.c +++ b/net/ipv4/netfilter/ipt_SYNPROXY.c @@ -18,10 +18,10 @@ #include <net/netfilter/nf_conntrack_synproxy.h> static struct iphdr * -synproxy_build_ip(struct sk_buff *skb, __be32 saddr, __be32 daddr) +synproxy_build_ip(struct net *net, struct sk_buff *skb, __be32 saddr, + __be32 daddr) { struct iphdr *iph; - struct net *net = sock_net(skb->sk); skb_reset_network_header(skb); iph = (struct iphdr *)skb_put(skb, sizeof(*iph)); @@ -91,7 +91,8 @@ synproxy_send_client_synack(const struct synproxy_net *snet, return; skb_reserve(nskb, MAX_TCP_HEADER); - niph = synproxy_build_ip(nskb, iph->daddr, iph->saddr); + niph = synproxy_build_ip(nf_ct_net(snet->tmpl), nskb, iph->daddr, + iph->saddr); skb_reset_transport_header(nskb); nth = (struct tcphdr *)skb_put(nskb, tcp_hdr_size); @@ -132,7 +133,8 @@ synproxy_send_server_syn(const struct synproxy_net *snet, return; skb_reserve(nskb, MAX_TCP_HEADER); - niph = synproxy_build_ip(nskb, iph->saddr, iph->daddr); + niph = synproxy_build_ip(nf_ct_net(snet->tmpl), nskb, iph->saddr, + iph->daddr); skb_reset_transport_header(nskb); nth = (struct tcphdr *)skb_put(nskb, tcp_hdr_size); @@ -177,7 +179,8 @@ synproxy_send_server_ack(const struct synproxy_net *snet, return; skb_reserve(nskb, MAX_TCP_HEADER); - niph = synproxy_build_ip(nskb, iph->daddr, iph->saddr); + niph = synproxy_build_ip(nf_ct_net(snet->tmpl), nskb, iph->daddr, + iph->saddr); skb_reset_transport_header(nskb); nth = (struct tcphdr *)skb_put(nskb, tcp_hdr_size); @@ -215,7 +218,8 @@ synproxy_send_client_ack(const struct synproxy_net *snet, return; skb_reserve(nskb, MAX_TCP_HEADER); - niph = synproxy_build_ip(nskb, iph->saddr, iph->daddr); + niph = synproxy_build_ip(nf_ct_net(snet->tmpl), nskb, iph->saddr, + iph->daddr); skb_reset_transport_header(nskb); nth = (struct tcphdr *)skb_put(nskb, tcp_hdr_size); -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH] netfilter: ipv4: fix NULL dereference 2016-03-23 14:27 [PATCH] netfilter: ipv4: fix NULL dereference Liping Zhang @ 2016-03-24 8:00 ` Nikolay Borisov [not found] ` <54382a12.8a92.153a7ba19ff.Coremail.zlpwmdx@163.com> 2016-03-24 20:16 ` Pablo Neira Ayuso 2016-03-24 20:22 ` Pablo Neira Ayuso 1 sibling, 2 replies; 8+ messages in thread From: Nikolay Borisov @ 2016-03-24 8:00 UTC (permalink / raw) To: Liping Zhang, netfilter-devel, pablo, kaber, davem; +Cc: Liping Zhang I've been running production kernels in production with those changes and so far I haven't observed a single crash resulting from this. Furthermore, I believe that all the call sites of synproxy_build_ip should have the skb associated with a valid tcp socket, which must have originated from a particular namespace. On 03/23/2016 04:27 PM, Liping Zhang wrote: > From: Liping Zhang <liping.zhang@spreadtrum.com> > > Commit fa50d974d104 ("ipv4: Namespaceify ip_default_ttl sysctl knob") > introduce the namespaceify ip_default_ttl, but sk_buff->sk maybe NULL, > so sock_net(skb->sk) will dereference the NULL pointer and oops will > happen. > > Signed-off-by: Liping Zhang <liping.zhang@spreadtrum.com> > --- > net/bridge/netfilter/nft_reject_bridge.c | 20 ++++++++++---------- > net/ipv4/netfilter/ipt_SYNPROXY.c | 16 ++++++++++------ > 2 files changed, 20 insertions(+), 16 deletions(-) > > diff --git a/net/bridge/netfilter/nft_reject_bridge.c b/net/bridge/netfilter/nft_reject_bridge.c > index adc8d72..77f7e7a 100644 > --- a/net/bridge/netfilter/nft_reject_bridge.c > +++ b/net/bridge/netfilter/nft_reject_bridge.c > @@ -40,7 +40,8 @@ static void nft_reject_br_push_etherhdr(struct sk_buff *oldskb, > /* We cannot use oldskb->dev, it can be either bridge device (NF_BRIDGE INPUT) > * or the bridge port (NF_BRIDGE PREROUTING). > */ > -static void nft_reject_br_send_v4_tcp_reset(struct sk_buff *oldskb, > +static void nft_reject_br_send_v4_tcp_reset(struct net *net, > + struct sk_buff *oldskb, > const struct net_device *dev, > int hook) > { > @@ -48,7 +49,6 @@ static void nft_reject_br_send_v4_tcp_reset(struct sk_buff *oldskb, > struct iphdr *niph; > const struct tcphdr *oth; > struct tcphdr _oth; > - struct net *net = sock_net(oldskb->sk); > > if (!nft_bridge_iphdr_validate(oldskb)) > return; > @@ -75,7 +75,8 @@ static void nft_reject_br_send_v4_tcp_reset(struct sk_buff *oldskb, > br_deliver(br_port_get_rcu(dev), nskb); > } > > -static void nft_reject_br_send_v4_unreach(struct sk_buff *oldskb, > +static void nft_reject_br_send_v4_unreach(struct net *net, > + struct sk_buff *oldskb, > const struct net_device *dev, > int hook, u8 code) > { > @@ -86,7 +87,6 @@ static void nft_reject_br_send_v4_unreach(struct sk_buff *oldskb, > void *payload; > __wsum csum; > u8 proto; > - struct net *net = sock_net(oldskb->sk); > > if (oldskb->csum_bad || !nft_bridge_iphdr_validate(oldskb)) > return; > @@ -273,17 +273,17 @@ static void nft_reject_bridge_eval(const struct nft_expr *expr, > case htons(ETH_P_IP): > switch (priv->type) { > case NFT_REJECT_ICMP_UNREACH: > - nft_reject_br_send_v4_unreach(pkt->skb, pkt->in, > - pkt->hook, > + nft_reject_br_send_v4_unreach(pkt->net, pkt->skb, > + pkt->in, pkt->hook, > priv->icmp_code); > break; > case NFT_REJECT_TCP_RST: > - nft_reject_br_send_v4_tcp_reset(pkt->skb, pkt->in, > - pkt->hook); > + nft_reject_br_send_v4_tcp_reset(pkt->net, pkt->skb, > + pkt->in, pkt->hook); > break; > case NFT_REJECT_ICMPX_UNREACH: > - nft_reject_br_send_v4_unreach(pkt->skb, pkt->in, > - pkt->hook, > + nft_reject_br_send_v4_unreach(pkt->net, pkt->skb, > + pkt->in, pkt->hook, > nft_reject_icmp_code(priv->icmp_code)); > break; > } > diff --git a/net/ipv4/netfilter/ipt_SYNPROXY.c b/net/ipv4/netfilter/ipt_SYNPROXY.c > index 7b8fbb3..6b4f501 100644 > --- a/net/ipv4/netfilter/ipt_SYNPROXY.c > +++ b/net/ipv4/netfilter/ipt_SYNPROXY.c > @@ -18,10 +18,10 @@ > #include <net/netfilter/nf_conntrack_synproxy.h> > > static struct iphdr * > -synproxy_build_ip(struct sk_buff *skb, __be32 saddr, __be32 daddr) > +synproxy_build_ip(struct net *net, struct sk_buff *skb, __be32 saddr, > + __be32 daddr) > { > struct iphdr *iph; > - struct net *net = sock_net(skb->sk); > > skb_reset_network_header(skb); > iph = (struct iphdr *)skb_put(skb, sizeof(*iph)); > @@ -91,7 +91,8 @@ synproxy_send_client_synack(const struct synproxy_net *snet, > return; > skb_reserve(nskb, MAX_TCP_HEADER); > > - niph = synproxy_build_ip(nskb, iph->daddr, iph->saddr); > + niph = synproxy_build_ip(nf_ct_net(snet->tmpl), nskb, iph->daddr, > + iph->saddr); > > skb_reset_transport_header(nskb); > nth = (struct tcphdr *)skb_put(nskb, tcp_hdr_size); > @@ -132,7 +133,8 @@ synproxy_send_server_syn(const struct synproxy_net *snet, > return; > skb_reserve(nskb, MAX_TCP_HEADER); > > - niph = synproxy_build_ip(nskb, iph->saddr, iph->daddr); > + niph = synproxy_build_ip(nf_ct_net(snet->tmpl), nskb, iph->saddr, > + iph->daddr); > > skb_reset_transport_header(nskb); > nth = (struct tcphdr *)skb_put(nskb, tcp_hdr_size); > @@ -177,7 +179,8 @@ synproxy_send_server_ack(const struct synproxy_net *snet, > return; > skb_reserve(nskb, MAX_TCP_HEADER); > > - niph = synproxy_build_ip(nskb, iph->daddr, iph->saddr); > + niph = synproxy_build_ip(nf_ct_net(snet->tmpl), nskb, iph->daddr, > + iph->saddr); > > skb_reset_transport_header(nskb); > nth = (struct tcphdr *)skb_put(nskb, tcp_hdr_size); > @@ -215,7 +218,8 @@ synproxy_send_client_ack(const struct synproxy_net *snet, > return; > skb_reserve(nskb, MAX_TCP_HEADER); > > - niph = synproxy_build_ip(nskb, iph->saddr, iph->daddr); > + niph = synproxy_build_ip(nf_ct_net(snet->tmpl), nskb, iph->saddr, > + iph->daddr); > > skb_reset_transport_header(nskb); > nth = (struct tcphdr *)skb_put(nskb, tcp_hdr_size); > ^ permalink raw reply [flat|nested] 8+ messages in thread
[parent not found: <54382a12.8a92.153a7ba19ff.Coremail.zlpwmdx@163.com>]
* Re: [PATCH] netfilter: ipv4: fix NULL dereference [not found] ` <54382a12.8a92.153a7ba19ff.Coremail.zlpwmdx@163.com> @ 2016-03-24 8:45 ` Nikolay Borisov 0 siblings, 0 replies; 8+ messages in thread From: Nikolay Borisov @ 2016-03-24 8:45 UTC (permalink / raw) To: 张李平 Cc: netfilter-devel, pablo, kaber, davem, Liping Zhang On 03/24/2016 10:25 AM, 张李平 wrote: > At 2016-03-24 16:00:02, "Nikolay Borisov" <kernel@kyup.com> wrote: >> I've been running production kernels in production with those changes >> and so far I haven't observed a single crash resulting from this. > > Did you run the test with the CONFIG_NET_NS config enabled? Of course, why else would I author the patches :) > > >> Furthermore, I believe that all the call sites of synproxy_build_ip >> should have the skb associated with a valid tcp socket, which must have > >> originated from a particular namespace. > > > Actually, the sk_buff passed to synproxy_build_ip() are all alloced by > alloc_skb, and was not associated with a specific tcp socket, so skb->sk > is always NULL. Further more, SYNPROXY target can be used to proxy > the tcp connections which are not local, i.e. tcp sockets was located on > other hosts. Admittedly I'm not using the synproxy module so that might explain why I haven't seen crashes. In any case you can add my: Reviewed-by: Nikolay Borisov <kernel@kyup.com> > > >> >> On 03/23/2016 04:27 PM, Liping Zhang wrote: >>> From: Liping Zhang <liping.zhang@spreadtrum.com> >>> >>> Commit fa50d974d104 ("ipv4: Namespaceify ip_default_ttl sysctl knob") >>> introduce the namespaceify ip_default_ttl, but sk_buff->sk maybe NULL, >>> so sock_net(skb->sk) will dereference the NULL pointer and oops will >>> happen. >>> >>> Signed-off-by: Liping Zhang <liping.zhang@spreadtrum.com> >>> --- >>> net/bridge/netfilter/nft_reject_bridge.c | 20 ++++++++++---------- >>> net/ipv4/netfilter/ipt_SYNPROXY.c | 16 ++++++++++------ >>> 2 files changed, 20 insertions(+), 16 deletions(-) >>> >>> diff --git a/net/bridge/netfilter/nft_reject_bridge.c b/net/bridge/netfilter/nft_reject_bridge.c >>> index adc8d72..77f7e7a 100644 >>> --- a/net/bridge/netfilter/nft_reject_bridge.c >>> +++ b/net/bridge/netfilter/nft_reject_bridge.c >>> @@ -40,7 +40,8 @@ static void nft_reject_br_push_etherhdr(struct sk_buff *oldskb, >>> /* We cannot use oldskb->dev, it can be either bridge device (NF_BRIDGE INPUT) >>> * or the bridge port (NF_BRIDGE PREROUTING). >>> */ >>> -static void nft_reject_br_send_v4_tcp_reset(struct sk_buff *oldskb, >>> +static void nft_reject_br_send_v4_tcp_reset(struct net *net, >>> + struct sk_buff *oldskb, >>> const struct net_device *dev, >>> int hook) >>> { >>> @@ -48,7 +49,6 @@ static void nft_reject_br_send_v4_tcp_reset(struct sk_buff *oldskb, >>> struct iphdr *niph; >>> const struct tcphdr *oth; >>> struct tcphdr _oth; >>> - struct net *net = sock_net(oldskb->sk); >>> >>> if (!nft_bridge_iphdr_validate(oldskb)) >>> return; >>> @@ -75,7 +75,8 @@ static void nft_reject_br_send_v4_tcp_reset(struct sk_buff *oldskb, >>> br_deliver(br_port_get_rcu(dev), nskb); >>> } >>> >>> -static void nft_reject_br_send_v4_unreach(struct sk_buff *oldskb, >>> +static void nft_reject_br_send_v4_unreach(struct net *net, >>> + struct sk_buff *oldskb, >>> const struct net_device *dev, >>> int hook, u8 code) >>> { >>> @@ -86,7 +87,6 @@ static void nft_reject_br_send_v4_unreach(struct sk_buff *oldskb, >>> void *payload; >>> __wsum csum; >>> u8 proto; >>> - struct net *net = sock_net(oldskb->sk); >>> >>> if (oldskb->csum_bad || !nft_bridge_iphdr_validate(oldskb)) >>> return; >>> @@ -273,17 +273,17 @@ static void nft_reject_bridge_eval(const struct nft_expr *expr, >>> case htons(ETH_P_IP): >>> switch (priv->type) { >>> case NFT_REJECT_ICMP_UNREACH: >>> - nft_reject_br_send_v4_unreach(pkt->skb, pkt->in, >>> - pkt->hook, >>> + nft_reject_br_send_v4_unreach(pkt->net, pkt->skb, >>> + pkt->in, pkt->hook, >>> priv->icmp_code); >>> break; >>> case NFT_REJECT_TCP_RST: >>> - nft_reject_br_send_v4_tcp_reset(pkt->skb, pkt->in, >>> - pkt->hook); >>> + nft_reject_br_send_v4_tcp_reset(pkt->net, pkt->skb, >>> + pkt->in, pkt->hook); >>> break; >>> case NFT_REJECT_ICMPX_UNREACH: >>> - nft_reject_br_send_v4_unreach(pkt->skb, pkt->in, >>> - pkt->hook, >>> + nft_reject_br_send_v4_unreach(pkt->net, pkt->skb, >>> + pkt->in, pkt->hook, >>> nft_reject_icmp_code(priv->icmp_code)); >>> break; >>> } >>> diff --git a/net/ipv4/netfilter/ipt_SYNPROXY.c b/net/ipv4/netfilter/ipt_SYNPROXY.c >>> index 7b8fbb3..6b4f501 100644 >>> --- a/net/ipv4/netfilter/ipt_SYNPROXY.c >>> +++ b/net/ipv4/netfilter/ipt_SYNPROXY.c >>> @@ -18,10 +18,10 @@ >>> #include <net/netfilter/nf_conntrack_synproxy.h> >>> >>> static struct iphdr * >>> -synproxy_build_ip(struct sk_buff *skb, __be32 saddr, __be32 daddr) >>> +synproxy_build_ip(struct net *net, struct sk_buff *skb, __be32 saddr, >>> + __be32 daddr) >>> { >>> struct iphdr *iph; >>> - struct net *net = sock_net(skb->sk); >>> >>> skb_reset_network_header(skb); >>> iph = (struct iphdr *)skb_put(skb, sizeof(*iph)); >>> @@ -91,7 +91,8 @@ synproxy_send_client_synack(const struct synproxy_net *snet, >>> return; >>> skb_reserve(nskb, MAX_TCP_HEADER); >>> >>> - niph = synproxy_build_ip(nskb, iph->daddr, iph->saddr); >>> + niph = synproxy_build_ip(nf_ct_net(snet->tmpl), nskb, iph->daddr, >>> + iph->saddr); >>> >>> skb_reset_transport_header(nskb); >>> nth = (struct tcphdr *)skb_put(nskb, tcp_hdr_size); >>> @@ -132,7 +133,8 @@ synproxy_send_server_syn(const struct synproxy_net *snet, >>> return; >>> skb_reserve(nskb, MAX_TCP_HEADER); >>> >>> - niph = synproxy_build_ip(nskb, iph->saddr, iph->daddr); >>> + niph = synproxy_build_ip(nf_ct_net(snet->tmpl), nskb, iph->saddr, >>> + iph->daddr); >>> >>> skb_reset_transport_header(nskb); >>> nth = (struct tcphdr *)skb_put(nskb, tcp_hdr_size); >>> @@ -177,7 +179,8 @@ synproxy_send_server_ack(const struct synproxy_net *snet, >>> return; >>> skb_reserve(nskb, MAX_TCP_HEADER); >>> >>> - niph = synproxy_build_ip(nskb, iph->daddr, iph->saddr); >>> + niph = synproxy_build_ip(nf_ct_net(snet->tmpl), nskb, iph->daddr, >>> + iph->saddr); >>> >>> skb_reset_transport_header(nskb); >>> nth = (struct tcphdr *)skb_put(nskb, tcp_hdr_size); >>> @@ -215,7 +218,8 @@ synproxy_send_client_ack(const struct synproxy_net *snet, >>> return; >>> skb_reserve(nskb, MAX_TCP_HEADER); >>> >>> - niph = synproxy_build_ip(nskb, iph->saddr, iph->daddr); >>> + niph = synproxy_build_ip(nf_ct_net(snet->tmpl), nskb, iph->saddr, >>> + iph->daddr); >>> >>> skb_reset_transport_header(nskb); >>> nth = (struct tcphdr *)skb_put(nskb, tcp_hdr_size); >>> -- To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] netfilter: ipv4: fix NULL dereference 2016-03-24 8:00 ` Nikolay Borisov [not found] ` <54382a12.8a92.153a7ba19ff.Coremail.zlpwmdx@163.com> @ 2016-03-24 20:16 ` Pablo Neira Ayuso 1 sibling, 0 replies; 8+ messages in thread From: Pablo Neira Ayuso @ 2016-03-24 20:16 UTC (permalink / raw) To: Nikolay Borisov; +Cc: Liping Zhang, netfilter-devel, kaber, davem, Liping Zhang On Thu, Mar 24, 2016 at 10:00:02AM +0200, Nikolay Borisov wrote: > I've been running production kernels in production with those changes > and so far I haven't observed a single crash resulting from this. > Furthermore, I believe that all the call sites of synproxy_build_ip > should have the skb associated with a valid tcp socket, which must have > originated from a particular namespace. Please, always Cc: netfilter-devel@vger.kernel.org for patches that modify netfilter code. Your change is buggy, we cannot assume skb->sk set on packets that are being forwarded, we could have detected this following this process. Thanks. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] netfilter: ipv4: fix NULL dereference 2016-03-23 14:27 [PATCH] netfilter: ipv4: fix NULL dereference Liping Zhang 2016-03-24 8:00 ` Nikolay Borisov @ 2016-03-24 20:22 ` Pablo Neira Ayuso 2016-03-25 6:38 ` Liping Zhang 2016-03-25 7:24 ` Liping Zhang 1 sibling, 2 replies; 8+ messages in thread From: Pablo Neira Ayuso @ 2016-03-24 20:22 UTC (permalink / raw) To: Liping Zhang; +Cc: netfilter-devel, kaber, davem, kernel, Liping Zhang On Wed, Mar 23, 2016 at 10:27:30PM +0800, Liping Zhang wrote: > diff --git a/net/ipv4/netfilter/ipt_SYNPROXY.c b/net/ipv4/netfilter/ipt_SYNPROXY.c > index 7b8fbb3..6b4f501 100644 > --- a/net/ipv4/netfilter/ipt_SYNPROXY.c > +++ b/net/ipv4/netfilter/ipt_SYNPROXY.c > @@ -18,10 +18,10 @@ > #include <net/netfilter/nf_conntrack_synproxy.h> > > static struct iphdr * > -synproxy_build_ip(struct sk_buff *skb, __be32 saddr, __be32 daddr) > +synproxy_build_ip(struct net *net, struct sk_buff *skb, __be32 saddr, > + __be32 daddr) > { > struct iphdr *iph; > - struct net *net = sock_net(skb->sk); > > skb_reset_network_header(skb); > iph = (struct iphdr *)skb_put(skb, sizeof(*iph)); > @@ -91,7 +91,8 @@ synproxy_send_client_synack(const struct synproxy_net *snet, > return; > skb_reserve(nskb, MAX_TCP_HEADER); > > - niph = synproxy_build_ip(nskb, iph->daddr, iph->saddr); > + niph = synproxy_build_ip(nf_ct_net(snet->tmpl), nskb, iph->daddr, > + iph->saddr); > > skb_reset_transport_header(nskb); > nth = (struct tcphdr *)skb_put(nskb, tcp_hdr_size); > @@ -132,7 +133,8 @@ synproxy_send_server_syn(const struct synproxy_net *snet, > return; > skb_reserve(nskb, MAX_TCP_HEADER); > > - niph = synproxy_build_ip(nskb, iph->saddr, iph->daddr); > + niph = synproxy_build_ip(nf_ct_net(snet->tmpl), nskb, iph->saddr, > + iph->daddr); Could you also pass net as parameter to synproxy_send_server_syn() ? par->net provides this from synproxy_tg4(). Thanks. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re:Re: [PATCH] netfilter: ipv4: fix NULL dereference 2016-03-24 20:22 ` Pablo Neira Ayuso @ 2016-03-25 6:38 ` Liping Zhang 2016-03-25 10:49 ` Pablo Neira Ayuso 2016-03-25 7:24 ` Liping Zhang 1 sibling, 1 reply; 8+ messages in thread From: Liping Zhang @ 2016-03-25 6:38 UTC (permalink / raw) To: Pablo Neira Ayuso; +Cc: netfilter-devel, kaber, davem, kernel, Liping Zhang At 2016-03-25 04:22:05, "Pablo Neira Ayuso" <pablo@netfilter.org> wrote: > >Could you also pass net as parameter to synproxy_send_server_syn() ? > >par->net provides this from synproxy_tg4(). Not pass the net but replace the first parameter 'snet' with 'net' seems better? snet is only used in synproxy_recv_client_ack->synproxy_send_server_syn call path, and in other call path, actually we only need net, and we can call synproxy_pernet(net) to get the snet. like follows: -synproxy_send_server_syn(const struct synproxy_net *snet, +synproxy_send_server_syn(struct net *net, -synproxy_recv_client_ack(const struct synproxy_net *snet, +synproxy_recv_client_ack(struct net *net, const struct sk_buff *skb, const struct tcphdr *th, struct synproxy_options *opts, u32 recv_seq) { + struct synproxy_net *snet = synproxy_pernet(net); > >Thanks. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Re: [PATCH] netfilter: ipv4: fix NULL dereference 2016-03-25 6:38 ` Liping Zhang @ 2016-03-25 10:49 ` Pablo Neira Ayuso 0 siblings, 0 replies; 8+ messages in thread From: Pablo Neira Ayuso @ 2016-03-25 10:49 UTC (permalink / raw) To: Liping Zhang; +Cc: netfilter-devel, kaber, davem, kernel, Liping Zhang On Fri, Mar 25, 2016 at 02:38:15PM +0800, Liping Zhang wrote: > At 2016-03-25 04:22:05, "Pablo Neira Ayuso" <pablo@netfilter.org> wrote: > > > >Could you also pass net as parameter to synproxy_send_server_syn() ? > > > >par->net provides this from synproxy_tg4(). > > Not pass the net but replace the first parameter 'snet' with 'net' seems better? > snet is only used in synproxy_recv_client_ack->synproxy_send_server_syn call path, > and in other call path, actually we only need net, and we can call synproxy_pernet(net) > to get the snet. > > like follows: > -synproxy_send_server_syn(const struct synproxy_net *snet, > +synproxy_send_server_syn(struct net *net, > > -synproxy_recv_client_ack(const struct synproxy_net *snet, > +synproxy_recv_client_ack(struct net *net, > const struct sk_buff *skb, const struct tcphdr *th, > struct synproxy_options *opts, u32 recv_seq) > { > + struct synproxy_net *snet = synproxy_pernet(net); Fine with me. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] netfilter: ipv4: fix NULL dereference 2016-03-24 20:22 ` Pablo Neira Ayuso 2016-03-25 6:38 ` Liping Zhang @ 2016-03-25 7:24 ` Liping Zhang 1 sibling, 0 replies; 8+ messages in thread From: Liping Zhang @ 2016-03-25 7:24 UTC (permalink / raw) To: Pablo Neira Ayuso; +Cc: netfilter-devel, kaber, davem, kernel, Liping Zhang At 2016-03-25 04:22:05, "Pablo Neira Ayuso" <pablo@netfilter.org> wrote: > >Could you also pass net as parameter to synproxy_send_server_syn() ? > >par->net provides this from synproxy_tg4(). Not pass the net but replace the first parameter 'snet' with 'net' seems better? snet is only used in synproxy_recv_client_ack->synproxy_send_server_syn call path, and in other call path, actually we only need net, and we can call synproxy_pernet(net) to get the snet. like follows: -synproxy_send_server_syn(const struct synproxy_net *snet, +synproxy_send_server_syn(struct net *net, -synproxy_recv_client_ack(const struct synproxy_net *snet, +synproxy_recv_client_ack(struct net *net, const struct sk_buff *skb, const struct tcphdr *th, struct synproxy_options *opts, u32 recv_seq) { + struct synproxy_net *snet = synproxy_pernet(net); > >Thanks. ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2016-03-25 10:49 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-03-23 14:27 [PATCH] netfilter: ipv4: fix NULL dereference Liping Zhang 2016-03-24 8:00 ` Nikolay Borisov [not found] ` <54382a12.8a92.153a7ba19ff.Coremail.zlpwmdx@163.com> 2016-03-24 8:45 ` Nikolay Borisov 2016-03-24 20:16 ` Pablo Neira Ayuso 2016-03-24 20:22 ` Pablo Neira Ayuso 2016-03-25 6:38 ` Liping Zhang 2016-03-25 10:49 ` Pablo Neira Ayuso 2016-03-25 7:24 ` Liping Zhang
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).