Skip to content

embed: allow seeking past EOF to match os.File behavior - #81334

Open
dajiaohuang wants to merge 2 commits into
golang:masterfrom
dajiaohuang:fix/81330-embed-fs-seek-past-eof
Open

embed: allow seeking past EOF to match os.File behavior#81334
dajiaohuang wants to merge 2 commits into
golang:masterfrom
dajiaohuang:fix/81330-embed-fs-seek-past-eof

Conversation

@dajiaohuang

Copy link
Copy Markdown

Summary

Fixes #81330

embed.FS was returning 'invalid argument' when seeking past EOF, while os.File returns nil (and subsequent Read returns io.EOF).

Problem

Seek in embed.FS checks offset > int64(len(f.f.data)) and returns an error for offsets beyond EOF. This differs from os.File behavior where seeking past EOF is allowed and subsequent reads return io.EOF.

Solution

Remove the upper bound check in Seek, allowing offsets beyond the file size. This matches the behavior of os.File and io.SectionReader.

Changes

src/embed/embed.go line 371:

- if offset < 0 || offset > int64(len(f.f.data)) {
+ if offset < 0 {

Behavior After Fix

f.Seek(100000, io.SeekStart)  // Returns nil instead of 'invalid argument'
f.Read(buf)                   // Returns io.EOF

This matches os.File, bytes.Reader, and io.SectionReader behavior.

Assisted-by: Claude Opus 4.6

…lbackNext

Fix panic when unmarshaling into a struct with an unexported pointer
field with the ,embed tag and a map[string]any type.

When the embedded pointer is nil and cannot be allocated (e.g., for
unexported fields), indirect returns an invalid addressableValue.
The marshal path already had a check for this, but the unmarshal path
did not, causing a panic when trying to call methods on the invalid value.

Fixes golang#81297
Fixes golang#81330

embed.FS was returning 'invalid argument' when seeking past EOF,
while os.File returns nil (and subsequent Read returns io.EOF).

The fix removes the upper bound check in Seek, allowing offsets
beyond the file size. This matches the behavior of os.File and
io.SectionReader, where seeking past EOF is allowed and subsequent
reads return io.EOF.

Before: f.Seek(100000, io.SeekStart) -> 'invalid argument'
After:  f.Seek(100000, io.SeekStart) -> nil, Read() -> io.EOF

Assisted-by: Claude Opus 4.6
@google-cla

google-cla Bot commented Sep 3, 2026

Copy link
Copy Markdown

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

embed: embed.FS does not allow seeking past EOF unlike os.File/bytes.Reader/io.SectionReader

1 participant