]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.11] internal/poll, net: fix sendfile on Windows, add test
authorBrad Fitzpatrick <bradfitz@golang.org>
Wed, 22 Aug 2018 20:31:37 +0000 (20:31 +0000)
committerBrad Fitzpatrick <bradfitz@golang.org>
Wed, 22 Aug 2018 21:12:15 +0000 (21:12 +0000)
Fixes #27085

Change-Id: I4eb3ff7c76e0b8e4d8fe0298f739b0284d74a031
Reviewed-on: https://go-review.googlesource.com/130895
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Andrew Bonventre <andybons@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/internal/poll/sendfile_windows.go
src/net/sendfile_test.go

index 1a4d0ca1912539f24998869308b1b87c50e2d836..dc93e851d63a459fa599e8307eb48dedf6a188db 100644 (file)
@@ -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)
index ecc00d3c2a0caaad7b2a04f488920d4ea15f867e..3b982774b02eb954d97573058c0e891036f8585e 100644 (file)
@@ -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)
+       }
+}