From 26c21f0f92468b4385cb6f96f5c144050d7631aa Mon Sep 17 00:00:00 2001 From: Arnaud Chong Date: Tue, 24 Jul 2018 16:55:13 +0200 Subject: [PATCH 1/2] Do not treat symlinks as files * File.stat returns the stat of the target * Symlink are ignored and replaced with files * If the target is absent File.stat will raise and we can't build the image * Using lstat and add_symlink adds symlinks to the tar archive Change-Id: If36368071a4373b12836dd00210d12e988cae819 --- lib/docker/util.rb | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/docker/util.rb b/lib/docker/util.rb index 2ca8dc6e1..ce1264944 100644 --- a/lib/docker/util.rb +++ b/lib/docker/util.rb @@ -148,14 +148,18 @@ def create_relative_dir_tar(directory, output) remove_ignored_files!(directory, files) files.each do |prefixed_file_name| - stat = File.stat(prefixed_file_name) - next unless stat.file? + stat = File.lstat(prefixed_file_name) + next unless stat.file? || stat.symlink? unprefixed_file_name = prefixed_file_name[directory.length..-1] - add_file_to_tar( - tar, unprefixed_file_name, stat.mode, stat.size, stat.mtime - ) do |tar_file| - IO.copy_stream(File.open(prefixed_file_name, 'rb'), tar_file) + if stat.symlink? + tar.add_symlink(unprefixed_file_name, File.readlink(prefixed_file_name), stat.mode) + else + add_file_to_tar( + tar, unprefixed_file_name, stat.mode, stat.size, stat.mtime + ) do |tar_file| + IO.copy_stream(File.open(prefixed_file_name, 'rb'), tar_file) + end end end end From 7b10f94b00be4d4c68096402a735bf02138d5faf Mon Sep 17 00:00:00 2001 From: Arnaud Chong Date: Tue, 24 Jul 2018 17:39:17 +0200 Subject: [PATCH 2/2] Comply with Cane rules and complexity metrics Change-Id: I1be5aa7b47f9c117944851e3bd1a83e054e2ea5e --- lib/docker/util.rb | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/lib/docker/util.rb b/lib/docker/util.rb index ce1264944..284dbed26 100644 --- a/lib/docker/util.rb +++ b/lib/docker/util.rb @@ -148,19 +148,22 @@ def create_relative_dir_tar(directory, output) remove_ignored_files!(directory, files) files.each do |prefixed_file_name| - stat = File.lstat(prefixed_file_name) - next unless stat.file? || stat.symlink? - - unprefixed_file_name = prefixed_file_name[directory.length..-1] - if stat.symlink? - tar.add_symlink(unprefixed_file_name, File.readlink(prefixed_file_name), stat.mode) - else - add_file_to_tar( - tar, unprefixed_file_name, stat.mode, stat.size, stat.mtime - ) do |tar_file| - IO.copy_stream(File.open(prefixed_file_name, 'rb'), tar_file) - end - end + add_relative_file_to_tar(tar, directory, prefixed_file_name) + end + end + end + + def add_relative_file_to_tar(tar, directory, prefixed_file_name) + stat = File.lstat(prefixed_file_name) + + unprefixed_file_name = prefixed_file_name[directory.length..-1] + if stat.symlink? + tar.add_symlink(unprefixed_file_name, File.readlink(prefixed_file_name), stat.mode) + elsif stat.file? + add_file_to_tar( + tar, unprefixed_file_name, stat.mode, stat.size, stat.mtime + ) do |tar_file| + IO.copy_stream(File.open(prefixed_file_name, 'rb'), tar_file) end end end