diff --git a/cache/contenthash/checksum.go b/cache/contenthash/checksum.go index 35199e02f98d..8cb03359be4f 100644 --- a/cache/contenthash/checksum.go +++ b/cache/contenthash/checksum.go @@ -628,7 +628,7 @@ func getFollowLinksWalk(root *iradix.Node, k []byte, linksWalked *int) ([]byte, if dirPath == "." || dirPath == "/" { dirPath = "" } - link := parent.Linkname + link := path.Clean(parent.Linkname) if !path.IsAbs(link) { link = path.Join("/", path.Join(path.Dir(dirPath), link)) } diff --git a/cache/contenthash/checksum_test.go b/cache/contenthash/checksum_test.go index b3bf812a2f39..034e74694457 100644 --- a/cache/contenthash/checksum_test.go +++ b/cache/contenthash/checksum_test.go @@ -423,6 +423,33 @@ func TestSymlinkNeedsScan(t *testing.T) { require.NoError(t, err) } +func TestSymlinkAbsDirSuffix(t *testing.T) { + t.Parallel() + tmpdir, err := ioutil.TempDir("", "buildkit-state") + require.NoError(t, err) + defer os.RemoveAll(tmpdir) + + snapshotter, err := native.NewSnapshotter(filepath.Join(tmpdir, "snapshots")) + require.NoError(t, err) + cm := setupCacheManager(t, tmpdir, snapshotter) + defer cm.Close() + + ch := []string{ + "ADD c0 dir", + "ADD c0/sub dir", + "ADD c0/sub/foo file data0", + "ADD link symlink /c0/sub/", + } + ref := createRef(t, cm, ch) + + dgst, err := Checksum(context.TODO(), ref, "link/foo") + require.NoError(t, err) + require.Equal(t, dgstFileData0, dgst) + + err = ref.Release(context.TODO()) + require.NoError(t, err) +} + func TestSymlinkInPathHandleChange(t *testing.T) { t.Parallel() tmpdir, err := ioutil.TempDir("", "buildkit-state")