summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/ansible/modules/files/unarchive.py13
1 files changed, 11 insertions, 2 deletions
diff --git a/lib/ansible/modules/files/unarchive.py b/lib/ansible/modules/files/unarchive.py
index 93d449f6c0..cbbda3d339 100644
--- a/lib/ansible/modules/files/unarchive.py
+++ b/lib/ansible/modules/files/unarchive.py
@@ -642,9 +642,17 @@ class TgzArchive(object):
for filename in out.splitlines():
# Compensate for locale-related problems in gtar output (octal unicode representation) #11348
# filename = filename.decode('string_escape')
- filename = codecs.escape_decode(filename)[0]
+ filename = to_native(codecs.escape_decode(filename)[0])
+
if filename and filename not in self.excludes:
- self._files_in_archive.append(to_native(filename))
+ # We don't allow absolute filenames. If the user wants to unarchive rooted in "/"
+ # they need to use "dest: '/'". This follows the defaults for gtar, pax, etc.
+ # Allowing absolute filenames here also causes bugs: https://github.com/ansible/ansible/issues/21397
+ if filename.startswith('/'):
+ filename = filename[1:]
+
+ self._files_in_archive.append(filename)
+
return self._files_in_archive
def is_unarchived(self):
@@ -869,6 +877,7 @@ def main():
# do we need to change perms?
for filename in handler.files_in_archive:
file_args['path'] = os.path.join(dest, filename)
+
try:
res_args['changed'] = module.set_fs_attributes_if_different(file_args, res_args['changed'], expand=False)
except (IOError, OSError) as e: