diff --git a/mem/file.go b/mem/file.go index 5401a3b..885e554 100644 --- a/mem/file.go +++ b/mem/file.go @@ -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) { 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) { n = len(b) } else { diff --git a/memmap_test.go b/memmap_test.go index 09d8680..47414ab 100644 --- a/memmap_test.go +++ b/memmap_test.go @@ -2,6 +2,7 @@ package afero import ( "fmt" + "io" "os" "path/filepath" "runtime" @@ -419,3 +420,32 @@ func TestMemFsDirMode(t *testing.T) { 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") + } +}