remoting: avoid a race condition.

This commit is contained in:
whitequark 2018-01-20 01:28:07 +00:00
parent 83278a6edb
commit f4022ba872
1 changed files with 9 additions and 1 deletions

View File

@ -83,8 +83,16 @@ class SSHClient(Client):
logger.debug("Using cached {}".format(filename)) logger.debug("Using cached {}".format(filename))
else: else:
logger.debug("Transferring {}".format(filename)) logger.debug("Transferring {}".format(filename))
with sftp.open(remote_filename, 'wb') as remote: # Avoid a race condition by writing into a temporary file
# and atomically replacing
with sftp.open(remote_filename + ".~", "wb") as remote:
remote.write(rewritten) remote.write(rewritten)
try:
sftp.rename(remote_filename + ".~", remote_filename)
except IOError:
# Either it already exists (this is OK) or something else
# happened (this isn't) and we need to re-raise
sftp.stat(remote_filename)
return remote_filename return remote_filename
def spawn_command(self, cmd, get_pty=False, **kws): def spawn_command(self, cmd, get_pty=False, **kws):