From: Brad Fitzpatrick Date: Wed, 22 Aug 2018 20:31:37 +0000 (+0000) Subject: [release-branch.go1.11] internal/poll, net: fix sendfile on Windows, add test X-Git-Tag: go1.11rc2~1 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=ca25572abb8ea983a4e74c04a7c5719b7704238d;p=gostls13.git [release-branch.go1.11] internal/poll, net: fix sendfile on Windows, add test Fixes #27085 Change-Id: I4eb3ff7c76e0b8e4d8fe0298f739b0284d74a031 Reviewed-on: https://go-review.googlesource.com/130895 Run-TryBot: Brad Fitzpatrick Reviewed-by: Andrew Bonventre TryBot-Result: Gobot Gobot --- diff --git a/src/internal/poll/sendfile_windows.go b/src/internal/poll/sendfile_windows.go index 1a4d0ca191..dc93e851d6 100644 --- a/src/internal/poll/sendfile_windows.go +++ b/src/internal/poll/sendfile_windows.go @@ -32,8 +32,8 @@ func SendFile(fd *FD, src syscall.Handle, n int64) (int64, error) { return 0, err } - o.o.OffsetHigh = uint32(curpos) - o.o.Offset = uint32(curpos >> 32) + o.o.Offset = uint32(curpos) + o.o.OffsetHigh = uint32(curpos >> 32) done, err := wsrv.ExecIO(o, func(o *operation) error { return syscall.TransmitFile(o.fd.Sysfd, o.handle, o.qty, 0, &o.o, nil, syscall.TF_WRITE_BEHIND) diff --git a/src/net/sendfile_test.go b/src/net/sendfile_test.go index ecc00d3c2a..3b982774b0 100644 --- a/src/net/sendfile_test.go +++ b/src/net/sendfile_test.go @@ -149,3 +149,64 @@ func TestSendfileParts(t *testing.T) { t.Error(err) } } + +func TestSendfileSeeked(t *testing.T) { + ln, err := newLocalListener("tcp") + if err != nil { + t.Fatal(err) + } + defer ln.Close() + + const seekTo = 65 << 10 + const sendSize = 10 << 10 + + errc := make(chan error, 1) + go func(ln Listener) { + // Wait for a connection. + conn, err := ln.Accept() + if err != nil { + errc <- err + close(errc) + return + } + + go func() { + defer close(errc) + defer conn.Close() + + f, err := os.Open(twain) + if err != nil { + errc <- err + return + } + defer f.Close() + if _, err := f.Seek(seekTo, os.SEEK_SET); err != nil { + errc <- err + return + } + + _, err = io.CopyN(conn, f, sendSize) + if err != nil { + errc <- err + return + } + }() + }(ln) + + c, err := Dial("tcp", ln.Addr().String()) + if err != nil { + t.Fatal(err) + } + defer c.Close() + + buf := new(bytes.Buffer) + buf.ReadFrom(c) + + if buf.Len() != sendSize { + t.Errorf("Got %d bytes; want %d", buf.Len(), sendSize) + } + + for err := range errc { + t.Error(err) + } +}