mirror of
https://github.com/rclone/rclone.git
synced 2024-11-29 11:55:01 +01:00
mount: detect and deal with seeking beyond end of file - fixes #828
This commit is contained in:
parent
7cfb1bdc70
commit
64b5a76bec
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user