All of lore.kernel.org
 help / color / mirror / Atom feed
From: Patrick McHardy <kaber@trash.net>
To: Phil Oester <kernel@linuxace.com>
Cc: Harald Welte <laforge@netfilter.org>,
	Rusty Russell <rusty@rustcorp.com.au>,
	netfilter-devel@lists.netfilter.org
Subject: Re: [PATCH] Fix NAT TCP sequence adjustment
Date: Mon, 04 Apr 2005 10:27:30 +0200	[thread overview]
Message-ID: <4250FA72.3020502@trash.net> (raw)
In-Reply-To: <20050404044033.GA1847@linuxace.com>

Phil Oester wrote:
> If the retransmitted packet were the same packet as the last one which was
> mangled, the seq will be adjusted by offset_before, which at this point is
> the same adjustment as the first packet received via offset_after. So,
> seq == correction_pos for the retransmitted packet, and this is fairly trivial
> to handle.  This is the only case where I can see before() triggering a false
> positive.

What you are trying to do is to reconstruct the original sequence
number, so lets consider the possible cases:

1. tcph->seq - offset_before <= correction_pos

Since offset_before < offset_after, tcph->seq - offset_after is also
before correction_pos and the original sequence number must have been
tcph->seq - offset_before. In this case the calculated sequence number
is wrong, but no false positive can trigger.

2. tcph->seq - offset_after > correction_pos

Since offset_after > offset_before, tcph->seq - offset_before is also
after correction_pos and the original sequence number must have been
tcph->seq - offset_after. This case is also handled correctly, the
position is updated.

3. tcph->seq - offset_before > this_way->correction_pos &&
    tcph->seq - offset_after <= this_way->correction_pos

In this case we can't determine whether this packet was a retransmission
and what the original sequence number was. Assuming it was offset_after
leaves the case where it really was offset_before handled incorrectly.
In this case it was a retransmit and we don't want to update the state,
using offset_after results in an incorrect sequence number that is
before correction_pos, so this case is also handled correctly.

 > +	if (seq != this_way->correction_pos) {
 > +		seq -= this_way->offset_after;
 > +		if (this_way->offset_before == this_way->offset_after
 > +		    || before(this_way->correction_pos, seq)) {
 > +			this_way->correction_pos = seq;
 > +			this_way->offset_before = this_way->offset_after;
 > +			this_way->offset_after += sizediff;
 > +		}
 >  	}

So in conclusion it seems simply doing "seq -= this_way->offset_after"
without the seq != this_way->correction_pos check handles all cases
correctly. Please someone verify I didn't make a mistake. I think a
comment explaining the cases would also be appropriate.

> As per your request, below is only the bare minimum patch for -stable,
> but the other patch to ip_conntrack_ftp for u16->u32 is likely another good
> candidate for -stable.

Please send an updated patch without the new check and with a comment.
Regarding the u16 patch, I haven't heard of problems related to this
bug, so its not a candidate yet.

> On another note, It would be helpful if you published your tree somewhere so
> patches could be based upon it...then I would not have wasted time sending
> the u16->u32 patch which someone else submitted but which is not yet in 
> mainline or -bk.  Time to consider a -nf snapshot?

Exporting using bitkeeper is painless, for normal diffs I first need to
figure out how to work with triggers. I'll try to do this some time
soon.

Regards
Patrick

  reply	other threads:[~2005-04-04  8:27 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-04-02 20:24 [PATCH] Fix NAT TCP sequence adjustment Phil Oester
2005-04-03 12:26 ` Milos Wimmer
2005-04-03 19:26 ` Patrick McHardy
2005-04-03 23:53   ` Phil Oester
2005-04-04  4:40     ` Phil Oester
2005-04-04  8:27       ` Patrick McHardy [this message]
2005-04-04 20:47         ` Phil Oester
2005-04-05  7:32           ` Patrick McHardy
2005-04-05 13:33             ` Patch lifetime " Amin Azez
2005-04-10 20:49               ` Harald Welte
2005-04-06  4:48           ` Phil Oester
2005-04-18  1:42             ` Patrick McHardy
2005-04-19  0:58               ` Phil Oester
2005-04-20 15:03                 ` Patrick McHardy
2005-04-20 15:53                   ` Phil Oester
2005-04-20 16:07                     ` Patrick McHardy
2005-04-20 17:24                       ` Phil Oester
2005-04-20 17:50                         ` Patrick McHardy
2005-04-20 18:25                           ` Phil Oester
2005-04-20 21:39                             ` Martijn Lievaart
2005-04-21  1:41                               ` Patrick McHardy
2005-04-21  1:38                             ` Patrick McHardy
2005-04-21 12:31                               ` Milos Wimmer
2005-04-21 12:32                                 ` Patrick McHardy
2005-04-21 13:31                               ` Jonas Berlin
2005-04-21 23:01                                 ` Patrick McHardy
2005-04-27  0:44         ` Rusty Russell
2005-04-27 10:27           ` Patrick McHardy
2005-05-31  9:17 ` Rusty Russell
2005-05-31 13:02   ` Patrick McHardy
2005-05-31 13:48     ` Rusty Russell
2005-05-31 14:35       ` Patrick McHardy

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=4250FA72.3020502@trash.net \
    --to=kaber@trash.net \
    --cc=kernel@linuxace.com \
    --cc=laforge@netfilter.org \
    --cc=netfilter-devel@lists.netfilter.org \
    --cc=rusty@rustcorp.com.au \
    /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.