From: Andi Kleen <andi@firstfloor.org>
To: Herbert Xu <herbert@gondor.apana.org.au>
Cc: Andi Kleen <andi@firstfloor.org>, netdev@vger.kernel.org
Subject: Re: [RFC] [PATCH] Don't destroy TCP sockets twice
Date: Tue, 10 Aug 2010 10:30:40 +0200 [thread overview]
Message-ID: <20100810083040.GB6801@basil.fritz.box> (raw)
In-Reply-To: <20100809213002.GA23736@gondor.apana.org.au>
On Mon, Aug 09, 2010 at 05:30:02PM -0400, Herbert Xu wrote:
> Andi Kleen <andi@firstfloor.org> wrote:
> >
> > While working on something else I noticed that tcp_v4/6_destroy_sock()
> > can get called twice on a socket. This happens because when a reset or
> > similar happens tcp_done destroys the connection socket state, and
> > then eventually when the socket is released it is destroyed again.
>
> I'm still having problems understanding why you're getting a call
> to send a FIN after tcp_done. This shouldn't happen at all because
> tcp_done moves the socket to the TCP_CLOSE state, where FINs should
> not be sent.
>
> Can you clarify on how we can reproduce this problem in the
> upstream kernel?
This simple patch demonstrates double destroy. I have patches for showing
the more complicated case too, but they're much more ugly.
-Andi
diff --git a/include/linux/tcp.h b/include/linux/tcp.h
index a778ee0..bfbb06b 100644
--- a/include/linux/tcp.h
+++ b/include/linux/tcp.h
@@ -459,6 +459,8 @@ struct tcp_sock {
* contains related tcp_cookie_transactions fields.
*/
struct tcp_cookie_values *cookie_values;
+
+ int destroyed;
};
static inline struct tcp_sock *tcp_sk(const struct sock *sk)
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index 0207662..25bf80a 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -1919,6 +1919,9 @@ void tcp_v4_destroy_sock(struct sock *sk)
{
struct tcp_sock *tp = tcp_sk(sk);
+ BUG_ON(tp->destroyed != 0);
+ tp->destroyed = 1;
+
tcp_clear_xmit_timers(sk);
tcp_cleanup_congestion_control(sk);
--
ak@linux.intel.com -- Speaking for myself only.
next prev parent reply other threads:[~2010-08-10 8:30 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-08-06 11:05 [RFC] [PATCH] Don't destroy TCP sockets twice Andi Kleen
2010-08-09 21:30 ` Herbert Xu
2010-08-10 8:30 ` Andi Kleen [this message]
2010-08-10 10:24 ` Herbert Xu
2010-08-10 10:32 ` Andi Kleen
2010-08-10 10:39 ` Herbert Xu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100810083040.GB6801@basil.fritz.box \
--to=andi@firstfloor.org \
--cc=herbert@gondor.apana.org.au \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.