From f32fbf734ebe58749b13aa6678401f7f551a0129 Mon Sep 17 00:00:00 2001 From: Uwe Krueger Date: Fri, 11 Feb 2022 15:17:02 +0100 Subject: [PATCH] fix permission handling --- pkg/projectionfs/projection_test.go | 50 +++++++++++++++++++++-------- pkg/utils/mappedfs.go | 2 +- 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/pkg/projectionfs/projection_test.go b/pkg/projectionfs/projection_test.go index ec3d368..8a9ddab 100644 --- a/pkg/projectionfs/projection_test.go +++ b/pkg/projectionfs/projection_test.go @@ -16,11 +16,13 @@ * limitations under the License. */ -package projectionfs +package projectionfs_test import ( "os" + "github.com/mandelsoft/vfs/pkg/osfs" + "github.com/mandelsoft/vfs/pkg/projectionfs" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" @@ -30,22 +32,21 @@ import ( ) var _ = Describe("projection filesystem", func() { - var fs vfs.FileSystem - var mem vfs.FileSystem - - BeforeEach(func() { - var err error + Context("plain", func() { + var fs vfs.FileSystem + var mem vfs.FileSystem - mem = memoryfs.New() + BeforeEach(func() { + var err error - mem.MkdirAll("d1/d1d1/d1d1d1/a", os.ModePerm) - mem.MkdirAll("d1/d1d1/d1d1d2/b", os.ModePerm) - mem.MkdirAll("d2/d2d1", os.ModePerm) - fs, err = New(mem, "d1") - Expect(err).To(Succeed()) - }) + mem = memoryfs.New() - Context("plain", func() { + mem.MkdirAll("d1/d1d1/d1d1d1/a", os.ModePerm) + mem.MkdirAll("d1/d1d1/d1d1d2/b", os.ModePerm) + mem.MkdirAll("d2/d2d1", os.ModePerm) + fs, err = projectionfs.New(mem, "d1") + Expect(err).To(Succeed()) + }) It("root", func() { ExpectFolders(fs, "/", []string{"d1d1"}, nil) @@ -89,4 +90,25 @@ var _ = Describe("projection filesystem", func() { Expect(fi.Mode() & (os.ModeType)).To(Equal(os.ModeSymlink)) }) }) + + Context("tempfs", func() { + var tempfs vfs.FileSystem + + BeforeEach(func() { + t, err := osfs.NewTempFileSystem() + Expect(err).To(Succeed()) + tempfs = t + }) + + AfterEach(func() { + vfs.Cleanup(tempfs) + }) + + It("handles permission problem", func() { + Expect(tempfs.Mkdir("test", 0)).To(Succeed()) + err := tempfs.Mkdir("test/sub", 0) + Expect(err).To(HaveOccurred()) + Expect(os.IsPermission(err)).To(BeTrue()) + }) + }) }) diff --git a/pkg/utils/mappedfs.go b/pkg/utils/mappedfs.go index 6e49024..ec1126c 100644 --- a/pkg/utils/mappedfs.go +++ b/pkg/utils/mappedfs.go @@ -109,7 +109,7 @@ func (m *MappedFileSystem) mapPath(path string, link ...bool) (vfs.FileSystem, s if err != nil && !os.IsPermission(err) { return nil, "", "", err } - if fi.Mode()&os.ModeSymlink != 0 && (getlink || strings.Contains(path, vfs.PathSeparatorString)) { + if (fi != nil && fi.Mode()&os.ModeSymlink != 0) && (getlink || strings.Contains(path, vfs.PathSeparatorString)) { links++ if links > 255 { return nil, "", "", errors.New("AbsPath: too many links")