diff --git a/src/plugin.c b/src/plugin.c index 2e47bb9a..0fb4d658 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -157,8 +157,8 @@ static int start_obfsproxy(const char *plugin, { char *pch; char *opts_dump; - char buf[PATH_MAX]; - int ret; + char *buf = NULL; + int ret, buf_size = 0; opts_dump = strndup(plugin_opts, OBFSPROXY_OPTS_MAX); if (!opts_dump) { @@ -171,7 +171,10 @@ static int start_obfsproxy(const char *plugin, cork_exec_add_param(exec, plugin); cork_exec_add_param(exec, "--data-dir"); - snprintf(buf, PATH_MAX, "/tmp/%s_%s:%s_%s:%s", plugin, + buf_size = 20 + strlen(plugin) + strlen(remote_host) + + strlen(remote_port) + strlen(local_host) + strlen(local_port); + buf = malloc(buf_size); + snprintf(buf, buf_size, "/tmp/%s_%s:%s_%s:%s", plugin, remote_host, remote_port, local_host, local_port); cork_exec_add_param(exec, buf); @@ -188,24 +191,25 @@ static int start_obfsproxy(const char *plugin, if (mode == MODE_CLIENT) { /* Client mode */ cork_exec_add_param(exec, "--dest"); - snprintf(buf, PATH_MAX, "%s:%s", remote_host, remote_port); + snprintf(buf, buf_size, "%s:%s", remote_host, remote_port); cork_exec_add_param(exec, buf); cork_exec_add_param(exec, "client"); - snprintf(buf, PATH_MAX, "%s:%s", local_host, local_port); + snprintf(buf, buf_size, "%s:%s", local_host, local_port); cork_exec_add_param(exec, buf); } else { /* Server mode */ cork_exec_add_param(exec, "--dest"); - snprintf(buf, PATH_MAX, "%s:%s", local_host, local_port); + snprintf(buf, buf_size, "%s:%s", local_host, local_port); cork_exec_add_param(exec, buf); cork_exec_add_param(exec, "server"); - snprintf(buf, PATH_MAX, "%s:%s", remote_host, remote_port); + snprintf(buf, buf_size, "%s:%s", remote_host, remote_port); cork_exec_add_param(exec, buf); } cork_exec_set_env(exec, env); sub = cork_subprocess_new_exec(exec, NULL, NULL, &exit_code); ret = cork_subprocess_start(sub); ss_free(opts_dump); + free(buf); return ret; } @@ -220,7 +224,6 @@ start_plugin(const char *plugin, { char *new_path = NULL; const char *current_path; - char cwd[PATH_MAX]; size_t new_path_len; int ret; @@ -236,10 +239,12 @@ start_plugin(const char *plugin, env = cork_env_clone_current(); current_path = cork_env_get(env, "PATH"); if (current_path != NULL) { - if (!getcwd(cwd, PATH_MAX)) { + char *cwd = get_current_dir_name(); + if (cwd) { new_path_len = strlen(current_path) + strlen(cwd) + 2; new_path = ss_malloc(new_path_len); snprintf(new_path, new_path_len, "%s:%s", cwd, current_path); + free(cwd); } } if (new_path != NULL)