Andre Oppermann wrote:
Harti Brandt wrote:
Hi Andre,

On Mon, 17 Nov 2008, Andre Oppermann wrote:

AO>This is a bit more complicated because of interactions with tcp_input()
AO>where syncache_expand() is called from.
AO>
AO>The old code (as of December 2002) behaved slightly different. It would AO>not remove the syncache entry when (SND.UNA == SEG.ACK) but send a RST. AO>The (RCV.NXT =< SEG.SEQ+SEG.LEN-1 < RCV.NXT+RCV.WND) test wasn't done at AO>all. Instead a socket was opened whenever (SND.UNA == SEG.ACK) succeeded. AO>This gave way to the "LAND" DoS attack which was mostly fixed with a test
AO>for (RCV.IRS < SEG.SEQ).
AO>
AO>See the attached patch for fixed version of syncache_expand(). This patch AO>is untested though. My development machine is currently down. Harti, Rui
AO>and Bjoern, please have a look at the patch and review it.

Some small problems:
...
Need another cast here: *lsop = (struct socket *)1.

Changed the logic to use a NULL *lsop to differentiate in tcp_input().
Much simpler.
Turns out there is a bug in the patch: after the call to syncache_lookup() at test sc == NULL is made and if sc == NULL and may goto sendrst:

sendrst:
   if (sc != &scs)
      syncache_free(sc);

Here syncache_free panics because of the NULL passed to it. I suppose both gotos under the if() should go to sendrstkeep instead.

harti

_______________________________________________
freebsd-net@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to