Unverified Kaydet (Commit) de88ab39 authored tarafından Joffrey F's avatar Joffrey F Kaydeden (comit) GitHub

Merge pull request #1880 from docker/1841-tar-broken-symlinks

Do not break when archiving broken symlinks
...@@ -98,7 +98,8 @@ def create_archive(root, files=None, fileobj=None, gzip=False): ...@@ -98,7 +98,8 @@ def create_archive(root, files=None, fileobj=None, gzip=False):
files = build_file_list(root) files = build_file_list(root)
for path in files: for path in files:
full_path = os.path.join(root, path) full_path = os.path.join(root, path)
if not os.access(full_path, os.R_OK):
if os.lstat(full_path).st_mode & os.R_OK == 0:
raise IOError( raise IOError(
'Can not access file in context: {}'.format(full_path) 'Can not access file in context: {}'.format(full_path)
) )
......
...@@ -948,6 +948,20 @@ class TarTest(unittest.TestCase): ...@@ -948,6 +948,20 @@ class TarTest(unittest.TestCase):
tar_data = tarfile.open(fileobj=archive) tar_data = tarfile.open(fileobj=archive)
self.assertEqual(sorted(tar_data.getnames()), ['bar', 'foo']) self.assertEqual(sorted(tar_data.getnames()), ['bar', 'foo'])
@pytest.mark.skipif(IS_WINDOWS_PLATFORM, reason='No chmod on Windows')
def test_tar_with_inaccessible_file(self):
base = tempfile.mkdtemp()
full_path = os.path.join(base, 'foo')
self.addCleanup(shutil.rmtree, base)
with open(full_path, 'w') as f:
f.write('content')
os.chmod(full_path, 0o222)
with pytest.raises(IOError) as ei:
tar(base)
assert 'Can not access file in context: {}'.format(full_path) in \
ei.exconly()
@pytest.mark.skipif(IS_WINDOWS_PLATFORM, reason='No symlinks on Windows') @pytest.mark.skipif(IS_WINDOWS_PLATFORM, reason='No symlinks on Windows')
def test_tar_with_file_symlinks(self): def test_tar_with_file_symlinks(self):
base = tempfile.mkdtemp() base = tempfile.mkdtemp()
...@@ -975,6 +989,18 @@ class TarTest(unittest.TestCase): ...@@ -975,6 +989,18 @@ class TarTest(unittest.TestCase):
sorted(tar_data.getnames()), ['bar', 'bar/foo', 'foo'] sorted(tar_data.getnames()), ['bar', 'bar/foo', 'foo']
) )
@pytest.mark.skipif(IS_WINDOWS_PLATFORM, reason='No symlinks on Windows')
def test_tar_with_broken_symlinks(self):
base = tempfile.mkdtemp()
self.addCleanup(shutil.rmtree, base)
for d in ['foo', 'bar']:
os.makedirs(os.path.join(base, d))
os.symlink('../baz', os.path.join(base, 'bar/foo'))
with tar(base) as archive:
tar_data = tarfile.open(fileobj=archive)
assert sorted(tar_data.getnames()) == ['bar', 'bar/foo', 'foo']
@pytest.mark.skipif(IS_WINDOWS_PLATFORM, reason='No UNIX sockets on Win32') @pytest.mark.skipif(IS_WINDOWS_PLATFORM, reason='No UNIX sockets on Win32')
def test_tar_socket_file(self): def test_tar_socket_file(self):
base = tempfile.mkdtemp() base = tempfile.mkdtemp()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment