Capture listener locally in accept loops to avoid nil deref on Stop

This commit is contained in:
Viktor Liu
2026-05-25 17:02:28 +02:00
parent 6db4ecf9a5
commit 88cf5f887d
3 changed files with 22 additions and 3 deletions
+7 -1
View File
@@ -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():
+7 -1
View File
@@ -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():
+8 -1
View File
@@ -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():