]> Cypherpunks repositories - gostls13.git/commitdiff
net: do not call Windows TransmitFile for large files
authorAlex Brainman <alex.brainman@gmail.com>
Mon, 22 Jul 2019 09:09:33 +0000 (19:09 +1000)
committerEmmanuel Odeke <emm.odeke@gmail.com>
Tue, 27 Aug 2019 16:54:49 +0000 (16:54 +0000)
TransmitFile does not allow for number of bytes that can be
transmitted to be larger than 2147483646. See

https://docs.microsoft.com/en-us/windows/win32/api/mswsock/nf-mswsock-transmitfile

for details. So adjust sendFile accordingly.

No test added, because this would require creating large file
(more than 2GB file).

Fixes #33193.

Change-Id: I82e0cb104d112264e4ea363bb20b6d02ac30b38e
Reviewed-on: https://go-review.googlesource.com/c/go/+/187037
Run-TryBot: Alex Brainman <alex.brainman@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com>
src/net/sendfile_windows.go

index bccd8b149f738e55ce61d406b1400dff25069b6b..a223e2562ee7e52e84ba7d3e33fbbf3cab6b77ac 100644 (file)
@@ -29,6 +29,13 @@ func sendFile(fd *netFD, r io.Reader) (written int64, err error, handled bool) {
                if n <= 0 {
                        return 0, nil, true
                }
+               // TransmitFile can be invoked in one call with at most
+               // 2,147,483,646 bytes: the maximum value for a 32-bit integer minus 1.
+               // See https://docs.microsoft.com/en-us/windows/win32/api/mswsock/nf-mswsock-transmitfile
+               const maxSendBytes = 0x7fffffff - 1
+               if n > maxSendBytes {
+                       return 0, nil, false
+               }
        }
        f, ok := r.(*os.File)
        if !ok {