diff options
author | Stephen C. Pope <stephen.pope@predict.com> | 2015-08-23 09:30:21 -0600 |
---|---|---|
committer | Jeff Forcier <jeff@bitprophet.org> | 2016-04-24 21:45:31 -0700 |
commit | 9e76f38045ef1e24eb2f6ff93d0b68470b237bad (patch) | |
tree | 43b4bcfb63d9fd889d694e8eba17ea4ba7352aa1 /paramiko/sftp_client.py | |
parent | d29a1fc52535aafc3aa23c58e9060c44af33d99b (diff) | |
download | paramiko-9e76f38045ef1e24eb2f6ff93d0b68470b237bad.tar.gz |
fix sftp stalls
Diffstat (limited to 'paramiko/sftp_client.py')
-rw-r--r-- | paramiko/sftp_client.py | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/paramiko/sftp_client.py b/paramiko/sftp_client.py index 6a24b943..25abe590 100644 --- a/paramiko/sftp_client.py +++ b/paramiko/sftp_client.py @@ -746,10 +746,10 @@ class SFTPClient(BaseSFTP, ClosingContextManager): raise Exception('unknown type for %r type %r' % (item, type(item))) num = self.request_number self._expecting[num] = fileobj - self._send_packet(t, msg) self.request_number += 1 finally: self._lock.release() + self._send_packet(t, msg) return num def _read_response(self, waitfor=None): @@ -760,15 +760,19 @@ class SFTPClient(BaseSFTP, ClosingContextManager): raise SSHException('Server connection dropped: %s' % str(e)) msg = Message(data) num = msg.get_int() - if num not in self._expecting: - # might be response for a file that was closed before responses came back - self._log(DEBUG, 'Unexpected response #%d' % (num,)) - if waitfor is None: - # just doing a single check - break - continue - fileobj = self._expecting[num] - del self._expecting[num] + self._lock.acquire() + try: + if num not in self._expecting: + # might be response for a file that was closed before responses came back + self._log(DEBUG, 'Unexpected response #%d' % (num,)) + if waitfor is None: + # just doing a single check + break + continue + fileobj = self._expecting[num] + del self._expecting[num] + finally: + self._lock.release() if num == waitfor: # synchronous if t == CMD_STATUS: |