]> asedeno.scripts.mit.edu Git - PuTTY.git/blobdiff - contrib/logparse.pl
Fix SSH2_MSG_CHANNEL_EXTENDED_DATA in logparse.
[PuTTY.git] / contrib / logparse.pl
index 98ad57443d40663fb02c0bef7ad20ca425995c7f..3445baa8a217b4e48706a0b8d1c04685871d8679 100755 (executable)
@@ -244,6 +244,10 @@ my %packets = (
         my ($rid, $sid, $winsize, $packet) = &parse("uuuu", $data);
         $rid = ($direction eq "i" ? "c" : "s") . $rid;
         my $index = $chan_by_id{$rid};
+        if (!defined $index) {
+            printf "UNKNOWN_CHANNEL (%s) (--%d)\n", $rid, $winsize;
+            return;
+        }
         $sid = ($direction eq "i" ? "s" : "c") . $sid;
         $chan_by_id{$sid} = $index;
         my $chan = $channels[$index];
@@ -259,6 +263,10 @@ my %packets = (
         my ($rid, $reason, $desc, $lang) = &parse("uuss", $data);
         $rid = ($direction eq "i" ? "c" : "s") . $rid;
         my $index = $chan_by_id{$rid};
+        if (!defined $index) {
+            printf "UNKNOWN_CHANNEL (%s) %s\n", $rid, &str($reason);
+            return;
+        }
         my $chan = $channels[$index];
         $chan->{'state'} = 'rejected';
         printf "ch%d (%s) %s\n", $index, $chan->{'id'}, &str($reason);
@@ -269,6 +277,10 @@ my %packets = (
         my ($rid, $bytes) = &parse("uu", $data);
         $rid = ($direction eq "i" ? "c" : "s") . $rid;
         my $index = $chan_by_id{$rid};
+        if (!defined $index) {
+            printf "UNKNOWN_CHANNEL (%s) +%d\n", $rid, $bytes;
+            return;
+        }
         my $chan = $channels[$index];
        $chan->{$direction}{'win'} += $bytes;
         printf "ch%d (%s) +%d (--%d)\n", $index, $chan->{'id'}, $bytes,
@@ -280,6 +292,10 @@ my %packets = (
         my ($rid, $bytes) = &parse("uu", $data);
         $rid = ($direction eq "i" ? "c" : "s") . $rid;
         my $index = $chan_by_id{$rid};
+        if (!defined $index) {
+            printf "UNKNOWN_CHANNEL (%s), %s bytes\n", $rid, $bytes;
+            return;
+        }
         my $chan = $channels[$index];
        $chan->{$direction}{'seq'} += $bytes;
         printf "ch%d (%s), %s bytes (%d--%d)\n", $index, $chan->{'id'}, $bytes,
@@ -307,15 +323,22 @@ my %packets = (
 #define SSH2_MSG_CHANNEL_EXTENDED_DATA            95   /* 0x5f */
     'SSH2_MSG_CHANNEL_EXTENDED_DATA' => sub {
         my ($direction, $seq, $data) = @_;
-        my ($rid, $bytes) = &parse("uu", $data);
+        my ($rid, $type, $bytes) = &parse("uuu", $data);
+        if ($type == 1) {
+            $type = "SSH_EXTENDED_DATA_STDERR";
+        }
         $rid = ($direction eq "i" ? "c" : "s") . $rid;
         my $index = $chan_by_id{$rid};
+        if (!defined $index) {
+            printf "UNKNOWN_CHANNEL (%s), type %s, %s bytes\n", $rid,
+                $type, $bytes;
+            return;
+        }
         my $chan = $channels[$index];
-       my $dir = $direction eq "i" ? 'sc' : 'cs';
-       $chan->{$dir}{'seq'} += $bytes;
-        printf "ch%d (%s), %s bytes (%d--%d)\n", $index, $chan->{'id'}, $bytes,
-           $chan->{$dir}{$seq}-$bytes, $chan->{$dir}{$seq};
-        printf "ch%d (%s), %s bytes\n", $index, $chan->{'id'}, $bytes;
+       $chan->{$direction}{'seq'} += $bytes;
+        printf "ch%d (%s), type %s, %s bytes (%d--%d)\n", $index,$chan->{'id'},
+            $type, $bytes, $chan->{$direction}{'seq'}-$bytes,
+            $chan->{$direction}{'seq'};
         my @realdata = splice @$data, 0, $bytes;
         if ($dumpdata) {
             # We treat EXTENDED_DATA as equivalent to DATA, for the
@@ -326,8 +349,8 @@ my %packets = (
             my $filekey = $direction . "file";
             if (!defined $chan->{$filekey}) {
                 my $filename = sprintf "ch%d.%s", $index, $direction;
-                $chan->{$filekey} = FileHandle->new;
-                if (!$chan->{$filekey}->open(">", $filename)) {
+                $chan->{$filekey} = FileHandle->new(">$filename");
+                if (!defined $chan->{$filekey}) {
                     die "$filename: $!\n";
                 }
             }
@@ -347,6 +370,10 @@ my %packets = (
         my ($rid) = &parse("uu", $data);
         $rid = ($direction eq "i" ? "c" : "s") . $rid;
         my $index = $chan_by_id{$rid};
+        if (!defined $index) {
+            printf "UNKNOWN_CHANNEL (%s)\n", $rid;
+            return;
+        }
         my $chan = $channels[$index];
         printf "ch%d (%s)\n", $index, $chan->{'id'};
     },
@@ -356,6 +383,10 @@ my %packets = (
         my ($rid) = &parse("uu", $data);
         $rid = ($direction eq "i" ? "c" : "s") . $rid;
         my $index = $chan_by_id{$rid};
+        if (!defined $index) {
+            printf "UNKNOWN_CHANNEL (%s)\n", $rid;
+            return;
+        }
         my $chan = $channels[$index];
         $chan->{'state'} = ($chan->{'state'} eq "open" ? "halfclosed" :
                             $chan->{'state'} eq "halfclosed" ? "closed" :
@@ -372,11 +403,17 @@ my %packets = (
         my ($rid, $type, $wantreply) = &parse("usb", $data);
         $rid = ($direction eq "i" ? "c" : "s") . $rid;
         my $index = $chan_by_id{$rid};
-        my $chan = $channels[$index];
-        printf "ch%d (%s) %s (%s)",
-            $index, $chan->{'id'}, $type, $wantreply eq "yes" ? "reply" : "noreply";
-        push @{$chan->{'requests_'.$direction}}, [$seq, $type]
-           if $wantreply eq "yes";
+        my $chan;
+        if (!defined $index) {
+            printf "UNKNOWN_CHANNEL (%s) %s (%s)", $rid,
+                $type, $wantreply eq "yes" ? "reply" : "noreply";
+        } else {
+            $chan = $channels[$index];
+            printf "ch%d (%s) %s (%s)", $index, $chan->{'id'},
+                $type, $wantreply eq "yes" ? "reply" : "noreply";
+            push @{$chan->{'requests_'.$direction}}, [$seq, $type]
+               if $wantreply eq "yes";
+        }
         if ($type eq "pty-req") {
             my ($term, $w, $h, $pw, $ph, $modes) = &parse("suuuus", $data);
             printf " %s %sx%s", &str($term), $w, $h;
@@ -418,6 +455,10 @@ my %packets = (
         my ($rid) = &parse("uu", $data);
         $rid = ($direction eq "i" ? "c" : "s") . $rid;
         my $index = $chan_by_id{$rid};
+        if (!defined $index) {
+            printf "UNKNOWN_CHANNEL (%s)\n", $rid;
+            return;
+        }
         my $chan = $channels[$index];
         printf "ch%d (%s)", $index, $chan->{'id'};
         my $otherdir = ($direction eq "i" ? "o" : "i");
@@ -435,6 +476,10 @@ my %packets = (
         my ($rid) = &parse("uu", $data);
         $rid = ($direction eq "i" ? "c" : "s") . $rid;
         my $index = $chan_by_id{$rid};
+        if (!defined $index) {
+            printf "UNKNOWN_CHANNEL (%s)\n", $rid;
+            return;
+        }
         my $chan = $channels[$index];
         printf "ch%d (%s)", $index, $chan->{'id'};
         my $otherdir = ($direction eq "i" ? "o" : "i");