mirror of https://github.com/docker/docker-py.git
				
				
				
			Merge pull request #1880 from docker/1841-tar-broken-symlinks
Do not break when archiving broken symlinks
This commit is contained in:
		
						commit
						de88ab39c0
					
				|  | @ -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): | ||||||
|             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): | ||||||
|                 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() | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue