summaryrefslogtreecommitdiff
path: root/paramiko/sftp_client.py
diff options
context:
space:
mode:
authorStephen C. Pope <stephen.pope@predict.com>2015-08-23 09:30:21 -0600
committerJeff Forcier <jeff@bitprophet.org>2016-04-24 21:45:31 -0700
commit9e76f38045ef1e24eb2f6ff93d0b68470b237bad (patch)
tree43b4bcfb63d9fd889d694e8eba17ea4ba7352aa1 /paramiko/sftp_client.py
parentd29a1fc52535aafc3aa23c58e9060c44af33d99b (diff)
downloadparamiko-9e76f38045ef1e24eb2f6ff93d0b68470b237bad.tar.gz
fix sftp stalls
Diffstat (limited to 'paramiko/sftp_client.py')
-rw-r--r--paramiko/sftp_client.py24
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: