netfilter: ipv4: fix NULL dereference
Commit fa50d974d1
("ipv4: Namespaceify ip_default_ttl sysctl knob")
use sock_net(skb->sk) to get the net namespace, but we can't assume
that sk_buff->sk is always exist, so when it is NULL, oops will happen.
Signed-off-by: Liping Zhang <liping.zhang@spreadtrum.com>
Reviewed-by: Nikolay Borisov <kernel@kyup.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
这个提交包含在:
@@ -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;
|
||||
}
|
||||
|
在新工单中引用
屏蔽一个用户