]> Cypherpunks repositories - gostls13.git/commitdiff
io: prevent seeking to position prior to offsetwrite.base
authorJabar Asadi <jasadi@d2iq.com>
Fri, 19 May 2023 09:31:25 +0000 (09:31 +0000)
committerGopher Robot <gobot@golang.org>
Sat, 20 May 2023 00:46:20 +0000 (00:46 +0000)
We don't want to permit writing before the start of an OffsetWriter.

One of the goals of OffsetWriter is to restrict where data
can be written.

However, this rule can be violated by WriteAt() method of OffsetWriter
as the following code shows:

f, _ := os.Create("file.txt")
owr := io.NewOffsetWriter(f, 10)
owr.Write([]byte("world"))
owr.WriteAt([]byte("hello"), -10)

Change-Id: I6c7519fea68daefa641f25130cdd9803dc8aae22
GitHub-Last-Rev: a29d890d6f32fd5a1ecef84d012b8447b406e2e2
GitHub-Pull-Request: golang/go#60222
Reviewed-on: https://go-review.googlesource.com/c/go/+/495155
Run-TryBot: Ian Lance Taylor <iant@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Auto-Submit: Ian Lance Taylor <iant@google.com>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Jabar Asadi <jasadi@d2iq.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
src/io/io.go
src/io/io_test.go

index 7b8ee10a5619fc370a7b16037bd2b11a05d32604..bcb9f774f625be46e5be3e44044c63c73d5b56e1 100644 (file)
@@ -575,6 +575,10 @@ func (o *OffsetWriter) Write(p []byte) (n int, err error) {
 }
 
 func (o *OffsetWriter) WriteAt(p []byte, off int64) (n int, err error) {
+       if off < 0 {
+               return 0, errOffset
+       }
+
        off += o.base
        return o.w.WriteAt(p, off)
 }
index 35db15c3ba4fba05ff7ec9ff2d6c19a0b3deb5a8..c09b5e34d28613d43f43db937b765fd7c6e6f856 100644 (file)
@@ -608,6 +608,26 @@ func TestOffsetWriter_WriteAt(t *testing.T) {
        }
 }
 
+func TestWriteAt_PositionPriorToBase(t *testing.T) {
+       tmpdir := t.TempDir()
+       tmpfilename := "TestOffsetWriter_WriteAt"
+       tmpfile, err := os.CreateTemp(tmpdir, tmpfilename)
+       if err != nil {
+               t.Fatalf("CreateTemp(%s) failed: %v", tmpfilename, err)
+       }
+       defer tmpfile.Close()
+
+       // start writing position in OffsetWriter
+       offset := int64(10)
+       // position we want to write to the tmpfile
+       at := int64(-1)
+       w := NewOffsetWriter(tmpfile, offset)
+       _, e := w.WriteAt([]byte("hello"), at)
+       if e == nil {
+               t.Errorf("error expected to be not nil")
+       }
+}
+
 func TestOffsetWriter_Write(t *testing.T) {
        const content = "0123456789ABCDEF"
        contentSize := len(content)