skb->sk can be set in the early_demux path. This can be problematic, as it
may be a time-wait socket, which will blow up in the ip6_output path when
we try to pull out the non-existent pinet6 pointer (the type-punning causes
that pointer to be garbage).
This patch orphans the skb if it's not a local socket, so we no longer have
to worry about running into the time-wait problem from early demux.
Signed-off-by: Alex Gartrell <agartrell@xxxxxx>
---
net/netfilter/ipvs/ip_vs_core.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/net/netfilter/ipvs/ip_vs_core.c b/net/netfilter/ipvs/ip_vs_core.c
index 990decb..57fc626 100644
--- a/net/netfilter/ipvs/ip_vs_core.c
+++ b/net/netfilter/ipvs/ip_vs_core.c
@@ -1692,10 +1692,19 @@ ip_vs_in(unsigned int hooknum, struct sk_buff *skb, int
af)
ip_vs_in_stats(cp, skb);
ip_vs_set_state(cp, IP_VS_DIR_INPUT, skb, pd);
- if (cp->packet_xmit)
+ if (cp->packet_xmit) {
+ /* From now on, we only care about the skb->sk if it's
+ * LOCAL_OUT (as we may need to update the MTU on a socket
+ * we own for tunneling overhead. We must orphan it, in
+ * case a socket was in time-wait or something and this
+ * value was assigned in the early_demux path.
+ */
+ if (hooknum == NF_INET_LOCAL_IN)
+ skb_orphan(skb);
+
ret = cp->packet_xmit(skb, cp, pp, &iph);
/* do not touch skb anymore */
- else {
+ } else {
IP_VS_DBG_RL("warning: packet_xmit is null");
ret = NF_ACCEPT;
}
--
Alex Gartrell <agartrell@xxxxxx>
--
To unsubscribe from this list: send the line "unsubscribe lvs-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
|