From 74140d3c675ec3d4f209f2dca0b9af9f86c2e2d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Sun, 17 May 2026 18:47:16 +0800 Subject: [PATCH] usbip: close pre-promotion conns on shutdown Tie accepted conns to s.ctx via closeConnOnContextDone and wait for dispatch goroutines in Close so handshake reads/writes can no longer leak goroutines or fds past service shutdown. --- service/usbip/server.go | 3 +++ service/usbip/server_shared.go | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/service/usbip/server.go b/service/usbip/server.go index 7628bfb84..384a84918 100644 --- a/service/usbip/server.go +++ b/service/usbip/server.go @@ -36,6 +36,8 @@ type ServerService struct { sessions map[DataSession]struct{} sessionsClosed bool sessionsWG sync.WaitGroup + + pendingConnsWG sync.WaitGroup } func NewServerService(ctx context.Context, logger log.ContextLogger, tag string, options option.USBIPServerServiceOptions) (adapter.Service, error) { @@ -126,6 +128,7 @@ func (s *ServerService) Close() error { for _, session := range sessions { _ = session.Close() } + s.pendingConnsWG.Wait() s.sessionsWG.Wait() s.reconcileAccess.Lock() diff --git a/service/usbip/server_shared.go b/service/usbip/server_shared.go index 7e3e27ffd..64254ec08 100644 --- a/service/usbip/server_shared.go +++ b/service/usbip/server_shared.go @@ -34,11 +34,15 @@ func (s *ServerService) acceptLoop(ln net.Listener) { s.logger.Error("accept: ", err) return } + s.pendingConnsWG.Add(1) go s.dispatchConn(conn) } } func (s *ServerService) dispatchConn(conn net.Conn) { + defer s.pendingConnsWG.Done() + cancelClose := closeConnOnContextDone(s.ctx, conn) + defer cancelClose() var prefix [controlPrefaceSize]byte _, err := io.ReadFull(conn, prefix[:]) if err != nil {