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.
This commit is contained in:
Yang Tse 2011-12-29 23:40:06 +01:00
Родитель e99128a5c9
Коммит 5c0ad9581d
1 изменённых файлов: 17 добавлений и 9 удалений

Просмотреть файл

@ -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!