mirror of https://github.com/spf13/afero.git
mem: Make the File return io.ErrUnexpectedEOF
Instead of panic when reading beyond its borders. This is in line with how the OS File works. Fixes #152
This commit is contained in:
parent
8d919cbe7e
commit
ec3a3111d1
|
@ -176,6 +176,9 @@ func (f *File) Read(b []byte) (n int, err error) {
|
||||||
if len(b) > 0 && int(f.at) == len(f.fileData.data) {
|
if len(b) > 0 && int(f.at) == len(f.fileData.data) {
|
||||||
return 0, io.EOF
|
return 0, io.EOF
|
||||||
}
|
}
|
||||||
|
if int(f.at) > len(f.fileData.data) {
|
||||||
|
return 0, io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
if len(f.fileData.data)-int(f.at) >= len(b) {
|
if len(f.fileData.data)-int(f.at) >= len(b) {
|
||||||
n = len(b)
|
n = len(b)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -2,6 +2,7 @@ package afero
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
@ -419,3 +420,32 @@ func TestMemFsDirMode(t *testing.T) {
|
||||||
t.Error("FileMode is not directory")
|
t.Error("FileMode is not directory")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMemFsUnexpectedEOF(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
fs := NewMemMapFs()
|
||||||
|
|
||||||
|
if err := WriteFile(fs, "file.txt", []byte("abc"), 0777); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
f, err := fs.Open("file.txt")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
// Seek beyond the end.
|
||||||
|
_, err = f.Seek(512, 0)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
buff := make([]byte, 256)
|
||||||
|
_, err = io.ReadAtLeast(f, buff, 256)
|
||||||
|
|
||||||
|
if err != io.ErrUnexpectedEOF {
|
||||||
|
t.Fatal("Expected ErrUnexpectedEOF")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue