netfilter: Pass socket pointer down through okfn().
On the output paths in particular, we have to sometimes deal with two socket contexts. First, and usually skb->sk, is the local socket that generated the frame. And second, is potentially the socket used to control a tunneling socket, such as one the encapsulates using UDP. We do not want to disassociate skb->sk when encapsulating in order to fix this, because that would break socket memory accounting. The most extreme case where this can cause huge problems is an AF_PACKET socket transmitting over a vxlan device. We hit code paths doing checks that assume they are dealing with an ipv4 socket, but are actually operating upon the AF_PACKET one. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
1c984f8a5d
commit
7026b1ddb6
@@ -512,7 +512,7 @@ static int dn_return_long(struct sk_buff *skb)
|
||||
*
|
||||
* Returns: result of input function if route is found, error code otherwise
|
||||
*/
|
||||
static int dn_route_rx_packet(struct sk_buff *skb)
|
||||
static int dn_route_rx_packet(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
struct dn_skb_cb *cb;
|
||||
int err;
|
||||
@@ -573,7 +573,8 @@ static int dn_route_rx_long(struct sk_buff *skb)
|
||||
ptr++;
|
||||
cb->hops = *ptr++; /* Visit Count */
|
||||
|
||||
return NF_HOOK(NFPROTO_DECNET, NF_DN_PRE_ROUTING, skb, skb->dev, NULL,
|
||||
return NF_HOOK(NFPROTO_DECNET, NF_DN_PRE_ROUTING, NULL, skb,
|
||||
skb->dev, NULL,
|
||||
dn_route_rx_packet);
|
||||
|
||||
drop_it:
|
||||
@@ -600,7 +601,8 @@ static int dn_route_rx_short(struct sk_buff *skb)
|
||||
ptr += 2;
|
||||
cb->hops = *ptr & 0x3f;
|
||||
|
||||
return NF_HOOK(NFPROTO_DECNET, NF_DN_PRE_ROUTING, skb, skb->dev, NULL,
|
||||
return NF_HOOK(NFPROTO_DECNET, NF_DN_PRE_ROUTING, NULL, skb,
|
||||
skb->dev, NULL,
|
||||
dn_route_rx_packet);
|
||||
|
||||
drop_it:
|
||||
@@ -608,7 +610,7 @@ drop_it:
|
||||
return NET_RX_DROP;
|
||||
}
|
||||
|
||||
static int dn_route_discard(struct sk_buff *skb)
|
||||
static int dn_route_discard(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
/*
|
||||
* I know we drop the packet here, but thats considered success in
|
||||
@@ -618,7 +620,7 @@ static int dn_route_discard(struct sk_buff *skb)
|
||||
return NET_RX_SUCCESS;
|
||||
}
|
||||
|
||||
static int dn_route_ptp_hello(struct sk_buff *skb)
|
||||
static int dn_route_ptp_hello(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
dn_dev_hello(skb);
|
||||
dn_neigh_pointopoint_hello(skb);
|
||||
@@ -704,22 +706,22 @@ int dn_route_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type
|
||||
switch (flags & DN_RT_CNTL_MSK) {
|
||||
case DN_RT_PKT_HELO:
|
||||
return NF_HOOK(NFPROTO_DECNET, NF_DN_HELLO,
|
||||
skb, skb->dev, NULL,
|
||||
NULL, skb, skb->dev, NULL,
|
||||
dn_route_ptp_hello);
|
||||
|
||||
case DN_RT_PKT_L1RT:
|
||||
case DN_RT_PKT_L2RT:
|
||||
return NF_HOOK(NFPROTO_DECNET, NF_DN_ROUTE,
|
||||
skb, skb->dev, NULL,
|
||||
NULL, skb, skb->dev, NULL,
|
||||
dn_route_discard);
|
||||
case DN_RT_PKT_ERTH:
|
||||
return NF_HOOK(NFPROTO_DECNET, NF_DN_HELLO,
|
||||
skb, skb->dev, NULL,
|
||||
NULL, skb, skb->dev, NULL,
|
||||
dn_neigh_router_hello);
|
||||
|
||||
case DN_RT_PKT_EEDH:
|
||||
return NF_HOOK(NFPROTO_DECNET, NF_DN_HELLO,
|
||||
skb, skb->dev, NULL,
|
||||
NULL, skb, skb->dev, NULL,
|
||||
dn_neigh_endnode_hello);
|
||||
}
|
||||
} else {
|
||||
@@ -768,7 +770,8 @@ static int dn_output(struct sock *sk, struct sk_buff *skb)
|
||||
cb->rt_flags |= DN_RT_F_IE;
|
||||
cb->hops = 0;
|
||||
|
||||
return NF_HOOK(NFPROTO_DECNET, NF_DN_LOCAL_OUT, skb, NULL, dev,
|
||||
return NF_HOOK(NFPROTO_DECNET, NF_DN_LOCAL_OUT, sk, skb,
|
||||
NULL, dev,
|
||||
dn_to_neigh_output);
|
||||
|
||||
error:
|
||||
@@ -816,7 +819,8 @@ static int dn_forward(struct sk_buff *skb)
|
||||
if (rt->rt_flags & RTCF_DOREDIRECT)
|
||||
cb->rt_flags |= DN_RT_F_IE;
|
||||
|
||||
return NF_HOOK(NFPROTO_DECNET, NF_DN_FORWARD, skb, dev, skb->dev,
|
||||
return NF_HOOK(NFPROTO_DECNET, NF_DN_FORWARD, NULL, skb,
|
||||
dev, skb->dev,
|
||||
dn_to_neigh_output);
|
||||
|
||||
drop:
|
||||
|
Reference in New Issue
Block a user