Bkprt unarchive fix (#37159)

* Fix unarchive with strip-components in extra_opts (#37048)

* Fix unarchive with strip-components in extra_opts

When unarchive is given extra_opts to strip all leading directories, it
could end up trying to change the permissions on the root directory.
Tar archives shouldn't contain absolute paths anyways so make sure that
all paths are relative as we handle them.

Fixes #21397

(cherry picked from commit cca0ccaf97)
pull/37168/head
Toshio Kuratomi 7 years ago committed by GitHub
parent 09de6dc020
commit 0fd9c9b014
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -0,0 +1,5 @@
---
bugfixes:
- Fix for unarchive when users use the --strip-components extra_opt to tar
causing ansible to set permissions on the wrong directory.
https://github.com/ansible/ansible/pull/37048

@ -641,9 +641,17 @@ class TgzArchive(object):
for filename in out.splitlines(): for filename in out.splitlines():
# Compensate for locale-related problems in gtar output (octal unicode representation) #11348 # Compensate for locale-related problems in gtar output (octal unicode representation) #11348
# filename = filename.decode('string_escape') # 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: 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 return self._files_in_archive
def is_unarchived(self): def is_unarchived(self):
@ -868,6 +876,7 @@ def main():
# do we need to change perms? # do we need to change perms?
for filename in handler.files_in_archive: for filename in handler.files_in_archive:
file_args['path'] = os.path.join(dest, filename) file_args['path'] = os.path.join(dest, filename)
try: try:
res_args['changed'] = module.set_fs_attributes_if_different(file_args, res_args['changed'], expand=False) res_args['changed'] = module.set_fs_attributes_if_different(file_args, res_args['changed'], expand=False)
except (IOError, OSError) as e: except (IOError, OSError) as e:

Loading…
Cancel
Save