mirror of https://github.com/golang/go.git
io: prevent seeking to position prior to offsetwrite.base
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: a29d890d6f
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>
This commit is contained in:
parent
a0d53199b7
commit
aeb0644bd3
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue