fix: Prevent creating directories again if they already exist
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user