diff --git a/init/service.cpp b/init/service.cpp index fe38ee205..f5e54dfda 100644 --- a/init/service.cpp +++ b/init/service.cpp @@ -134,17 +134,21 @@ static void SetUpPidNamespace(const std::string& service_name) { } } -static void ExpandArgs(const std::vector& args, std::vector* strs) { +static bool ExpandArgsAndExecve(const std::vector& args) { std::vector expanded_args; + std::vector c_strings; + expanded_args.resize(args.size()); - strs->push_back(const_cast(args[0].c_str())); + c_strings.push_back(const_cast(args[0].data())); for (std::size_t i = 1; i < args.size(); ++i) { if (!expand_props(args[i], &expanded_args[i])) { LOG(FATAL) << args[0] << ": cannot expand '" << args[i] << "'"; } - strs->push_back(const_cast(expanded_args[i].c_str())); + c_strings.push_back(expanded_args[i].data()); } - strs->push_back(nullptr); + c_strings.push_back(nullptr); + + return execve(c_strings[0], c_strings.data(), (char**)ENV) == 0; } ServiceEnvironmentInfo::ServiceEnvironmentInfo() { @@ -799,10 +803,8 @@ bool Service::Start() { // priority. Aborts on failure. SetProcessAttributes(); - std::vector strs; - ExpandArgs(args_, &strs); - if (execve(strs[0], (char**) &strs[0], (char**) ENV) < 0) { - PLOG(ERROR) << "cannot execve('" << strs[0] << "')"; + if (!ExpandArgsAndExecve(args_)) { + PLOG(ERROR) << "cannot execve('" << args_[0] << "')"; } _exit(127);