Skip to content

Commit 8d575ee

Browse files
authored
Merge pull request #262 from TileDB-Inc/sa/sc-28666/fix-vfs-seek
Fix VFSfh.Seek nil pointer bug when seeking immediately after Open
2 parents a5d1bc5 + c3e7e51 commit 8d575ee

File tree

2 files changed

+24
-16
lines changed

2 files changed

+24
-16
lines changed

vfs.go

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import "C"
1212
import (
1313
"fmt"
1414
"io"
15+
"math"
1516
"strings"
1617
"unsafe"
1718

@@ -553,36 +554,38 @@ func (v *VFSfh) Sync() error {
553554

554555
// Seek to an offset
555556
func (v *VFSfh) Seek(offset int64, whence int) (int64, error) {
556-
absOffset := uint64(offset)
557-
if offset <= 0 {
558-
absOffset = uint64(-1 * offset)
557+
if v.size == nil {
558+
if err := v.fetchAndSetSize(); err != nil {
559+
return -1, err
560+
}
559561
}
560-
var origin uint64
561562

563+
var origin uint64
562564
switch whence {
563565
case io.SeekStart:
564566
origin = 0
565567
case io.SeekCurrent:
566568
origin = v.offset
567569
case io.SeekEnd:
568-
// If the size is empty, fetch it
569-
if v.size == nil {
570-
err := v.fetchAndSetSize()
571-
if err != nil {
572-
return -1, err
573-
}
574-
}
575570
origin = *v.size
576571
default:
577572
return -1, fmt.Errorf("unknown seek whence")
578573
}
579574

580-
if (offset < 0 && absOffset > origin) ||
581-
(offset >= 0 && absOffset > *v.size-origin) {
582-
return -1, fmt.Errorf("invalid offset")
575+
var newOffset uint64
576+
if offset >= 0 {
577+
newOffset = origin + uint64(offset)
578+
if newOffset > *v.size {
579+
return -1, fmt.Errorf("invalid offset, attempt to move beyond end of file")
580+
}
581+
} else {
582+
if offset == math.MinInt64 || uint64(-offset) > origin {
583+
return -1, fmt.Errorf("invalid offset, attempt to move before start of file")
584+
}
585+
newOffset = origin - uint64(-offset)
583586
}
584587

585-
v.offset = uint64(int64(origin) + offset)
588+
v.offset = newOffset
586589
return int64(v.offset), nil
587590
}
588591

vfs_test.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,11 @@ func TestVFSFH(t *testing.T) {
143143

144144
r, err := vfs.Open(tmpFilePath, TILEDB_VFS_READ)
145145
require.NoError(t, err)
146+
147+
noffset, err := r.Seek(0, io.SeekStart)
148+
require.NoError(t, err)
149+
assert.EqualValues(t, 0, noffset)
150+
146151
bRead := make([]byte, 3)
147152
n, err := r.Read(bRead)
148153
require.NoError(t, err)
@@ -155,7 +160,7 @@ func TestVFSFH(t *testing.T) {
155160
assert.Equal(t, io.EOF, err)
156161
assert.Equal(t, 0, n)
157162

158-
noffset, err := r.Seek(0, io.SeekStart)
163+
noffset, err = r.Seek(0, io.SeekStart)
159164
require.NoError(t, err)
160165
assert.EqualValues(t, 0, noffset)
161166
n, err = r.Read(bRead)

0 commit comments

Comments
 (0)