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