diff --git a/init/service.cpp b/init/service.cpp index 4175d054f..fad61c6da 100644 --- a/init/service.cpp +++ b/init/service.cpp @@ -471,13 +471,21 @@ bool Service::Start() { } } + std::vector expanded_args; std::vector strs; - for (const auto& s : args_) { - strs.push_back(const_cast(s.c_str())); + expanded_args.resize(args_.size()); + strs.push_back(const_cast(args_[0].c_str())); + for (std::size_t i = 1; i < args_.size(); ++i) { + if (!expand_props(args_[i], &expanded_args[i])) { + ERROR("%s: cannot expand '%s'\n", args_[0].c_str(), args_[i].c_str()); + _exit(127); + } + strs.push_back(const_cast(expanded_args[i].c_str())); } strs.push_back(nullptr); - if (execve(args_[0].c_str(), (char**) &strs[0], (char**) ENV) < 0) { - ERROR("cannot execve('%s'): %s\n", args_[0].c_str(), strerror(errno)); + + if (execve(strs[0], (char**) &strs[0], (char**) ENV) < 0) { + ERROR("cannot execve('%s'): %s\n", strs[0], strerror(errno)); } _exit(127);