aboutsummaryrefslogtreecommitdiff
path: root/src/libutil/util.cc
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2014-12-12 15:01:16 +0100
committerEelco Dolstra <eelco.dolstra@logicblox.com>2014-12-12 15:01:16 +0100
commitf52b6c944e90b3e35925122779175705fdc02e12 (patch)
treebde0793743885e9fdc7a097067b513d2d35b84ea /src/libutil/util.cc
parent28f22b4653bfcf1be41b042c8068b6513dd3e931 (diff)
Fix some memory leaks
Diffstat (limited to 'src/libutil/util.cc')
-rw-r--r--src/libutil/util.cc19
1 files changed, 13 insertions, 6 deletions
diff --git a/src/libutil/util.cc b/src/libutil/util.cc
index 1f71f76d5..dcdb438e0 100644
--- a/src/libutil/util.cc
+++ b/src/libutil/util.cc
@@ -912,16 +912,19 @@ pid_t startProcess(std::function<void()> fun, const ProcessOptions & options)
}
+std::vector<const char *> stringsToCharPtrs(const Strings & ss)
+{
+ std::vector<const char *> res;
+ for (auto & s : ss) res.push_back(s.c_str());
+ res.push_back(0);
+ return res;
+}
+
+
string runProgram(Path program, bool searchPath, const Strings & args)
{
checkInterrupt();
- std::vector<const char *> cargs; /* careful with c_str()! */
- cargs.push_back(program.c_str());
- for (Strings::const_iterator i = args.begin(); i != args.end(); ++i)
- cargs.push_back(i->c_str());
- cargs.push_back(0);
-
/* Create a pipe. */
Pipe pipe;
pipe.create();
@@ -931,6 +934,10 @@ string runProgram(Path program, bool searchPath, const Strings & args)
if (dup2(pipe.writeSide, STDOUT_FILENO) == -1)
throw SysError("dupping stdout");
+ Strings args_(args);
+ args_.push_front(program);
+ auto cargs = stringsToCharPtrs(args_);
+
if (searchPath)
execvp(program.c_str(), (char * *) &cargs[0]);
else