mount: detect and deal with seeking beyond end of file - fixes #828

This commit is contained in:
Nick Craig-Wood 2016-11-05 09:59:36 +00:00
parent 7cfb1bdc70
commit 64b5a76bec
3 changed files with 27 additions and 0 deletions

View File

@ -68,6 +68,7 @@ func mountOptions(device string) (options []fuse.MountOption) {
// returns an error, and an error channel for the serve process to // returns an error, and an error channel for the serve process to
// report an error when fusermount is called. // report an error when fusermount is called.
func mount(f fs.Fs, mountpoint string) (<-chan error, error) { func mount(f fs.Fs, mountpoint string) (<-chan error, error) {
fs.Debug(f, "Mounting on %q", mountpoint)
c, err := fuse.Mount(mountpoint, mountOptions(f.Name()+":"+f.Root())...) c, err := fuse.Mount(mountpoint, mountOptions(f.Name()+":"+f.Root())...)
if err != nil { if err != nil {
return nil, err return nil, err

View File

@ -79,6 +79,14 @@ func (fh *ReadFileHandle) Read(ctx context.Context, req *fuse.ReadRequest, resp
return errClosedFileHandle return errClosedFileHandle
} }
if req.Offset != fh.offset { if req.Offset != fh.offset {
// Are we attempting to seek beyond the end of the
// file - if so just return EOF leaving the underlying
// file in an unchanged state.
if req.Offset >= fh.o.Size() {
fs.Debug(fh.o, "ReadFileHandle.Read attempt to read beyond end of file: %d > %d", req.Offset, fh.o.Size())
resp.Data = nil
return nil
}
err := fh.seek(req.Offset) err := fh.seek(req.Offset)
if err != nil { if err != nil {
return err return err

View File

@ -90,6 +90,7 @@ func TestReadSeek(t *testing.T) {
fd, err := os.Open(run.path("testfile")) fd, err := os.Open(run.path("testfile"))
assert.NoError(t, err) assert.NoError(t, err)
// Seek to half way
_, err = fd.Seek(5, 0) _, err = fd.Seek(5, 0)
assert.NoError(t, err) assert.NoError(t, err)
@ -97,6 +98,23 @@ func TestReadSeek(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, buf, []byte("HELLO")) assert.Equal(t, buf, []byte("HELLO"))
// Test seeking to the end
_, err = fd.Seek(10, 0)
assert.NoError(t, err)
buf, err = ioutil.ReadAll(fd)
assert.NoError(t, err)
assert.Equal(t, buf, []byte(""))
// Test seeking beyond the end
_, err = fd.Seek(1000000, 0)
assert.NoError(t, err)
buf, err = ioutil.ReadAll(fd)
assert.NoError(t, err)
assert.Equal(t, buf, []byte(""))
// Now back to the start
_, err = fd.Seek(0, 0) _, err = fd.Seek(0, 0)
assert.NoError(t, err) assert.NoError(t, err)