From 273a5fa977c407c6573bede0847d6d04ab048eae Mon Sep 17 00:00:00 2001 From: samosvalishe Date: Mon, 21 Sep 2026 13:43:20 +0300 Subject: [PATCH] =?UTF-8?q?fix(netconn):=20=D0=BE=D1=82=D0=B4=D0=B0=D0=B2?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D0=BE=D1=81=D1=82=D0=B0=D1=82=D0=BE=D0=BA?= =?UTF-8?q?=20=D0=BE=D1=87=D0=B5=D1=80=D0=B5=D0=B4=D0=B8=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20=D0=B7=D0=B0=D0=BA=D1=80=D1=8B=D1=82=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=B8=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/netconn/pktpipe.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/internal/netconn/pktpipe.go b/internal/netconn/pktpipe.go index 816809e..5841aa7 100644 --- a/internal/netconn/pktpipe.go +++ b/internal/netconn/pktpipe.go @@ -85,6 +85,11 @@ func (p *packetPipe) ReadFrom(b []byte) (int, net.Addr, error) { select { case <-p.done: return 0, nil, net.ErrClosed + case <-p.peer.done: + if n, ok := p.drain(b); ok { + return n, p.remote, nil + } + return 0, nil, net.ErrClosed case <-changed: continue case <-timeout: @@ -100,6 +105,20 @@ func (p *packetPipe) ReadFrom(b []byte) (int, net.Addr, error) { } } +func (p *packetPipe) drain(b []byte) (int, bool) { + select { + case buf, ok := <-p.rx: + if !ok { + return 0, false + } + n := copy(b, *buf) + p.pool.Put(buf) + return n, true + default: + return 0, false + } +} + func (p *packetPipe) readDeadline() (time.Time, <-chan struct{}) { p.deadline.mu.Lock() defer p.deadline.mu.Unlock()