netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* TCP_COOKIE_TRANSACTIONS synack data
@ 2010-03-08 14:27 Penttilä Mika
  2010-03-08 16:01 ` Eric Dumazet
  0 siblings, 1 reply; 5+ messages in thread
From: Penttilä Mika @ 2010-03-08 14:27 UTC (permalink / raw)
  To: netdev@vger.kernel.org


The TCP_COOKIE_TRANSACTIONS synack data seems pretty unsafe atm. 
>From tcp_make_synack():


	u8 *buf = skb_put(skb, cvp->s_data_desired);

	/* copy data directly from the listening socket. */
    	memcpy(buf, cvp->s_data_payload, cvp->s_data_desired);


The skb here is allocated for MAX_TCP_HEADER + 15 and synack data could be as long as TCP_MSS_DEFAULT, panic():ing at the skb_put().

--Mika



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: TCP_COOKIE_TRANSACTIONS synack data
  2010-03-08 14:27 TCP_COOKIE_TRANSACTIONS synack data Penttilä Mika
@ 2010-03-08 16:01 ` Eric Dumazet
  2010-03-08 16:33   ` Penttilä Mika
  0 siblings, 1 reply; 5+ messages in thread
From: Eric Dumazet @ 2010-03-08 16:01 UTC (permalink / raw)
  To: Penttilä Mika; +Cc: netdev@vger.kernel.org, William Allen Simpson

Le lundi 08 mars 2010 à 16:27 +0200, Penttilä Mika a écrit :
> The TCP_COOKIE_TRANSACTIONS synack data seems pretty unsafe atm. 
> >From tcp_make_synack():
> 
> 
> 	u8 *buf = skb_put(skb, cvp->s_data_desired);
> 
> 	/* copy data directly from the listening socket. */
>     	memcpy(buf, cvp->s_data_payload, cvp->s_data_desired);
> 
> 
> The skb here is allocated for MAX_TCP_HEADER + 15 and synack data could be as long as TCP_MSS_DEFAULT, panic():ing at the skb_put().
> 

Indeed, since start of december 2009.

Do you plan to provide a patch do you prefer someone else take care of
it ?

Thanks



^ permalink raw reply	[flat|nested] 5+ messages in thread

* RE: TCP_COOKIE_TRANSACTIONS synack data
  2010-03-08 16:01 ` Eric Dumazet
@ 2010-03-08 16:33   ` Penttilä Mika
  2010-03-08 19:28     ` Eric Dumazet
  0 siblings, 1 reply; 5+ messages in thread
From: Penttilä Mika @ 2010-03-08 16:33 UTC (permalink / raw)
  To: Eric Dumazet; +Cc: netdev@vger.kernel.org, William Allen Simpson


> 
> Le lundi 08 mars 2010 à 16:27 +0200, Penttilä Mika a écrit :
> > The TCP_COOKIE_TRANSACTIONS synack data seems pretty unsafe atm.
> > >From tcp_make_synack():
> >
> >
> > 	u8 *buf = skb_put(skb, cvp->s_data_desired);
> >
> > 	/* copy data directly from the listening socket. */
> >     	memcpy(buf, cvp->s_data_payload, cvp->s_data_desired);
> >
> >
> > The skb here is allocated for MAX_TCP_HEADER + 15 and synack data
> could be as long as TCP_MSS_DEFAULT, panic():ing at the skb_put().
> >
> 
> Indeed, since start of december 2009.
> 
> Do you plan to provide a patch do you prefer someone else take care of
> it ?
> 

I'm not planning to provide a patch at least very soon so I think someone else can provide a quicker fix.


> Thanks
> 
> 


^ permalink raw reply	[flat|nested] 5+ messages in thread

* RE: TCP_COOKIE_TRANSACTIONS synack data
  2010-03-08 16:33   ` Penttilä Mika
@ 2010-03-08 19:28     ` Eric Dumazet
  2010-03-08 19:32       ` David Miller
  0 siblings, 1 reply; 5+ messages in thread
From: Eric Dumazet @ 2010-03-08 19:28 UTC (permalink / raw)
  To: Penttilä Mika, David Miller
  Cc: netdev@vger.kernel.org, William Allen Simpson

Le lundi 08 mars 2010 à 18:33 +0200, Penttilä Mika a écrit :
> > 
> > Le lundi 08 mars 2010 à 16:27 +0200, Penttilä Mika a écrit :
> > > The TCP_COOKIE_TRANSACTIONS synack data seems pretty unsafe atm.
> > > >From tcp_make_synack():
> > >
> > >
> > > 	u8 *buf = skb_put(skb, cvp->s_data_desired);
> > >
> > > 	/* copy data directly from the listening socket. */
> > >     	memcpy(buf, cvp->s_data_payload, cvp->s_data_desired);
> > >
> > >
> > > The skb here is allocated for MAX_TCP_HEADER + 15 and synack data
> > could be as long as TCP_MSS_DEFAULT, panic():ing at the skb_put().
> > >
> > 
> > Indeed, since start of december 2009.
> > 
> > Do you plan to provide a patch do you prefer someone else take care of
> > it ?
> > 
> 
> I'm not planning to provide a patch at least very soon so I think someone else can provide a quicker fix.
> 
> 

OK thanks Mika !

I suspect following patch might be an appropriate fix for this problem.

[PATCH] tcp: Fix tcp_make_synack()

Commit 4957faad (TCPCT part 1g: Responder Cookie => Initiator), part
of TCP_COOKIE_TRANSACTION implementation, forgot to correctly size
synack skb in case user data must be included.

Many thanks to Mika Pentillä for spotting this error.

Reported-by: Penttillä Mika <mika.penttila@ixonos.com>
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
---
 net/ipv4/tcp_output.c |   18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index 4a1605d..f181b78 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -2395,13 +2395,17 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct dst_entry *dst,
 	struct tcp_extend_values *xvp = tcp_xv(rvp);
 	struct inet_request_sock *ireq = inet_rsk(req);
 	struct tcp_sock *tp = tcp_sk(sk);
+	const struct tcp_cookie_values *cvp = tp->cookie_values;
 	struct tcphdr *th;
 	struct sk_buff *skb;
 	struct tcp_md5sig_key *md5;
 	int tcp_header_size;
 	int mss;
+	int s_data_desired = 0;
 
-	skb = sock_wmalloc(sk, MAX_TCP_HEADER + 15, 1, GFP_ATOMIC);
+	if (cvp != NULL && cvp->s_data_constant && cvp->s_data_desired)
+		s_data_desired = cvp->s_data_desired;
+	skb = sock_wmalloc(sk, MAX_TCP_HEADER + 15 + s_data_desired, 1, GFP_ATOMIC);
 	if (skb == NULL)
 		return NULL;
 
@@ -2457,16 +2461,12 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct dst_entry *dst,
 			     TCPCB_FLAG_SYN | TCPCB_FLAG_ACK);
 
 	if (OPTION_COOKIE_EXTENSION & opts.options) {
-		const struct tcp_cookie_values *cvp = tp->cookie_values;
-
-		if (cvp != NULL &&
-		    cvp->s_data_constant &&
-		    cvp->s_data_desired > 0) {
-			u8 *buf = skb_put(skb, cvp->s_data_desired);
+		if (s_data_desired) {
+			u8 *buf = skb_put(skb, s_data_desired);
 
 			/* copy data directly from the listening socket. */
-			memcpy(buf, cvp->s_data_payload, cvp->s_data_desired);
-			TCP_SKB_CB(skb)->end_seq += cvp->s_data_desired;
+			memcpy(buf, cvp->s_data_payload, s_data_desired);
+			TCP_SKB_CB(skb)->end_seq += s_data_desired;
 		}
 
 		if (opts.hash_size > 0) {



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: TCP_COOKIE_TRANSACTIONS synack data
  2010-03-08 19:28     ` Eric Dumazet
@ 2010-03-08 19:32       ` David Miller
  0 siblings, 0 replies; 5+ messages in thread
From: David Miller @ 2010-03-08 19:32 UTC (permalink / raw)
  To: eric.dumazet; +Cc: mika.penttila, netdev, william.allen.simpson

From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Mon, 08 Mar 2010 20:28:15 +0100

> [PATCH] tcp: Fix tcp_make_synack()
> 
> Commit 4957faad (TCPCT part 1g: Responder Cookie => Initiator), part
> of TCP_COOKIE_TRANSACTION implementation, forgot to correctly size
> synack skb in case user data must be included.
> 
> Many thanks to Mika Pentillä for spotting this error.
> 
> Reported-by: Penttillä Mika <mika.penttila@ixonos.com>
> Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>

Thanks Eric, applied and I'll queue this up for 2.6.33-stable

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2010-03-08 19:32 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-03-08 14:27 TCP_COOKIE_TRANSACTIONS synack data Penttilä Mika
2010-03-08 16:01 ` Eric Dumazet
2010-03-08 16:33   ` Penttilä Mika
2010-03-08 19:28     ` Eric Dumazet
2010-03-08 19:32       ` David Miller

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).