Fix deadlock in runProgram() when input is larger than the pipe buffer size

This commit is contained in:
Eelco Dolstra 2017-03-13 14:56:33 +01:00
parent e8186085e0
commit fbbc4d8dda
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE

View file

@ -870,11 +870,14 @@ string runProgram(Path program, bool searchPath, const Strings & args,
out.writeSide = -1; out.writeSide = -1;
/* FIXME: This can deadlock if the input is too long. */ std::thread writerThread;
if (!input.empty()) { if (!input.empty()) {
in.readSide = -1; in.readSide = -1;
writeFull(in.writeSide.get(), input); writerThread = std::thread([&]() {
in.writeSide = -1; writeFull(in.writeSide.get(), input);
in.writeSide = -1;
});
} }
string result = drainFD(out.readSide.get()); string result = drainFD(out.readSide.get());
@ -885,6 +888,9 @@ string runProgram(Path program, bool searchPath, const Strings & args,
throw ExecError(status, format("program %1% %2%") throw ExecError(status, format("program %1% %2%")
% program % statusToString(status)); % program % statusToString(status));
if (!input.empty())
writerThread.join();
return result; return result;
} }