aboutsummaryrefslogtreecommitdiff
path: root/src/internal/poll
diff options
context:
space:
mode:
authorqmuntal <quimmuntal@gmail.com>2025-08-19 13:00:02 +0200
committerQuim Muntal <quimmuntal@gmail.com>2025-08-20 10:33:51 -0700
commit509d5f647ffc413bd874c2e2bf6d1b33f9bc0ac2 (patch)
treec566db74cd33acb90133e0d2021da41b06f18c39 /src/internal/poll
parent853fc1273912b020e428c77d35e525c9225fd51e (diff)
downloadgo-509d5f647ffc413bd874c2e2bf6d1b33f9bc0ac2.tar.xz
internal/poll: don't call Seek for overlapped Windows handles
Overlapped handles don't have the file pointer updated when performing I/O operations, so there is no need to call FD.Seek to reset the file pointer. Also, some overlapped file handles don't support seeking. See #74951. Fixes #74951. Change-Id: I0edd53beed7d3862730f3b2ed5fe9ba490e66c06 Reviewed-on: https://go-review.googlesource.com/c/go/+/697295 Reviewed-by: Damien Neil <dneil@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Diffstat (limited to 'src/internal/poll')
-rw-r--r--src/internal/poll/fd_windows.go40
1 files changed, 30 insertions, 10 deletions
diff --git a/src/internal/poll/fd_windows.go b/src/internal/poll/fd_windows.go
index 52571d5fe0..ebb2abcbf8 100644
--- a/src/internal/poll/fd_windows.go
+++ b/src/internal/poll/fd_windows.go
@@ -622,12 +622,22 @@ func (fd *FD) Pread(b []byte, off int64) (int, error) {
fd.l.Lock()
defer fd.l.Unlock()
- curoffset, err := syscall.Seek(fd.Sysfd, 0, io.SeekCurrent)
- if err != nil {
- return 0, err
+ if fd.isBlocking {
+ curoffset, err := syscall.Seek(fd.Sysfd, 0, io.SeekCurrent)
+ if err != nil {
+ return 0, err
+ }
+ defer syscall.Seek(fd.Sysfd, curoffset, io.SeekStart)
+ defer fd.setOffset(curoffset)
+ } else {
+ // Overlapped handles don't have the file pointer updated
+ // when performing I/O operations, so there is no need to
+ // call Seek to reset the file pointer.
+ // Also, some overlapped file handles don't support seeking.
+ // See https://go.dev/issues/74951.
+ curoffset := fd.offset
+ defer fd.setOffset(curoffset)
}
- defer syscall.Seek(fd.Sysfd, curoffset, io.SeekStart)
- defer fd.setOffset(curoffset)
o := &fd.rop
o.InitBuf(b)
fd.setOffset(off)
@@ -847,12 +857,22 @@ func (fd *FD) Pwrite(buf []byte, off int64) (int, error) {
fd.l.Lock()
defer fd.l.Unlock()
- curoffset, err := syscall.Seek(fd.Sysfd, 0, io.SeekCurrent)
- if err != nil {
- return 0, err
+ if fd.isBlocking {
+ curoffset, err := syscall.Seek(fd.Sysfd, 0, io.SeekCurrent)
+ if err != nil {
+ return 0, err
+ }
+ defer syscall.Seek(fd.Sysfd, curoffset, io.SeekStart)
+ defer fd.setOffset(curoffset)
+ } else {
+ // Overlapped handles don't have the file pointer updated
+ // when performing I/O operations, so there is no need to
+ // call Seek to reset the file pointer.
+ // Also, some overlapped file handles don't support seeking.
+ // See https://go.dev/issues/74951.
+ curoffset := fd.offset
+ defer fd.setOffset(curoffset)
}
- defer syscall.Seek(fd.Sysfd, curoffset, io.SeekStart)
- defer fd.setOffset(curoffset)
var ntotal int
for {