]> Cypherpunks repositories - gostls13.git/commitdiff
internal/coverage/slicewriter: fix off-by-1 error in seek utilities
authorThan McIntosh <thanm@google.com>
Mon, 24 Apr 2023 14:33:01 +0000 (10:33 -0400)
committerThan McIntosh <thanm@google.com>
Wed, 26 Apr 2023 12:44:26 +0000 (12:44 +0000)
The slicewriter Seek method was being too restrictive on offsets
accepted, due to an off-by-one problem in the error checking code.
This fixes the problem and touches up the unit tests.

Change-Id: I75d6121551de19ec9275f0e331810db231db6ea9
Reviewed-on: https://go-review.googlesource.com/c/go/+/488116
Run-TryBot: Than McIntosh <thanm@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>

src/internal/coverage/slicewriter/slicewriter.go
src/internal/coverage/slicewriter/slw_test.go

index 3522bf5770ecee7c6bbd12c5b9207467d4a7ced4..460e9dc98c31efeff60429b59d3f41ab84724509 100644 (file)
@@ -38,21 +38,21 @@ func (sws *WriteSeeker) Write(p []byte) (n int, err error) {
 func (sws *WriteSeeker) Seek(offset int64, whence int) (int64, error) {
        switch whence {
        case io.SeekStart:
-               if sws.off != offset && (offset < 0 || offset >= int64(len(sws.payload))) {
+               if sws.off != offset && (offset < 0 || offset > int64(len(sws.payload))) {
                        return 0, fmt.Errorf("invalid seek: new offset %d (out of range [0 %d]", offset, len(sws.payload))
                }
                sws.off = offset
                return offset, nil
        case io.SeekCurrent:
                newoff := sws.off + offset
-               if newoff != sws.off && (newoff < 0 || newoff >= int64(len(sws.payload))) {
+               if newoff != sws.off && (newoff < 0 || newoff > int64(len(sws.payload))) {
                        return 0, fmt.Errorf("invalid seek: new offset %d (out of range [0 %d]", newoff, len(sws.payload))
                }
                sws.off += offset
                return sws.off, nil
        case io.SeekEnd:
                newoff := int64(len(sws.payload)) + offset
-               if newoff != sws.off && (newoff < 0 || newoff >= int64(len(sws.payload))) {
+               if newoff != sws.off && (newoff < 0 || newoff > int64(len(sws.payload))) {
                        return 0, fmt.Errorf("invalid seek: new offset %d (out of range [0 %d]", newoff, len(sws.payload))
                }
                sws.off = newoff
index f4e75f40d9a29b9cbe2cd187c04a93933eb9afe0..9e267670e0cc3c3a49b0085787edbdd4e6089232 100644 (file)
@@ -47,12 +47,13 @@ func TestSliceWriter(t *testing.T) {
                sleq(t, b, p)
        }
 
-       sk := func(t *testing.T, ws *WriteSeeker, offset int64, whence int) {
+       sk := func(t *testing.T, ws *WriteSeeker, offset int64, whence int) int64 {
                t.Helper()
-               _, err := ws.Seek(offset, whence)
+               off, err := ws.Seek(offset, whence)
                if err != nil {
                        t.Fatalf("unexpected seek error: %v", err)
                }
+               return off
        }
 
        wp1 := []byte{1, 2}
@@ -80,6 +81,8 @@ func TestSliceWriter(t *testing.T) {
        rf(t, ws, []byte{2, 7})
        sk(t, ws, -4, io.SeekEnd)
        rf(t, ws, []byte{2, 7})
+       off := sk(t, ws, 0, io.SeekEnd)
+       sk(t, ws, off, io.SeekStart)
 
        // seek back and overwrite
        sk(t, ws, 1, io.SeekStart)
@@ -98,7 +101,7 @@ func TestSliceWriter(t *testing.T) {
        if err == nil {
                t.Fatalf("expected error on invalid -1 seek")
        }
-       _, err = ws.Seek(int64(len(ws.BytesWritten())), io.SeekStart)
+       _, err = ws.Seek(int64(len(ws.BytesWritten())+1), io.SeekStart)
        if err == nil {
                t.Fatalf("expected error on invalid %d seek", len(ws.BytesWritten()))
        }
@@ -108,7 +111,7 @@ func TestSliceWriter(t *testing.T) {
        if err == nil {
                t.Fatalf("expected error on invalid -1 seek")
        }
-       _, err = ws.Seek(int64(len(ws.BytesWritten())), io.SeekCurrent)
+       _, err = ws.Seek(int64(len(ws.BytesWritten())+1), io.SeekCurrent)
        if err == nil {
                t.Fatalf("expected error on invalid %d seek", len(ws.BytesWritten()))
        }