More robustness.

This commit is contained in:
Rudd-O 2018-07-16 01:45:38 +00:00
parent fc52d990eb
commit b48a947067

View File

@ -349,18 +349,27 @@ class Connection(ConnectionBase):
if yesno == "Y\n": if yesno == "Y\n":
try: try:
retcode = self._transport.stdout.readline(16) retcode = self._transport.stdout.readline(16)
retcode = int(retcode) try:
retcode = int(retcode)
except Exception:
raise errors.AnsibleError("return code from remote end is unexpected: %r" % retcode)
if retcode > 65536 or retcode < -65535: if retcode > 65536 or retcode < -65535:
raise errors.AnsibleError("return code from remote end is outside the range: %s" % retcode) raise errors.AnsibleError("return code from remote end is outside the range: %r" % retcode)
stdout_len = self._transport.stdout.readline(16) stdout_len = self._transport.stdout.readline(16)
stdout_len = int(stdout_len) try:
stdout_len = int(stdout_len)
except Exception:
raise errors.AnsibleError("stdout size from remote end is unexpected: %r" % stdout_len)
if stdout_len > 1024*1024*1024 or stdout_len < 0: if stdout_len > 1024*1024*1024 or stdout_len < 0:
raise errors.AnsibleError("stdout size from remote end is invalid: %s" % stdout_len) raise errors.AnsibleError("stdout size from remote end is invalid: %r" % stdout_len)
stdout = self._transport.stdout.read(stdout_len) if stdout_len != 0 else '' stdout = self._transport.stdout.read(stdout_len) if stdout_len != 0 else ''
if len(stdout) != stdout_len: if len(stdout) != stdout_len:
raise errors.AnsibleError("stdout size from remote end does not match actual stdout length: %s != %s" % (stdout_len, len(stdout))) raise errors.AnsibleError("stdout size from remote end does not match actual stdout length: %s != %s" % (stdout_len, len(stdout)))
stderr_len = self._transport.stdout.readline(16) stderr_len = self._transport.stdout.readline(16)
stderr_len = int(stderr_len) try:
stderr_len = int(stderr_len)
except Exception:
raise errors.AnsibleError("stderr size from remote end is unexpected: %r" % stderr_len)
if stdout_len > 1024*1024*1024 or stdout_len < 0: if stdout_len > 1024*1024*1024 or stdout_len < 0:
raise errors.AnsibleError("stderr size from remote end is invalid: %s" % stderr_len) raise errors.AnsibleError("stderr size from remote end is invalid: %s" % stderr_len)
stderr = self._transport.stdout.read(stderr_len) if stderr_len != 0 else '' stderr = self._transport.stdout.read(stderr_len) if stderr_len != 0 else ''
@ -375,7 +384,7 @@ class Connection(ConnectionBase):
raise exc raise exc
else: else:
self._abort_transport() self._abort_transport()
raise errors.AnsibleError("pass/fail from remote end is unexpected: %s" % yesno) raise errors.AnsibleError("pass/fail from remote end is unexpected: %r" % yesno)
def put_file(self, in_path, out_path): def put_file(self, in_path, out_path):
'''Transfer a file from local to VM.''' '''Transfer a file from local to VM.'''
@ -393,7 +402,7 @@ class Connection(ConnectionBase):
raise exc raise exc
else: else:
self._abort_transport() self._abort_transport()
raise errors.AnsibleError("pass/fail from remote end is unexpected: %s" % yesno) raise errors.AnsibleError("pass/fail from remote end is unexpected: %r" % yesno)
with open(in_path, 'rb') as in_file: with open(in_path, 'rb') as in_file:
while True: while True:
chunk = in_file.read(BUFSIZE) chunk = in_file.read(BUFSIZE)
@ -415,7 +424,7 @@ class Connection(ConnectionBase):
raise exc raise exc
else: else:
self._abort_transport() self._abort_transport()
raise errors.AnsibleError("pass/fail from remote end is unexpected: %s" % yesno) raise errors.AnsibleError("pass/fail from remote end is unexpected: %r" % yesno)
def fetch_file(self, in_path, out_path): def fetch_file(self, in_path, out_path):
'''Fetch a file from VM to local.''' '''Fetch a file from VM to local.'''
@ -437,9 +446,9 @@ class Connection(ConnectionBase):
raise exc raise exc
else: else:
self._abort_transport() self._abort_transport()
raise errors.AnsibleError("chunk size from remote end is unexpected: %s" % chunk_len) raise errors.AnsibleError("chunk size from remote end is unexpected: %r" % chunk_len)
if chunk_len > BUFSIZE or chunk_len < 0: if chunk_len > BUFSIZE or chunk_len < 0:
raise errors.AnsibleError("chunk size from remote end is invalid: %s" % chunk_len) raise errors.AnsibleError("chunk size from remote end is invalid: %r" % chunk_len)
if chunk_len == 0: if chunk_len == 0:
break break
chunk = self._transport.stdout.read(chunk_len) chunk = self._transport.stdout.read(chunk_len)