diff options
author | Yang Tse <yangsita@gmail.com> | 2011-12-29 23:40:06 +0100 |
---|---|---|
committer | Yang Tse <yangsita@gmail.com> | 2011-12-29 23:40:06 +0100 |
commit | 5c0ad9581dc0d59ba4e425e54589cdc2b6cb7ac5 (patch) | |
tree | c96e33d75c883cd8077287214e30740952b10eec /tests | |
parent | e99128a5c9be1ee741090d9e0d8521cf05a6cc73 (diff) |
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.
Diffstat (limited to 'tests')
-rwxr-xr-x | tests/ftpserver.pl | 26 |
1 files changed, 17 insertions, 9 deletions
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! |