Explorar el Código

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
David Kalnischkies hace 10 años
padre
commit
4460551841
Se han modificado 4 ficheros con 12 adiciones y 10 borrados
  1. 9 7
      methods/http.cc
  2. 1 1
      methods/http.h
  3. 1 1
      methods/https.h
  4. 1 1
      methods/server.h

+ 9 - 7
methods/http.cc

@@ -497,20 +497,22 @@ APT_PURE Hashes * HttpServerState::GetHashes()				/*{{{*/
 }
 }
 									/*}}}*/
 									/*}}}*/
 // HttpServerState::Die - The server has closed the connection.		/*{{{*/
 // HttpServerState::Die - The server has closed the connection.		/*{{{*/
-bool HttpServerState::Die(FileFd &File)
+bool HttpServerState::Die(FileFd * const File)
 {
 {
    unsigned int LErrno = errno;
    unsigned int LErrno = errno;
 
 
    // Dump the buffer to the file
    // Dump the buffer to the file
    if (State == ServerState::Data)
    if (State == ServerState::Data)
    {
    {
+      if (File == nullptr)
+	 return true;
       // on GNU/kFreeBSD, apt dies on /dev/null because non-blocking
       // on GNU/kFreeBSD, apt dies on /dev/null because non-blocking
       // can't be set
       // 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)
       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"));
 	    return _error->Errno("write",_("Error writing to the file"));
 
 
 	 // Done
 	 // Done
@@ -629,7 +631,7 @@ bool HttpServerState::Go(bool ToFile, FileFd * const File)
    if (Res == 0)
    if (Res == 0)
    {
    {
       _error->Error(_("Connection timed out"));
       _error->Error(_("Connection timed out"));
-      return Die(*File);
+      return Die(File);
    }
    }
    
    
    // Handle server IO
    // Handle server IO
@@ -637,14 +639,14 @@ bool HttpServerState::Go(bool ToFile, FileFd * const File)
    {
    {
       errno = 0;
       errno = 0;
       if (In.Read(ServerFd) == false)
       if (In.Read(ServerFd) == false)
-	 return Die(*File);
+	 return Die(File);
    }
    }
 	 
 	 
    if (ServerFd != -1 && FD_ISSET(ServerFd,&wfds))
    if (ServerFd != -1 && FD_ISSET(ServerFd,&wfds))
    {
    {
       errno = 0;
       errno = 0;
       if (Out.Write(ServerFd) == false)
       if (Out.Write(ServerFd) == false)
-	 return Die(*File);
+	 return Die(File);
    }
    }
 
 
    // Send data to the file
    // Send data to the file

+ 1 - 1
methods/http.h

@@ -112,7 +112,7 @@ struct HttpServerState: public ServerState
    virtual bool Close() APT_OVERRIDE;
    virtual bool Close() APT_OVERRIDE;
    virtual bool InitHashes(HashStringList const &ExpectedHashes) APT_OVERRIDE;
    virtual bool InitHashes(HashStringList const &ExpectedHashes) APT_OVERRIDE;
    virtual Hashes * GetHashes() APT_OVERRIDE;
    virtual Hashes * GetHashes() APT_OVERRIDE;
-   virtual bool Die(FileFd &File) APT_OVERRIDE;
+   virtual bool Die(FileFd * const File) APT_OVERRIDE;
    virtual bool Flush(FileFd * const File) APT_OVERRIDE;
    virtual bool Flush(FileFd * const File) APT_OVERRIDE;
    virtual bool Go(bool ToFile, FileFd * const File) APT_OVERRIDE;
    virtual bool Go(bool ToFile, FileFd * const File) APT_OVERRIDE;
 
 

+ 1 - 1
methods/https.h

@@ -45,7 +45,7 @@ class HttpsServerState : public ServerState
    virtual bool Close() APT_OVERRIDE { return false; }
    virtual bool Close() APT_OVERRIDE { return false; }
    virtual bool InitHashes(HashStringList const &ExpectedHashes) APT_OVERRIDE;
    virtual bool InitHashes(HashStringList const &ExpectedHashes) APT_OVERRIDE;
    virtual Hashes * GetHashes() APT_OVERRIDE;
    virtual Hashes * GetHashes() APT_OVERRIDE;
-   virtual bool Die(FileFd &/*File*/) APT_OVERRIDE { return false; }
+   virtual bool Die(FileFd * const /*File*/) APT_OVERRIDE { return false; }
    virtual bool Flush(FileFd * const /*File*/) APT_OVERRIDE { return false; }
    virtual bool Flush(FileFd * const /*File*/) APT_OVERRIDE { return false; }
    virtual bool Go(bool /*ToFile*/, FileFd * const /*File*/) APT_OVERRIDE { return false; }
    virtual bool Go(bool /*ToFile*/, FileFd * const /*File*/) APT_OVERRIDE { return false; }
 
 

+ 1 - 1
methods/server.h

@@ -97,7 +97,7 @@ struct ServerState
    virtual bool Close() = 0;
    virtual bool Close() = 0;
    virtual bool InitHashes(HashStringList const &ExpectedHashes) = 0;
    virtual bool InitHashes(HashStringList const &ExpectedHashes) = 0;
    virtual Hashes * GetHashes() = 0;
    virtual Hashes * GetHashes() = 0;
-   virtual bool Die(FileFd &File) = 0;
+   virtual bool Die(FileFd * const File) = 0;
    virtual bool Flush(FileFd * const File) = 0;
    virtual bool Flush(FileFd * const File) = 0;
    virtual bool Go(bool ToFile, FileFd * const File) = 0;
    virtual bool Go(bool ToFile, FileFd * const File) = 0;