summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2018-11-01 14:44:06 -0700
committerIan Lance Taylor <iant@golang.org>2018-11-01 22:07:01 +0000
commitfba2c4d76ba2beeff094e4116c44d3f121601ccd (patch)
tree8aed52d09a92040cfe5855a9b5a86e518e2d3db8
parent7495cdaf3d9e0e4074e9a2b530198e1ef322b8ad (diff)
downloadgo-git-fba2c4d76ba2beeff094e4116c44d3f121601ccd.tar.gz
[release-branch.go1.10] internal/poll, net: fix sendfile on Windows, add test
Cherry pick of CL 130855, done manually to avoid a merge conflict on the test. Fixes #27085 Change-Id: I7c4939cf5db23253a824c46c3f00fab4edec86b4 Reviewed-on: https://go-review.googlesource.com/c/146797 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
-rw-r--r--src/internal/poll/sendfile_windows.go4
-rw-r--r--src/net/sendfile_test.go62
2 files changed, 64 insertions, 2 deletions
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 2255e7c478..76c7f23992 100644
--- a/src/net/sendfile_test.go
+++ b/src/net/sendfile_test.go
@@ -5,6 +5,7 @@
package net
import (
+ "bytes"
"crypto/sha256"
"encoding/hex"
"fmt"
@@ -88,3 +89,64 @@ func TestSendfile(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)
+ }
+}