From 1b930aa5e114c44ce265c6689cbf749e94055555 Mon Sep 17 00:00:00 2001 From: xfy911 Date: Sun, 7 Jun 2026 06:06:59 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=B6=88=E9=99=A4=E7=BC=96=E8=AF=91?= =?UTF-8?q?=E8=AD=A6=E5=91=8A=E5=B9=B6=E4=BF=AE=E5=A4=8D=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=B8=85=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 config.c 和 proxy.c 中的 strncpy 替换为 memcpy + 显式 null 结尾, 消除 GCC -Wstringop-truncation 警告 - 修复 integration_test.sh 的 kill_server 函数,补充对 -c 配置方式启动的 服务器进程的清理,避免端口占用导致后续测试失败 编译零警告,142 个单元测试 + 80 项集成测试全部通过 --- config.c | 10 ++++++++-- proxy.c | 6 ++++-- tests/integration_test.sh | 4 ++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/config.c b/config.c index e83f57f..baa3a2d 100644 --- a/config.c +++ b/config.c @@ -382,8 +382,14 @@ bool config_load_from_file(const char *path, cocoon_config_t *config) { } } if (prefix[0] && target[0] && config->num_proxies < COCOON_MAX_PROXY_RULES) { - strncpy(config->proxies[config->num_proxies].prefix, prefix, sizeof(config->proxies[0].prefix)-1); - strncpy(config->proxies[config->num_proxies].target, target, sizeof(config->proxies[0].target)-1); + size_t prefix_len = strlen(prefix); + if (prefix_len >= sizeof(config->proxies[0].prefix)) prefix_len = sizeof(config->proxies[0].prefix) - 1; + memcpy(config->proxies[config->num_proxies].prefix, prefix, prefix_len); + config->proxies[config->num_proxies].prefix[prefix_len] = '\0'; + size_t target_len = strlen(target); + if (target_len >= sizeof(config->proxies[0].target)) target_len = sizeof(config->proxies[0].target) - 1; + memcpy(config->proxies[config->num_proxies].target, target, target_len); + config->proxies[config->num_proxies].target[target_len] = '\0'; config->num_proxies++; } } else { diff --git a/proxy.c b/proxy.c index 9a0f70a..45a1f57 100644 --- a/proxy.c +++ b/proxy.c @@ -78,8 +78,10 @@ bool proxy_add_rule(cocoon_proxy_config_t *cfg, const char *prefix, const char * rule->target_host[host_len] = '\0'; rule->target_port = (uint16_t)atoi(colon + 1); } else { - strncpy(rule->target_host, host_port, sizeof(rule->target_host) - 1); - rule->target_host[sizeof(rule->target_host) - 1] = '\0'; + size_t host_len = strlen(host_port); + if (host_len >= sizeof(rule->target_host)) host_len = sizeof(rule->target_host) - 1; + memcpy(rule->target_host, host_port, host_len); + rule->target_host[host_len] = '\0'; rule->target_port = https ? 443 : 80; } diff --git a/tests/integration_test.sh b/tests/integration_test.sh index 979ec70..0a07cb0 100755 --- a/tests/integration_test.sh +++ b/tests/integration_test.sh @@ -27,6 +27,10 @@ kill_server() { if [[ -n "$pids" ]]; then echo "$pids" | xargs kill -9 2>/dev/null || true fi + pids=$(pgrep -f "cocoon.*-c " 2>/dev/null || true) + if [[ -n "$pids" ]]; then + echo "$pids" | xargs kill -9 2>/dev/null || true + fi sleep 0.5 # 确保端口已释放 for i in {1..20}; do