diff --git a/src/embed/embed.go b/src/embed/embed.go index 4d5e418c9024b3..5b99c5e69a6526 100644 --- a/src/embed/embed.go +++ b/src/embed/embed.go @@ -359,12 +359,14 @@ func (f *openFile) Read(b []byte) (int, error) { func (f *openFile) Seek(offset int64, whence int) (int64, error) { switch whence { - case 0: + case io.SeekStart: // offset += 0 - case 1: + case io.SeekCurrent: offset += f.offset - case 2: + case io.SeekEnd: offset += int64(len(f.f.data)) + default: + return 0, &fs.PathError{Op: "seek", Path: f.f.name, Err: fs.ErrInvalid} } if offset < 0 || offset > int64(len(f.f.data)) { return 0, &fs.PathError{Op: "seek", Path: f.f.name, Err: fs.ErrInvalid} diff --git a/src/embed/internal/embedtest/embed_test.go b/src/embed/internal/embedtest/embed_test.go index 875265556f0940..3c69cce21f9059 100644 --- a/src/embed/internal/embedtest/embed_test.go +++ b/src/embed/internal/embedtest/embed_test.go @@ -6,7 +6,9 @@ package embedtest import ( "embed" + "errors" "io" + "io/fs" "reflect" "slices" "testing" @@ -220,6 +222,15 @@ func TestOffset(t *testing.T) { t.Fatal("Seek:", off) } + // Use Seek with an invalid whence. + _, err = seeker.Seek(0, io.SeekEnd+5) + if err == nil { + t.Fatal("Seek: expected error for invalid whence") + } + if !errors.Is(err, fs.ErrInvalid) { + t.Fatalf("Seek: expected fs.ErrInvalid, got %v", err) + } + // Use ReadAt to read the entire file, ignoring the offset. at := file.(io.ReaderAt) got = make([]byte, len(want))