From 55d05e63e86bad88249d349b2bb57ff8b1126b68 Mon Sep 17 00:00:00 2001 From: Felicitas Pojtinger Date: Mon, 10 Jan 2022 23:43:45 +0100 Subject: [PATCH] fix: Prevent creating directories again if they already exist --- internal/fs/file.go | 3 --- pkg/fs/filesystem.go | 7 ++++- pkg/fs/filesystem_test.go | 56 ++++++++++++++++++++++----------------- 3 files changed, 38 insertions(+), 28 deletions(-) diff --git a/internal/fs/file.go b/internal/fs/file.go index 246baff..5b46006 100644 --- a/internal/fs/file.go +++ b/internal/fs/file.go @@ -5,7 +5,6 @@ import ( "database/sql" "io" "io/fs" - "log" "os" "sync" @@ -550,8 +549,6 @@ func (f *File) Write(p []byte) (n int, err error) { n, err = f.writeBuf.Write(p) if err != nil { - log.Fatal(err) - return -1, err } diff --git a/pkg/fs/filesystem.go b/pkg/fs/filesystem.go index a8cff01..86247e6 100644 --- a/pkg/fs/filesystem.go +++ b/pkg/fs/filesystem.go @@ -89,7 +89,7 @@ func (f *STFS) Create(name string) (afero.File, error) { return nil, os.ErrPermission } - return f.OpenFile(name, os.O_CREATE|os.O_RDWR, 0666) + return f.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) } func (f *STFS) mknodeWithoutLocking(dir bool, name string, perm os.FileMode, overwrite bool, linkname string, initializing bool) error { @@ -371,6 +371,11 @@ func (f *STFS) OpenFile(name string, flag int, perm os.FileMode) (afero.File, er } } + // Prevent opening a directory as writable + if hdr.Typeflag == tar.TypeDir && (flags.Write || flags.Append || flags.Truncate) { + return nil, config.ErrIsDirectory + } + return ifs.NewFile( f.readOps, f.writeOps, diff --git a/pkg/fs/filesystem_test.go b/pkg/fs/filesystem_test.go index 6c92b05..df2bac3 100644 --- a/pkg/fs/filesystem_test.go +++ b/pkg/fs/filesystem_test.go @@ -635,18 +635,28 @@ var createTests = []struct { createArgs{"/test.txt"}, false, }, + { + "Can not create existing directory /", + createArgs{"/"}, + true, + }, + // FIXME: Prevent creating empty directory names + // { + // "Can not create directory ''", + // createArgs{""}, + // true, + // }, + // { + // "Can not create directory ' '", + // createArgs{" "}, + // true, + // }, // FIXME: STFS can create file in non-existent directory, which should not be possible // { // "Can not create /nonexistent/test.txt", // createArgs{"/nonexistent/test.txt"}, // true, // }, - // FIXME: STFS can create `/` file even if / exists - // { - // "Can create /", - // createArgs{"/"}, - // true, - // }, } func TestSTFS_Create(t *testing.T) { @@ -659,34 +669,32 @@ func TestSTFS_Create(t *testing.T) { return } - want, err := fs.fs.Stat(tt.args.name) - if err != nil { - t.Errorf("%v.Stat() error = %v, wantErr %v", fs.fs.Name(), err, tt.wantErr) + if !tt.wantErr { + want, err := fs.fs.Stat(tt.args.name) + if err != nil { + t.Errorf("%v.Stat() error = %v, wantErr %v", fs.fs.Name(), err, tt.wantErr) - return - } + return + } - if file == nil { - if (err != nil) != tt.wantErr { + if file == nil { t.Errorf("%v.Create() error = %v, wantErr %v", fs.fs.Name(), err, tt.wantErr) return } - return - } + got, err := fs.fs.Stat(file.Name()) + if err != nil { + t.Errorf("%v.Stat() error = %v, wantErr %v", fs.fs.Name(), err, tt.wantErr) - got, err := fs.fs.Stat(file.Name()) - if err != nil { - t.Errorf("%v.Stat() error = %v, wantErr %v", fs.fs.Name(), err, tt.wantErr) + return + } - return - } + if !reflect.DeepEqual(got, want) { + t.Errorf("%v.Create().Name() = %v, want %v", fs.fs.Name(), got, want) - if !reflect.DeepEqual(got, want) { - t.Errorf("%v.Create().Name() = %v, want %v", fs.fs.Name(), got, want) - - return + return + } } }) }