Commit 8e2d90dc authored by Alex Brainman's avatar Alex Brainman

internal/poll: be explicit when using runtime netpoller

internal/poll package assumes that only net sockets use runtime
netpoller on windows. We get memory corruption if other file
handles are passed into runtime poller. Make FD.Init receive
and use useNetpoller argument, so FD.Init caller is explicit
about using runtime netpoller.

Fixes #21172

Change-Id: I60e2bfedf9dda9b341eb7a3e5221035db29f5739
Reviewed-on: https://go-review.googlesource.com/65810Reviewed-by: 's avatarIan Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 4cff1047
...@@ -42,6 +42,7 @@ type FD struct { ...@@ -42,6 +42,7 @@ type FD struct {
// This can be called multiple times on a single FD. // This can be called multiple times on a single FD.
// The net argument is a network name from the net package (e.g., "tcp"), // The net argument is a network name from the net package (e.g., "tcp"),
// or "file". // or "file".
// Set pollable to true if fd should be managed by runtime netpoll.
func (fd *FD) Init(net string, pollable bool) error { func (fd *FD) Init(net string, pollable bool) error {
// We don't actually care about the various network types. // We don't actually care about the various network types.
if net == "file" { if net == "file" {
......
...@@ -302,7 +302,8 @@ var logInitFD func(net string, fd *FD, err error) ...@@ -302,7 +302,8 @@ var logInitFD func(net string, fd *FD, err error)
// This can be called multiple times on a single FD. // This can be called multiple times on a single FD.
// The net argument is a network name from the net package (e.g., "tcp"), // The net argument is a network name from the net package (e.g., "tcp"),
// or "file" or "console" or "dir". // or "file" or "console" or "dir".
func (fd *FD) Init(net string) (string, error) { // Set pollable to true if fd should be managed by runtime netpoll.
func (fd *FD) Init(net string, pollable bool) (string, error) {
if initErr != nil { if initErr != nil {
return "", initErr return "", initErr
} }
...@@ -323,7 +324,7 @@ func (fd *FD) Init(net string) (string, error) { ...@@ -323,7 +324,7 @@ func (fd *FD) Init(net string) (string, error) {
} }
var err error var err error
if !fd.isFile && !fd.isConsole && !fd.isDir { if pollable {
// Only call init for a network socket. // Only call init for a network socket.
// This means that we don't add files to the runtime poller. // This means that we don't add files to the runtime poller.
// Adding files to the runtime poller can confuse matters // Adding files to the runtime poller can confuse matters
......
...@@ -52,7 +52,7 @@ func newFD(sysfd syscall.Handle, family, sotype int, net string) (*netFD, error) ...@@ -52,7 +52,7 @@ func newFD(sysfd syscall.Handle, family, sotype int, net string) (*netFD, error)
} }
func (fd *netFD) init() error { func (fd *netFD) init() error {
errcall, err := fd.pfd.Init(fd.net) errcall, err := fd.pfd.Init(fd.net, true)
if errcall != "" { if errcall != "" {
err = wrapSyscallError(errcall, err) err = wrapSyscallError(errcall, err)
} }
......
...@@ -54,7 +54,7 @@ func newFile(h syscall.Handle, name string, kind string) *File { ...@@ -54,7 +54,7 @@ func newFile(h syscall.Handle, name string, kind string) *File {
// Ignore initialization errors. // Ignore initialization errors.
// Assume any problems will show up in later I/O. // Assume any problems will show up in later I/O.
f.pfd.Init(kind) f.pfd.Init(kind, false)
return f return f
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment