diff options
author | Robey Pointer <robey@lag.net> | 2005-10-13 18:51:18 +0000 |
---|---|---|
committer | Robey Pointer <robey@lag.net> | 2005-10-13 18:51:18 +0000 |
commit | 8bb5e65499661bc1e0556ccfe56c4317d70317cd (patch) | |
tree | 510ad442f65e83d8d011fba99343eb753c71f593 | |
parent | 7f9677d5abe53f210cad1f8762a526e0d98dd716 (diff) |
[project @ Arch-1:robey@lag.net--2005-master-shake%paramiko--dev--1--patch-64]
track channels seen and throw away (without error) messages bound for nonexistent channels that *used* to exist -- fixes a bug found by gordon good
-rw-r--r-- | paramiko/transport.py | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/paramiko/transport.py b/paramiko/transport.py index 6a8cb2b2..58ec46f3 100644 --- a/paramiko/transport.py +++ b/paramiko/transport.py @@ -20,22 +20,28 @@ L{Transport} handles the core SSH2 protocol. """ -import sys, os, string, threading, socket, struct, time +import os +import socket +import string +import struct +import sys +import threading +import time import weakref -from common import * -from ssh_exception import SSHException, BadAuthenticationType -from message import Message -from channel import Channel -from sftp_client import SFTPClient -import util -from packet import Packetizer -from rsakey import RSAKey -from dsskey import DSSKey -from kex_group1 import KexGroup1 -from kex_gex import KexGex -from primes import ModulusPack -from auth_handler import AuthHandler +from paramiko.common import * +from paramiko import util +from paramiko.ssh_exception import SSHException, BadAuthenticationType +from paramiko.message import Message +from paramiko.channel import Channel +from paramiko.sftp_client import SFTPClient +from paramiko.packet import Packetizer +from paramiko.rsakey import RSAKey +from paramiko.dsskey import DSSKey +from paramiko.kex_group1 import KexGroup1 +from paramiko.kex_gex import KexGex +from paramiko.primes import ModulusPack +from paramiko.auth_handler import AuthHandler # these come from PyCrypt # http://www.amk.ca/python/writing/pycrypt/ @@ -235,6 +241,7 @@ class Transport (threading.Thread): self.lock = threading.Lock() # synchronization (always higher level than write_lock) self.channels = weakref.WeakValueDictionary() # (id -> Channel) self.channel_events = { } # (id -> Event) + self.channels_seen = { } # (id -> True) self.channel_counter = 1 self.window_size = 65536 self.max_packet_size = 32768 @@ -582,6 +589,7 @@ class Transport (threading.Thread): m.add_int(src_addr[1]) self.channels[chanid] = chan = Channel(chanid) self.channel_events[chanid] = event = threading.Event() + self.channels_seen[chanid] = True chan._set_transport(self) chan._set_window(self.window_size, self.max_packet_size) self._send_user_message(m) @@ -963,7 +971,6 @@ class Transport (threading.Thread): raise try: def handler(title, instructions, fields): - self._log(DEBUG, 'title=%r, instructions=%r, fields=%r' % (title, instructions, fields)) if len(fields) > 1: raise SSHException('Fallback authentication failed.') if len(fields) == 0: @@ -1264,6 +1271,8 @@ class Transport (threading.Thread): chanid = m.get_int() if self.channels.has_key(chanid): self._channel_handler_table[ptype](self.channels[chanid], m) + elif self.channels_seen.has_key(chanid): + self._log(DEBUG, 'Ignoring message for dead channel %d' % chanid) else: self._log(ERROR, 'Channel request for unknown channel %d' % chanid) self.active = False @@ -1666,6 +1675,7 @@ class Transport (threading.Thread): try: self.lock.acquire() self.channels[my_chanid] = chan + self.channels_seen[my_chanid] = True chan._set_transport(self) chan._set_window(self.window_size, self.max_packet_size) chan._set_remote_channel(chanid, initial_window_size, max_packet_size) |