Skip to content

Commit d35135b

Browse files
committed
internal/poll, net: fix sendfile on Windows, add test
Fixes #27085 Change-Id: I4eb3ff7c76e0b8e4d8fe0298f739b0284d74a031 Reviewed-on: https://go-review.googlesource.com/130855 Reviewed-by: Ian Lance Taylor <[email protected]> Run-TryBot: Brad Fitzpatrick <[email protected]> TryBot-Result: Gobot Gobot <[email protected]>
1 parent 3fd62ce commit d35135b

File tree

2 files changed

+63
-2
lines changed

2 files changed

+63
-2
lines changed

src/internal/poll/sendfile_windows.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ func SendFile(fd *FD, src syscall.Handle, n int64) (int64, error) {
3232
return 0, err
3333
}
3434

35-
o.o.OffsetHigh = uint32(curpos)
36-
o.o.Offset = uint32(curpos >> 32)
35+
o.o.Offset = uint32(curpos)
36+
o.o.OffsetHigh = uint32(curpos >> 32)
3737

3838
done, err := wsrv.ExecIO(o, func(o *operation) error {
3939
return syscall.TransmitFile(o.fd.Sysfd, o.handle, o.qty, 0, &o.o, nil, syscall.TF_WRITE_BEHIND)

src/net/sendfile_test.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,3 +149,64 @@ func TestSendfileParts(t *testing.T) {
149149
t.Error(err)
150150
}
151151
}
152+
153+
func TestSendfileSeeked(t *testing.T) {
154+
ln, err := newLocalListener("tcp")
155+
if err != nil {
156+
t.Fatal(err)
157+
}
158+
defer ln.Close()
159+
160+
const seekTo = 65 << 10
161+
const sendSize = 10 << 10
162+
163+
errc := make(chan error, 1)
164+
go func(ln Listener) {
165+
// Wait for a connection.
166+
conn, err := ln.Accept()
167+
if err != nil {
168+
errc <- err
169+
close(errc)
170+
return
171+
}
172+
173+
go func() {
174+
defer close(errc)
175+
defer conn.Close()
176+
177+
f, err := os.Open(twain)
178+
if err != nil {
179+
errc <- err
180+
return
181+
}
182+
defer f.Close()
183+
if _, err := f.Seek(seekTo, os.SEEK_SET); err != nil {
184+
errc <- err
185+
return
186+
}
187+
188+
_, err = io.CopyN(conn, f, sendSize)
189+
if err != nil {
190+
errc <- err
191+
return
192+
}
193+
}()
194+
}(ln)
195+
196+
c, err := Dial("tcp", ln.Addr().String())
197+
if err != nil {
198+
t.Fatal(err)
199+
}
200+
defer c.Close()
201+
202+
buf := new(bytes.Buffer)
203+
buf.ReadFrom(c)
204+
205+
if buf.Len() != sendSize {
206+
t.Errorf("Got %d bytes; want %d", buf.Len(), sendSize)
207+
}
208+
209+
for err := range errc {
210+
t.Error(err)
211+
}
212+
}

0 commit comments

Comments
 (0)