From a721c859555fa226616e20583dcc265a9cada266 Mon Sep 17 00:00:00 2001 From: Seva <68725282+sevcator@users.noreply.github.com> Date: Sat, 7 Mar 2026 17:34:33 +0700 Subject: [PATCH] Bugfix: User can't change DNS Invaild Settings (#1042) * Fix core restart panic on invalid DNS config * Avoid nil instance race after core stop --- core/main.go | 17 ++++++++++++++++- service/config.go | 2 +- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/core/main.go b/core/main.go index 8870331..960ea8d 100644 --- a/core/main.go +++ b/core/main.go @@ -2,6 +2,7 @@ package core import ( "context" + "sync" "github.com/alireza0/s-ui/logger" @@ -28,6 +29,7 @@ var ( ) type Core struct { + mu sync.RWMutex isRunning bool instance *Box } @@ -46,10 +48,15 @@ func (c *Core) GetCtx() context.Context { } func (c *Core) GetInstance() *Box { + c.mu.RLock() + defer c.mu.RUnlock() return c.instance } func (c *Core) Start(sbConfig []byte) error { + c.mu.Lock() + defer c.mu.Unlock() + var opt option.Options err := opt.UnmarshalJSONContext(globalCtx, sbConfig) if err != nil { @@ -66,6 +73,7 @@ func (c *Core) Start(sbConfig []byte) error { err = c.instance.Start() if err != nil { + c.instance = nil return err } @@ -81,13 +89,20 @@ func (c *Core) Start(sbConfig []byte) error { } func (c *Core) Stop() error { + c.mu.Lock() + defer c.mu.Unlock() + c.isRunning = false if c.instance == nil { return nil } - return c.instance.Close() + err := c.instance.Close() + c.instance = nil + return err } func (c *Core) IsRunning() bool { + c.mu.RLock() + defer c.mu.RUnlock() return c.isRunning } diff --git a/service/config.go b/service/config.go index 85a41b9..8a99510 100644 --- a/service/config.go +++ b/service/config.go @@ -117,7 +117,7 @@ func (s *ConfigService) restartCoreWithConfig(config json.RawMessage) error { } }() if corePtr.IsRunning() { - err = corePtr.GetInstance().Close() + err = corePtr.Stop() if err != nil { return err }