From 9bf2851414658f35026505a363627aaf3a1faa10 Mon Sep 17 00:00:00 2001 From: "haibo.chen" <495810242@qq.com> Date: Thu, 16 Oct 2025 13:54:41 +0800 Subject: [PATCH] fix crash issue caused by reload configuration file, which occurs when a vhost is added/removed in the new configuration. --- trunk/src/app/srs_app_config.cpp | 6 +++++ trunk/src/utest/srs_utest_reload.cpp | 36 ++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index d541a625b..12f9ac8e4 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -1509,6 +1509,12 @@ srs_error_t SrsConfig::reload_conf(SrsConfig *conf) SrsConfDirective *old_vhost = old_root->get("vhost", vhost); SrsConfDirective *new_vhost = root_->get("vhost", vhost); + // Only compare config when both old and new vhost exist. + // @see https://github.com/ossrs/srs/issues/4529 + if (!old_vhost || !new_vhost) { + continue; + } + // chunk_size, only one per vhost. if (!srs_directive_equals(new_vhost->get("chunk_size"), old_vhost->get("chunk_size"))) { for (it = subscribes_.begin(); it != subscribes_.end(); ++it) { diff --git a/trunk/src/utest/srs_utest_reload.cpp b/trunk/src/utest/srs_utest_reload.cpp index 11abf8c82..2d342e3ed 100644 --- a/trunk/src/utest/srs_utest_reload.cpp +++ b/trunk/src/utest/srs_utest_reload.cpp @@ -111,3 +111,39 @@ VOID TEST(ConfigReloadTest, ReloadVhostChunkSize) EXPECT_EQ(1, handler.count_true()); handler.reset(); } + +VOID TEST(ConfigReloadTest, ReloadAddNewVhost) +{ + srs_error_t err = srs_success; + + MockReloadHandler handler; + MockSrsReloadConfig conf; + + conf.subscribe(&handler); + // Start with one vhost + HELPER_EXPECT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost ossrs.net { chunk_size 60000; }")); + + // Add a new vhost - should not crash + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF "vhost ossrs.net { chunk_size 60000; } vhost new_vhost { chunk_size 65536; }")); + // Handler should not be triggered for new vhost + EXPECT_TRUE(handler.all_false()); + handler.reset(); +} + +VOID TEST(ConfigReloadTest, ReloadRemoveVhost) +{ + srs_error_t err = srs_success; + + MockReloadHandler handler; + MockSrsReloadConfig conf; + + conf.subscribe(&handler); + // Start with two vhosts + HELPER_EXPECT_SUCCESS(conf.mock_parse(_MIN_OK_CONF "vhost ossrs.net { chunk_size 60000; } vhost old_vhost { chunk_size 65536; }")); + + // Remove old_vhost - should not crash + HELPER_EXPECT_SUCCESS(conf.do_reload(_MIN_OK_CONF "vhost ossrs.net { chunk_size 60000; }")); + // Handler should not be triggered for removed vhost + EXPECT_TRUE(handler.all_false()); + handler.reset(); +}