From 5c0ad9581dc0d59ba4e425e54589cdc2b6cb7ac5 Mon Sep 17 00:00:00 2001 From: Yang Tse Date: Thu, 29 Dec 2011 23:40:06 +0100 Subject: ftpserver.pl: arbitrary application data splitting among TCP packets [II] Take in account that 'pingpong' server commands may arrive splitted among several sockfilt 'DATA' PDU's. --- tests/ftpserver.pl | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) (limited to 'tests') diff --git a/tests/ftpserver.pl b/tests/ftpserver.pl index 40f51c3d2..b4039b381 100755 --- a/tests/ftpserver.pl +++ b/tests/ftpserver.pl @@ -1926,6 +1926,8 @@ while(1) { } } + my $full = ""; + while(1) { my $i; @@ -1957,34 +1959,38 @@ while(1) { ftpmsg $input; + $full .= $input; + + # Loop until command completion + next unless($full =~ /\r\n$/); + # Remove trailing CRLF. - $input =~ s/[\n\r]+$//; + $full =~ s/[\n\r]+$//; my $FTPCMD; my $FTPARG; - my $full = $input; if($proto eq "imap") { # IMAP is different with its identifier first on the command line - unless(($input =~ /^([^ ]+) ([^ ]+) (.*)/) || - ($input =~ /^([^ ]+) ([^ ]+)/)) { - sendcontrol "$1 '$input': command not understood.\r\n"; + unless(($full =~ /^([^ ]+) ([^ ]+) (.*)/) || + ($full =~ /^([^ ]+) ([^ ]+)/)) { + sendcontrol "$1 '$full': command not understood.\r\n"; last; } $cmdid=$1; # set the global variable $FTPCMD=$2; $FTPARG=$3; } - elsif($input =~ /^([A-Z]{3,4})(\s(.*))?$/i) { + elsif($full =~ /^([A-Z]{3,4})(\s(.*))?$/i) { $FTPCMD=$1; $FTPARG=$3; } - elsif(($proto eq "smtp") && ($input =~ /^[A-Z0-9+\/]{0,512}={0,2}$/i)) { + elsif(($proto eq "smtp") && ($full =~ /^[A-Z0-9+\/]{0,512}={0,2}$/i)) { # SMTP long "commands" are base64 authentication data. - $FTPCMD=$input; + $FTPCMD=$full; $FTPARG=""; } else { - sendcontrol "500 '$input': command not understood.\r\n"; + sendcontrol "500 '$full': command not understood.\r\n"; last; } @@ -1994,6 +2000,8 @@ while(1) { print STDERR "IN: $full\n"; } + $full = ""; + my $delay = $delayreply{$FTPCMD}; if($delay) { # just go sleep this many seconds! -- cgit v1.2.3