]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.10] internal/poll: specify current file position when calling...
authorAlex Brainman <alex.brainman@gmail.com>
Mon, 11 Jun 2018 02:09:18 +0000 (12:09 +1000)
committerIan Lance Taylor <iant@golang.org>
Thu, 1 Nov 2018 21:42:02 +0000 (21:42 +0000)
Current SendFile implementation assumes that TransmitFile starts from
the current file position. But that appears not true for Windows 10
Version 1803.

TransmitFile documentation

https://msdn.microsoft.com/en-us/library/windows/desktop/ms740565(v=vs.85).aspx

suggests, "You can use the lpOverlapped parameter to specify a 64-bit
offset within the file at which to start the file data transfer by
setting the Offset and OffsetHigh member of the OVERLAPPED structure."

Do as it advises.

Fixes #25722

Change-Id: I241d3bf76d0d5590d4df27c6f922d637068232fb
Reviewed-on: https://go-review.googlesource.com/117816
Run-TryBot: Alex Brainman <alex.brainman@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
(cherry picked from commit af4d60428f6dc5eab10b6de23235f61cceee8bc3)
Reviewed-on: https://go-review.googlesource.com/c/146780
Run-TryBot: Ian Lance Taylor <iant@golang.org>

src/internal/poll/sendfile_windows.go

index 4a15b75236687e3c44f0cf5644ad84fbfa855fac..1a4d0ca1912539f24998869308b1b87c50e2d836 100644 (file)
@@ -25,6 +25,16 @@ func SendFile(fd *FD, src syscall.Handle, n int64) (int64, error) {
        o := &fd.wop
        o.qty = uint32(n)
        o.handle = src
+
+       // TODO(brainman): skip calling syscall.Seek if OS allows it
+       curpos, err := syscall.Seek(o.handle, 0, 1)
+       if err != nil {
+               return 0, err
+       }
+
+       o.o.OffsetHigh = uint32(curpos)
+       o.o.Offset = 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)
        })