fix: Prevent creating directories again if they already exist

This commit is contained in:
Felicitas Pojtinger
2022-01-10 23:43:45 +01:00
parent 2487479433
commit 55d05e63e8
3 changed files with 38 additions and 28 deletions

View File

@@ -5,7 +5,6 @@ import (
"database/sql" "database/sql"
"io" "io"
"io/fs" "io/fs"
"log"
"os" "os"
"sync" "sync"
@@ -550,8 +549,6 @@ func (f *File) Write(p []byte) (n int, err error) {
n, err = f.writeBuf.Write(p) n, err = f.writeBuf.Write(p)
if err != nil { if err != nil {
log.Fatal(err)
return -1, err return -1, err
} }

View File

@@ -89,7 +89,7 @@ func (f *STFS) Create(name string) (afero.File, error) {
return nil, os.ErrPermission 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 { 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( return ifs.NewFile(
f.readOps, f.readOps,
f.writeOps, f.writeOps,

View File

@@ -635,18 +635,28 @@ var createTests = []struct {
createArgs{"/test.txt"}, createArgs{"/test.txt"},
false, 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 // FIXME: STFS can create file in non-existent directory, which should not be possible
// { // {
// "Can not create /nonexistent/test.txt", // "Can not create /nonexistent/test.txt",
// createArgs{"/nonexistent/test.txt"}, // createArgs{"/nonexistent/test.txt"},
// true, // true,
// }, // },
// FIXME: STFS can create `/` file even if / exists
// {
// "Can create /",
// createArgs{"/"},
// true,
// },
} }
func TestSTFS_Create(t *testing.T) { func TestSTFS_Create(t *testing.T) {
@@ -659,34 +669,32 @@ func TestSTFS_Create(t *testing.T) {
return return
} }
want, err := fs.fs.Stat(tt.args.name) if !tt.wantErr {
if err != nil { want, err := fs.fs.Stat(tt.args.name)
t.Errorf("%v.Stat() error = %v, wantErr %v", fs.fs.Name(), err, tt.wantErr) if err != nil {
t.Errorf("%v.Stat() error = %v, wantErr %v", fs.fs.Name(), err, tt.wantErr)
return return
} }
if file == nil { if file == nil {
if (err != nil) != tt.wantErr {
t.Errorf("%v.Create() error = %v, wantErr %v", fs.fs.Name(), err, tt.wantErr) t.Errorf("%v.Create() error = %v, wantErr %v", fs.fs.Name(), err, tt.wantErr)
return 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()) return
if err != nil { }
t.Errorf("%v.Stat() error = %v, wantErr %v", fs.fs.Name(), err, tt.wantErr)
return if !reflect.DeepEqual(got, want) {
} t.Errorf("%v.Create().Name() = %v, want %v", fs.fs.Name(), got, want)
if !reflect.DeepEqual(got, want) { return
t.Errorf("%v.Create().Name() = %v, want %v", fs.fs.Name(), got, want) }
return
} }
}) })
} }