Commit 5c0ad958 authored by Yang Tse's avatar Yang Tse
Browse files

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.
parent e99128a5
Loading
Loading
Loading
Loading
+17 −9
Original line number Diff line number Diff line
@@ -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!