From 144dfbc12c09333bb0c912c4678e2f518362a219 Mon Sep 17 00:00:00 2001 From: Viktor Liu Date: Mon, 25 May 2026 17:02:28 +0200 Subject: [PATCH] Capture listener locally in accept loops to avoid nil deref on Stop --- client/vnc/server/server.go | 8 +++++++- client/vnc/server/server_darwin.go | 8 +++++++- client/vnc/server/server_windows.go | 9 ++++++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/client/vnc/server/server.go b/client/vnc/server/server.go index d14584625..3ed69d909 100644 --- a/client/vnc/server/server.go +++ b/client/vnc/server/server.go @@ -682,8 +682,14 @@ func (s *Server) Stop() error { // acceptLoop handles VNC connections directly (user session mode). func (s *Server) acceptLoop() { + s.mu.Lock() + ln := s.listener + s.mu.Unlock() + if ln == nil { + return + } for { - conn, err := s.listener.Accept() + conn, err := ln.Accept() if err != nil { select { case <-s.ctx.Done(): diff --git a/client/vnc/server/server_darwin.go b/client/vnc/server/server_darwin.go index 18b5bbb7b..593de3e79 100644 --- a/client/vnc/server/server_darwin.go +++ b/client/vnc/server/server_darwin.go @@ -30,8 +30,14 @@ func (s *Server) serviceAcceptLoop() { log.Info("service mode, proxying connections to per-user agent over Unix socket") + s.mu.Lock() + ln := s.listener + s.mu.Unlock() + if ln == nil { + return + } for { - conn, err := s.listener.Accept() + conn, err := ln.Accept() if err != nil { select { case <-s.ctx.Done(): diff --git a/client/vnc/server/server_windows.go b/client/vnc/server/server_windows.go index 0d13dc045..88ebf74f8 100644 --- a/client/vnc/server/server_windows.go +++ b/client/vnc/server/server_windows.go @@ -248,8 +248,15 @@ func (s *Server) serviceAcceptLoop() { log.Info("service mode, proxying connections to agent over Unix socket") + s.mu.Lock() + ln := s.listener + s.mu.Unlock() + if ln == nil { + sm.Stop() + return + } for { - conn, err := s.listener.Accept() + conn, err := ln.Accept() if err != nil { select { case <-s.ctx.Done():