From af6ff6275a382a9999dd69bd69ad4cd8927277ba Mon Sep 17 00:00:00 2001 From: xiezhengyao Date: Tue, 10 Sep 2024 15:47:05 +0800 Subject: [PATCH] fix: fd operator segment fault because not being cached --- net_netfd.go | 5 +++++ net_polldesc.go | 14 +++++--------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/net_netfd.go b/net_netfd.go index 96bc0945..81acc109 100644 --- a/net_netfd.go +++ b/net_netfd.go @@ -137,6 +137,11 @@ func (c *netFD) connect(ctx context.Context, la, ra syscall.Sockaddr) (rsa sysca } c.pd = newPollDesc(c.fd) + defer func() { + // free operator to avoid leak + c.pd.operator.Free() + c.pd = nil + }() for { // Performing multiple connect system calls on a // non-blocking socket under Unix variants does not diff --git a/net_polldesc.go b/net_polldesc.go index c197850e..89becc90 100644 --- a/net_polldesc.go +++ b/net_polldesc.go @@ -24,12 +24,11 @@ import ( func newPollDesc(fd int) *pollDesc { pd := &pollDesc{} poll := pollmanager.Pick() - pd.operator = &FDOperator{ - poll: poll, - FD: fd, - OnWrite: pd.onwrite, - OnHup: pd.onhup, - } + pd.operator = poll.Alloc() + pd.operator.poll = poll + pd.operator.FD = fd + pd.operator.OnWrite = pd.onwrite + pd.operator.OnHup = pd.onhup pd.writeTrigger = make(chan struct{}) pd.closeTrigger = make(chan struct{}) return pd @@ -60,10 +59,7 @@ func (pd *pollDesc) WaitWrite(ctx context.Context) (err error) { err = nil case <-ctx.Done(): // triggered by ctx // deregister from poller, upper caller function will close fd - // detach first but there's a very small possibility that operator is doing in poller, - // so need call unused() to wait operator done pd.detach() - pd.operator.unused() err = mapErr(ctx.Err()) } // double check close trigger