diff options
author | David Kalnischkies <david@kalnischkies.de> | 2016-07-05 13:07:29 +0200 |
---|---|---|
committer | Julian Andres Klode <jak@debian.org> | 2016-08-31 13:49:37 +0200 |
commit | 6862a9b0320d8c07db3a86b20131ab78c5bc4708 (patch) | |
tree | c57076cfd974a1372f12d6f9a7a8765f2b5978a3 /methods/http.cc | |
parent | d7c10ebe247cddafe54a4656ceb05a28010562b1 (diff) |
avoid 416 response teardown binding to null pointer
methods/http.cc:640:13: runtime error: reference binding to null pointer
of type 'struct FileFd'
This reference is never used in the cases it has a nullptr, so the
practical difference is non-existent, but its a bug still.
Reported-By: gcc -fsanitize=undefined
(cherry picked from commit 4460551841d909d3ee9c1de00156ed3cdf8b1665)
Diffstat (limited to 'methods/http.cc')
-rw-r--r-- | methods/http.cc | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/methods/http.cc b/methods/http.cc index 0c3803fbb..46d90e256 100644 --- a/methods/http.cc +++ b/methods/http.cc @@ -498,20 +498,22 @@ APT_PURE Hashes * HttpServerState::GetHashes() /*{{{*/ } /*}}}*/ // HttpServerState::Die - The server has closed the connection. /*{{{*/ -bool HttpServerState::Die(FileFd &File) +bool HttpServerState::Die(FileFd * const File) { unsigned int LErrno = errno; // Dump the buffer to the file if (State == ServerState::Data) { + if (File == nullptr) + return true; // on GNU/kFreeBSD, apt dies on /dev/null because non-blocking // can't be set - if (File.Name() != "/dev/null") - SetNonBlock(File.Fd(),false); + if (File->Name() != "/dev/null") + SetNonBlock(File->Fd(),false); while (In.WriteSpace() == true) { - if (In.Write(File.Fd()) == false) + if (In.Write(File->Fd()) == false) return _error->Errno("write",_("Error writing to the file")); // Done @@ -630,7 +632,7 @@ bool HttpServerState::Go(bool ToFile, FileFd * const File) if (Res == 0) { _error->Error(_("Connection timed out")); - return Die(*File); + return Die(File); } // Handle server IO @@ -638,14 +640,14 @@ bool HttpServerState::Go(bool ToFile, FileFd * const File) { errno = 0; if (In.Read(ServerFd) == false) - return Die(*File); + return Die(File); } if (ServerFd != -1 && FD_ISSET(ServerFd,&wfds)) { errno = 0; if (Out.Write(ServerFd) == false) - return Die(*File); + return Die(File); } // Send data to the file |