File bsc1188282-use-chmod-path-for-checking-symlink.patch of Package containerd.20446
From 45e9ebe3c91b258ad7489baaea3a1f6e0b42ceb4 Mon Sep 17 00:00:00 2001
From: Derek McGowan <derek@mcg.dev>
Date: Tue, 6 Jul 2021 12:37:54 -0700
Subject: [PATCH] [release/1.4] Use chmod path for checking symlink
Signed-off-by: Derek McGowan <derek@mcg.dev>
---
archive/tar_test.go | 35 +++++++++++++++++++++++++++++++++++
archive/tar_unix.go | 2 +-
2 files changed, 36 insertions(+), 1 deletion(-)
diff --git a/archive/tar_test.go b/archive/tar_test.go
index 568f5a95f..8ffd3f221 100644
--- a/archive/tar_test.go
+++ b/archive/tar_test.go
@@ -243,6 +243,11 @@ func TestBreakouts(t *testing.T) {
return nil
}
errFileDiff := errors.New("files differ")
+ td, err := ioutil.TempDir("", "test-breakouts-")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(td)
isSymlinkFile := func(f string) func(string) error {
return func(root string) error {
@@ -744,6 +749,36 @@ func TestBreakouts(t *testing.T) {
// resolution ends up just removing etc
validator: fileNotExists("etc/passwd"),
},
+ {
+
+ name: "HardlinkSymlinkChmod",
+ w: func() tartest.WriterToTar {
+ p := filepath.Join(td, "perm400")
+ if err := ioutil.WriteFile(p, []byte("..."), 0400); err != nil {
+ t.Fatal(err)
+ }
+ ep := filepath.Join(td, "also-exists-outside-root")
+ if err := ioutil.WriteFile(ep, []byte("..."), 0640); err != nil {
+ t.Fatal(err)
+ }
+
+ return tartest.TarAll(
+ tc.Symlink(p, ep),
+ tc.Link(ep, "sketchylink"),
+ )
+ }(),
+ validator: func(string) error {
+ p := filepath.Join(td, "perm400")
+ fi, err := os.Lstat(p)
+ if err != nil {
+ return err
+ }
+ if perm := fi.Mode() & os.ModePerm; perm != 0400 {
+ return errors.Errorf("%s perm changed from 0400 to %04o", p, perm)
+ }
+ return nil
+ },
+ },
}
for _, bo := range breakouts {
diff --git a/archive/tar_unix.go b/archive/tar_unix.go
index 6e89d2fdb..c22e79bf2 100644
--- a/archive/tar_unix.go
+++ b/archive/tar_unix.go
@@ -113,7 +113,7 @@ func handleTarTypeBlockCharFifo(hdr *tar.Header, path string) error {
func handleLChmod(hdr *tar.Header, path string, hdrInfo os.FileInfo) error {
if hdr.Typeflag == tar.TypeLink {
- if fi, err := os.Lstat(hdr.Linkname); err == nil && (fi.Mode()&os.ModeSymlink == 0) {
+ if fi, err := os.Lstat(path); err == nil && (fi.Mode()&os.ModeSymlink == 0) {
if err := os.Chmod(path, hdrInfo.Mode()); err != nil && !os.IsNotExist(err) {
return err
}
--
2.32.0