From a0a75dfab6ad9094114cdc08a7ea9568451a25e8 Mon Sep 17 00:00:00 2001 From: Alessandro Ros Date: Sat, 6 Dec 2025 22:51:25 +0100 Subject: [PATCH] fix panic when changing log file to a nonexisting directory (#5132) (#5249) --- internal/core/core.go | 20 ++++++++++++++++++-- internal/core/core_test.go | 20 ++++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/internal/core/core.go b/internal/core/core.go index 5c60fb1c..d429f249 100644 --- a/internal/core/core.go +++ b/internal/core/core.go @@ -1010,15 +1010,31 @@ func (p *Core) closeResources(newConf *conf.Conf, calledByAPI bool) { } if closeLogger && p.logger != nil { - p.logger.Close() + if newConf == nil { + p.logger.Close() + } p.logger = nil } } func (p *Core) reloadConf(newConf *conf.Conf, calledByAPI bool) error { + oldLogger := p.logger + p.closeResources(newConf, calledByAPI) + p.conf = newConf - return p.createResources(false) + + err := p.createResources(false) + if err != nil { + p.logger = oldLogger + return err + } + + if p.logger != oldLogger { + oldLogger.Close() + } + + return nil } // APIConfigSet is called by api. diff --git a/internal/core/core_test.go b/internal/core/core_test.go index 1466b600..8fae7479 100644 --- a/internal/core/core_test.go +++ b/internal/core/core_test.go @@ -132,3 +132,23 @@ func TestCoreHotReloading(t *testing.T) { defer conn.Close() }() } + +func TestCoreHotReloadingAndLoggerError(t *testing.T) { + confPath := filepath.Join(os.TempDir(), "rtsp-conf") + + err := os.WriteFile(confPath, []byte(""), + 0o644) + require.NoError(t, err) + defer os.Remove(confPath) + + p, ok := New([]string{confPath}) + require.Equal(t, true, ok) + defer p.Close() + + err = os.WriteFile(confPath, []byte("logDestinations: [file]\n"+ + "logFile: /nonexisting/nonexist\n"), + 0o644) + require.NoError(t, err) + + p.Wait() +}