diff options
author | Julian Andres Klode <jak@debian.org> | 2018-06-28 08:12:50 +0000 |
---|---|---|
committer | Julian Andres Klode <jak@debian.org> | 2018-06-28 08:12:50 +0000 |
commit | a7b4dd425c10730b886f3ea0b2e045ee5015cfe5 (patch) | |
tree | c945300df9e0360c00318b12f40fbac122e2ad1b /apt-private/private-json-hooks.cc | |
parent | 8c3cb66e65cddf1ac297daba5bb442b415577137 (diff) | |
parent | 1d53cffad22c92645090e0e6ddde31fe4f7c3b05 (diff) |
Merge branch 'pu/lp1776218-allow-hooks-to-not-handshake' into 'master'
Handle JSON hooks that just close the file/exit and fix some other errors
See merge request apt-team/apt!21
Diffstat (limited to 'apt-private/private-json-hooks.cc')
-rw-r--r-- | apt-private/private-json-hooks.cc | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/apt-private/private-json-hooks.cc b/apt-private/private-json-hooks.cc index 07c89ca23..0e4b4913b 100644 --- a/apt-private/private-json-hooks.cc +++ b/apt-private/private-json-hooks.cc @@ -387,21 +387,26 @@ bool RunJsonHook(std::string const &option, std::string const &method, const cha if (size < 0) { - _error->Error("Could not read response to hello message from hook %s: %s", Opts->Value.c_str(), strerror(errno)); + if (errno != ECONNRESET) + _error->Error("Could not read response to hello message from hook %s: %s", Opts->Value.c_str(), strerror(errno)); + goto out; } else if (strstr(line, "error") != nullptr) { _error->Error("Hook %s reported an error during hello: %s", Opts->Value.c_str(), line); + goto out; } size = getline(&line, &linesize, F); if (size < 0) { - _error->Error("Could not read message separator line after handshake from %s: %s", Opts->Value.c_str(), strerror(errno)); + _error->Error("Could not read message separator line after handshake from %s: %s", Opts->Value.c_str(), feof(F) ? "end of file" : strerror(errno)); + goto out; } else if (size == 0 || line[0] != '\n') { _error->Error("Expected empty line after handshake from %s, received %s", Opts->Value.c_str(), line); + goto out; } fwrite(TheData.data(), TheData.size(), 1, F); @@ -409,6 +414,7 @@ bool RunJsonHook(std::string const &option, std::string const &method, const cha fwrite(ByeData.data(), ByeData.size(), 1, F); fwrite("\n\n", 2, 1, F); + out: fclose(F); // Clean up the sub process if (ExecWait(Process, Opts->Value.c_str()) == false) |