Repository: trafficserver Updated Branches: refs/heads/master 9f4d1d1e3 -> 1f7835bb8
TS-4003: CID 1338381 & 1022062 in traffic_cop Remove unnecessary string buffering. This closes #329. Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/1f7835bb Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/1f7835bb Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/1f7835bb Branch: refs/heads/master Commit: 1f7835bb89827a5e0fd232111133637ce36635d0 Parents: 9f4d1d1 Author: Daniel Xu <[email protected]> Authored: Mon Nov 9 21:35:54 2015 +0000 Committer: James Peach <[email protected]> Committed: Mon Nov 9 21:17:43 2015 -0800 ---------------------------------------------------------------------- cmd/traffic_cop/traffic_cop.cc | 38 +++++++------------------------------ 1 file changed, 7 insertions(+), 31 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1f7835bb/cmd/traffic_cop/traffic_cop.cc ---------------------------------------------------------------------- diff --git a/cmd/traffic_cop/traffic_cop.cc b/cmd/traffic_cop/traffic_cop.cc index 133a979..94cfcd3 100644 --- a/cmd/traffic_cop/traffic_cop.cc +++ b/cmd/traffic_cop/traffic_cop.cc @@ -94,7 +94,6 @@ static gid_t admin_gid; static bool admin_user_p = false; static char manager_binary[PATH_NAME_MAX] = "traffic_manager"; static char server_binary[PATH_NAME_MAX] = "traffic_server"; -static char manager_options[OPTIONS_LEN_MAX] = ""; static char log_file[PATH_NAME_MAX] = "traffic.out"; @@ -726,10 +725,6 @@ static void spawn_manager() { char prog[PATH_NAME_MAX]; - char *options[OPTIONS_MAX]; - char *last; - char *tok; - ats_scoped_str bindir(config_read_bin_dir()); cop_log_trace("Entering spawn_manager()\n"); @@ -746,40 +741,21 @@ spawn_manager() if (access(log_file, W_OK) < 0 && errno == EACCES) { char old_log_file[PATH_NAME_MAX]; snprintf(old_log_file, sizeof(old_log_file), "%s.old", log_file); + cop_log(COP_NOTICE, "renaming %s to %s as it is not writeable\n", log_file, old_log_file); // coverity[toctou] - rename(log_file, old_log_file); - cop_log(COP_WARNING, "rename %s to %s as it is not accessible.\n", log_file, old_log_file); - } - - // Bind stdout and stderr of traffic_manager to traffic.out - int max_opts_len = OPTIONS_LEN_MAX - strlen(manager_options); - char tm_opt_buf[max_opts_len]; - int cx = snprintf(tm_opt_buf, max_opts_len, " --%s %s --%s %s", TM_OPT_BIND_STDOUT, log_file, TM_OPT_BIND_STDERR, log_file); - if (cx >= 0 && cx < max_opts_len) - strcat(manager_options, tm_opt_buf); - else - cop_log(COP_WARNING, "bind_stdout and bind_stderr flags are too long, not binding anything\n"); - - cop_log_trace("spawn_manager: Launching %s with options '%s'\n", prog, manager_options); - int i; - for (i = 0; i < OPTIONS_MAX; i++) { - options[i] = NULL; - } - options[0] = prog; - i = 1; - tok = strtok_r(manager_options, " ", &last); - options[i++] = tok; - if (tok != NULL) { - while (i < OPTIONS_MAX && (tok = strtok_r(NULL, " ", &last))) { - options[i++] = tok; + if (rename(log_file, old_log_file) != 0) { + cop_log(COP_WARNING, "unable to rename \"%s\" to \"%s\" [%d '%s']\n", log_file, old_log_file, errno, strerror(errno)); } } + cop_log_trace("launching %s'\n", prog); + pid_t child = fork(); if (child == 0) { EnableDeathSignal(SIGTERM); - execv(prog, options); + // Bind stdout and stderr of traffic_manager to traffic.out + execl(prog, prog, "--" TM_OPT_BIND_STDOUT, log_file, "--" TM_OPT_BIND_STDERR, log_file, NULL); cop_log_trace("Somehow execv(%s, options, NULL) failed: %s (%d)!\n", prog, strerror(errno), errno); exit(1); } else if (child == -1) {
