summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKrzysztof Rusek <kr292291@students.mimuw.edu.pl>2016-02-11 16:51:19 +0100
committerJeff Forcier <jeff@bitprophet.org>2016-06-09 10:39:35 -0700
commitcaa842bf5d5b59002e8277f55ccd29c531aea08e (patch)
tree8e34077bf47768560703985277c3e7302fcd2143
parent7bd8e93a0e16729c7d348cf5d4b90e62083991d4 (diff)
downloadparamiko-caa842bf5d5b59002e8277f55ccd29c531aea08e.tar.gz
Issue #537 reproduction test and fix
-rw-r--r--paramiko/buffered_pipe.py14
-rw-r--r--tests/test_transport.py18
2 files changed, 27 insertions, 5 deletions
diff --git a/paramiko/buffered_pipe.py b/paramiko/buffered_pipe.py
index d5fe164e..e81e9b3d 100644
--- a/paramiko/buffered_pipe.py
+++ b/paramiko/buffered_pipe.py
@@ -70,11 +70,15 @@ class BufferedPipe (object):
:param threading.Event event: the event to set/clear
"""
- self._event = event
- if len(self._buffer) > 0:
- event.set()
- else:
- event.clear()
+ self._lock.acquire()
+ try:
+ self._event = event
+ if self._closed or len(self._buffer) > 0:
+ event.set()
+ else:
+ event.clear()
+ finally:
+ self._lock.release()
def feed(self, data):
"""
diff --git a/tests/test_transport.py b/tests/test_transport.py
index 5069e5b0..d81ad8f3 100644
--- a/tests/test_transport.py
+++ b/tests/test_transport.py
@@ -828,3 +828,21 @@ class TransportTest(unittest.TestCase):
hostkey=public_host_key,
username='slowdive',
password='pygmalion')
+
+ def test_M_select_after_close(self):
+ """
+ verify that select works when a channel is already closed.
+ """
+ self.setup_test_server()
+ chan = self.tc.open_session()
+ chan.invoke_shell()
+ schan = self.ts.accept(1.0)
+ schan.close()
+
+ # give client a moment to receive close notification
+ time.sleep(0.1)
+
+ r, w, e = select.select([chan], [], [], 0.1)
+ self.assertEqual([chan], r)
+ self.assertEqual([], w)
+ self.assertEqual([], e)