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:
Bjørn Erik Pedersen 2017-12-28 12:02:27 +01:00
parent 8d919cbe7e
commit ec3a3111d1
No known key found for this signature in database
GPG Key ID: 330E6E2BD4859D8F
2 changed files with 33 additions and 0 deletions

View File

@ -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 {

View File

@ -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")
}
}