From 59cb0ebec969fde3f8c8c7c9468d50580eb1e1ac Mon Sep 17 00:00:00 2001 From: xanonid Date: Wed, 26 Sep 2018 16:14:35 +0200 Subject: [PATCH] Enable overwriting of links (solves #351) (#360) * Enable overwriting of links (solves #351) * add integration test to check extraction of images with replaced hardlinks * Prevent following symlinks during extracting normal files This fixes #359, #361, #362. --- .../Dockerfile_test_replaced_hardlinks | 1 + .../dockerfiles/Dockerfile_test_replaced_symlinks | 2 ++ pkg/util/fs_util.go | 15 +++++++++++++++ 3 files changed, 18 insertions(+) create mode 100644 integration/dockerfiles/Dockerfile_test_replaced_hardlinks create mode 100644 integration/dockerfiles/Dockerfile_test_replaced_symlinks diff --git a/integration/dockerfiles/Dockerfile_test_replaced_hardlinks b/integration/dockerfiles/Dockerfile_test_replaced_hardlinks new file mode 100644 index 000000000..78ca22b11 --- /dev/null +++ b/integration/dockerfiles/Dockerfile_test_replaced_hardlinks @@ -0,0 +1 @@ +FROM jboss/base-jdk@sha256:70d956f632c26d1f1df57cbb99870a6141cfe470de0eb2d51bccd44929df9367 diff --git a/integration/dockerfiles/Dockerfile_test_replaced_symlinks b/integration/dockerfiles/Dockerfile_test_replaced_symlinks new file mode 100644 index 000000000..70e3d1f2b --- /dev/null +++ b/integration/dockerfiles/Dockerfile_test_replaced_symlinks @@ -0,0 +1,2 @@ +FROM tenstartups/alpine@sha256:31dc8b12e0f73a1de899146c3663644b7668f8fd198cfe9b266886c9abfa944b +RUN pwd diff --git a/pkg/util/fs_util.go b/pkg/util/fs_util.go index 3e45c69c1..b7c2baddf 100644 --- a/pkg/util/fs_util.go +++ b/pkg/util/fs_util.go @@ -186,6 +186,13 @@ func extractFile(dest string, hdr *tar.Header, tr io.Reader) error { return err } } + // Check if something already exists at path (symlinks etc.) + // If so, delete it + if FilepathExists(path) { + if err := os.Remove(path); err != nil { + return errors.Wrapf(err, "error removing %s to make way for new file.", path) + } + } currFile, err := os.Create(path) if err != nil { return err @@ -220,6 +227,14 @@ func extractFile(dest string, hdr *tar.Header, tr io.Reader) error { if err := os.MkdirAll(dir, 0755); err != nil { return err } + // Check if something already exists at path + // If so, delete it + if FilepathExists(path) { + if err := os.Remove(path); err != nil { + return errors.Wrapf(err, "error removing %s to make way for new link", hdr.Name) + } + } + if err := os.Link(filepath.Clean(filepath.Join("/", hdr.Linkname)), path); err != nil { return err }