Prevent operations on a file once it's closed

This commit is contained in:
Elara 2024-04-14 11:46:43 -07:00
parent 02532437ea
commit e6b36494e7
3 changed files with 20 additions and 1 deletions

View File

@ -266,6 +266,7 @@ type File struct {
offset uint32 offset uint32
size uint32 size uint32
readOnly bool readOnly bool
closed bool
ProgressFunc func(transferred, total uint32) ProgressFunc func(transferred, total uint32)
} }
@ -294,6 +295,10 @@ func (ifs *FS) Create(path string, size uint32) (*File, error) {
// Write writes data from the byte slice b to the file. // Write writes data from the byte slice b to the file.
// It returns the number of bytes written and an error, if any. // It returns the number of bytes written and an error, if any.
func (fl *File) Write(b []byte) (int, error) { func (fl *File) Write(b []byte) (int, error) {
if fl.closed {
return 0, fsproto.ErrFileClosed
}
if fl.readOnly { if fl.readOnly {
return 0, fsproto.ErrFileReadOnly return 0, fsproto.ErrFileReadOnly
} }
@ -384,6 +389,10 @@ func (fl *File) Write(b []byte) (int, error) {
// Read reads data from the file into the byte slice b. // Read reads data from the file into the byte slice b.
// It returns the number of bytes read and an error, if any. // It returns the number of bytes read and an error, if any.
func (fl *File) Read(b []byte) (int, error) { func (fl *File) Read(b []byte) (int, error) {
if fl.closed {
return 0, fsproto.ErrFileClosed
}
fl.fs.mtx.Lock() fl.fs.mtx.Lock()
defer fl.fs.mtx.Unlock() defer fl.fs.mtx.Unlock()
@ -504,6 +513,10 @@ func (fl *File) Stat() (fs.FileInfo, error) {
// //
// Seek returns the new offset and an error, if any. // Seek returns the new offset and an error, if any.
func (fl *File) Seek(offset int64, whence int) (int64, error) { func (fl *File) Seek(offset int64, whence int) (int64, error) {
if fl.closed {
return 0, fsproto.ErrFileClosed
}
if offset > math.MaxUint32 { if offset > math.MaxUint32 {
return 0, fsproto.ErrInvalidOffset return 0, fsproto.ErrInvalidOffset
} }
@ -534,8 +547,11 @@ func (fl *File) Seek(offset int64, whence int) (int64, error) {
return int64(fl.offset), nil return int64(fl.offset), nil
} }
// Close always returns nil // Close closes the file for future operations
func (fl *File) Close() error { func (fl *File) Close() error {
fl.fs.mtx.Lock()
defer fl.fs.mtx.Unlock()
fl.closed = true
return nil return nil
} }

View File

@ -11,6 +11,7 @@ var (
ErrFileWriteOnly = errors.New("file is write only") ErrFileWriteOnly = errors.New("file is write only")
ErrInvalidOffset = errors.New("offset out of range") ErrInvalidOffset = errors.New("offset out of range")
ErrNoRemoveRoot = errors.New("refusing to remove root directory") ErrNoRemoveRoot = errors.New("refusing to remove root directory")
ErrFileClosed = errors.New("cannot perform operation on a closed file")
) )
// Error represents an error returned by BLE FS // Error represents an error returned by BLE FS

View File

@ -61,6 +61,8 @@ func syscallErr(err error) syscall.Errno {
return syscall.EINVAL return syscall.EINVAL
case fsproto.ErrNoRemoveRoot: // refusing to remove root directory case fsproto.ErrNoRemoveRoot: // refusing to remove root directory
return syscall.EPERM return syscall.EPERM
case fsproto.ErrFileClosed: // cannot perform operation on closed file
return syscall.EBADF
default: default:
return syscall.EINVAL return syscall.EINVAL
} }