diff options
author | Julian Andres Klode <julian.klode@canonical.com> | 2018-06-27 11:31:21 +0200 |
---|---|---|
committer | Julian Andres Klode <julian.klode@canonical.com> | 2018-06-27 15:09:45 +0200 |
commit | 1d53cffad22c92645090e0e6ddde31fe4f7c3b05 (patch) | |
tree | c945300df9e0360c00318b12f40fbac122e2ad1b /apt-private | |
parent | 8c3cb66e65cddf1ac297daba5bb442b415577137 (diff) |
Handle JSON hooks that just close the file/exit and fix some other errors
JSON hooks might disappear and the common idiom to work around hooks
disappearing is to check for the hook in the shell snippet that is
in the apt.conf file and if it does not exist, do nothing. This caused
APT to fail however, expecting it to acknowledge the handshake.
Ignoring ECONNRESET on handshakes solves the problem.
The error case, and the other error cases also did not stop execution
of the hook, causing more errors to pile up. Fix this by directly going
to the closing part of the code.
LP: #1776218
Diffstat (limited to 'apt-private')
-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) |