Просмотр исходного кода

try to avoid direct usage of .Fd() if possible and do read()s and co
on the FileFd instead

David Kalnischkies лет назад: 14
Родитель
Сommit
109eb1511d

+ 2 - 2
apt-pkg/acquire-item.cc

@@ -438,7 +438,7 @@ bool pkgAcqDiffIndex::ParseDiffIndex(string IndexDiffFile)		/*{{{*/
 
 
       FileFd fd(CurrentPackagesFile, FileFd::ReadOnly);
       FileFd fd(CurrentPackagesFile, FileFd::ReadOnly);
       SHA1Summation SHA1;
       SHA1Summation SHA1;
-      SHA1.AddFD(fd.Fd(), fd.Size());
+      SHA1.AddFD(fd);
       string const local_sha1 = SHA1.Result();
       string const local_sha1 = SHA1.Result();
 
 
       if(local_sha1 == ServerSha1) 
       if(local_sha1 == ServerSha1) 
@@ -669,7 +669,7 @@ bool pkgAcqIndexDiffs::QueueNextDiff()					/*{{{*/
 
 
    FileFd fd(FinalFile, FileFd::ReadOnly);
    FileFd fd(FinalFile, FileFd::ReadOnly);
    SHA1Summation SHA1;
    SHA1Summation SHA1;
-   SHA1.AddFD(fd.Fd(), fd.Size());
+   SHA1.AddFD(fd);
    string local_sha1 = string(SHA1.Result());
    string local_sha1 = string(SHA1.Result());
    if(Debug)
    if(Debug)
       std::clog << "QueueNextDiff: " 
       std::clog << "QueueNextDiff: " 

+ 35 - 5
apt-pkg/contrib/hashes.cc

@@ -61,25 +61,25 @@ bool HashString::VerifyFile(std::string filename) const			/*{{{*/
    if(Type == "MD5Sum")
    if(Type == "MD5Sum")
    {
    {
       MD5Summation MD5;
       MD5Summation MD5;
-      MD5.AddFD(Fd.Fd(), Fd.Size());
+      MD5.AddFD(Fd);
       fileHash = (std::string)MD5.Result();
       fileHash = (std::string)MD5.Result();
    }
    }
    else if (Type == "SHA1")
    else if (Type == "SHA1")
    {
    {
       SHA1Summation SHA1;
       SHA1Summation SHA1;
-      SHA1.AddFD(Fd.Fd(), Fd.Size());
+      SHA1.AddFD(Fd);
       fileHash = (std::string)SHA1.Result();
       fileHash = (std::string)SHA1.Result();
    }
    }
    else if (Type == "SHA256")
    else if (Type == "SHA256")
    {
    {
       SHA256Summation SHA256;
       SHA256Summation SHA256;
-      SHA256.AddFD(Fd.Fd(), Fd.Size());
+      SHA256.AddFD(Fd);
       fileHash = (std::string)SHA256.Result();
       fileHash = (std::string)SHA256.Result();
    }
    }
    else if (Type == "SHA512")
    else if (Type == "SHA512")
    {
    {
       SHA512Summation SHA512;
       SHA512Summation SHA512;
-      SHA512.AddFD(Fd.Fd(), Fd.Size());
+      SHA512.AddFD(Fd);
       fileHash = (std::string)SHA512.Result();
       fileHash = (std::string)SHA512.Result();
    }
    }
    Fd.Close();
    Fd.Close();
@@ -134,6 +134,36 @@ bool Hashes::AddFD(int const Fd,unsigned long long Size, bool const addMD5,
 	 SHA512.Add(Buf,Res);
 	 SHA512.Add(Buf,Res);
    }
    }
    return true;
    return true;
+}
+bool Hashes::AddFD(FileFd &Fd,unsigned long long Size, bool const addMD5,
+		   bool const addSHA1, bool const addSHA256, bool const addSHA512)
+{
+   unsigned char Buf[64*64];
+   bool const ToEOF = (Size == 0);
+   while (Size != 0 || ToEOF)
+   {
+      unsigned long long n = sizeof(Buf);
+      if (!ToEOF) n = std::min(Size, n);
+      unsigned long long a = 0;
+      if (Fd.Read(Buf, n, &a) == false) // error
+	 return false;
+      if (ToEOF == false)
+      {
+	 if (a != n) // short read
+	    return false;
+      }
+      else if (a == 0) // EOF
+	 break;
+      Size -= a;
+      if (addMD5 == true)
+	 MD5.Add(Buf, a);
+      if (addSHA1 == true)
+	 SHA1.Add(Buf, a);
+      if (addSHA256 == true)
+	 SHA256.Add(Buf, a);
+      if (addSHA512 == true)
+	 SHA512.Add(Buf, a);
+   }
+   return true;
 }
 }
 									/*}}}*/
 									/*}}}*/
-

+ 5 - 0
apt-pkg/contrib/hashes.h

@@ -17,6 +17,7 @@
 #include <apt-pkg/md5.h>
 #include <apt-pkg/md5.h>
 #include <apt-pkg/sha1.h>
 #include <apt-pkg/sha1.h>
 #include <apt-pkg/sha2.h>
 #include <apt-pkg/sha2.h>
+#include <apt-pkg/fileutl.h>
 
 
 #include <algorithm>
 #include <algorithm>
 #include <vector>
 #include <vector>
@@ -74,6 +75,10 @@ class Hashes
    { return AddFD(Fd, Size, true, true, true, true); };
    { return AddFD(Fd, Size, true, true, true, true); };
    bool AddFD(int const Fd, unsigned long long Size, bool const addMD5,
    bool AddFD(int const Fd, unsigned long long Size, bool const addMD5,
 	      bool const addSHA1, bool const addSHA256, bool const addSHA512);
 	      bool const addSHA1, bool const addSHA256, bool const addSHA512);
+   inline bool AddFD(FileFd &Fd,unsigned long long Size = 0)
+   { return AddFD(Fd, Size, true, true, true, true); };
+   bool AddFD(FileFd &Fd, unsigned long long Size, bool const addMD5,
+	      bool const addSHA1, bool const addSHA256, bool const addSHA512);
    inline bool Add(const unsigned char *Beg,const unsigned char *End) 
    inline bool Add(const unsigned char *Beg,const unsigned char *End) 
                   {return Add(Beg,End-Beg);};
                   {return Add(Beg,End-Beg);};
 };
 };

+ 22 - 0
apt-pkg/contrib/hashsum.cc

@@ -24,5 +24,27 @@ bool SummationImplementation::AddFD(int const Fd, unsigned long long Size) {
       Add(Buf,Res);
       Add(Buf,Res);
    }
    }
    return true;
    return true;
+}
+bool SummationImplementation::AddFD(FileFd &Fd, unsigned long long Size) {
+   unsigned char Buf[64 * 64];
+   bool ToEOF = (Size == 0);
+   while (Size != 0 || ToEOF)
+   {
+      unsigned long long n = sizeof(Buf);
+      if (!ToEOF) n = std::min(Size, n);
+      unsigned long long a = 0;
+      if (Fd.Read(Buf, n, &a) == false) // error
+	 return false;
+      if (ToEOF == false)
+      {
+	 if (a != n) // short read
+	    return false;
+      }
+      else if (a == 0) // EOF
+	 break;
+      Size -= a;
+      Add(Buf, a);
+   }
+   return true;
 }
 }
 									/*}}}*/
 									/*}}}*/

+ 3 - 0
apt-pkg/contrib/hashsum_template.h

@@ -10,6 +10,8 @@
 #ifndef APTPKG_HASHSUM_TEMPLATE_H
 #ifndef APTPKG_HASHSUM_TEMPLATE_H
 #define APTPKG_HASHSUM_TEMPLATE_H
 #define APTPKG_HASHSUM_TEMPLATE_H
 
 
+#include <apt-pkg/fileutl.h>
+
 #include <string>
 #include <string>
 #include <cstring>
 #include <cstring>
 #include <algorithm>
 #include <algorithm>
@@ -108,6 +110,7 @@ class SummationImplementation
    { return Add((const unsigned char *)Beg, End - Beg); };
    { return Add((const unsigned char *)Beg, End - Beg); };
 
 
    bool AddFD(int Fd, unsigned long long Size = 0);
    bool AddFD(int Fd, unsigned long long Size = 0);
+   bool AddFD(FileFd &Fd, unsigned long long Size = 0);
 };
 };
 
 
 #endif
 #endif

+ 0 - 3
apt-pkg/deb/debindexfile.cc

@@ -600,9 +600,6 @@ bool debStatusIndex::Merge(pkgCacheGenerator &Gen,OpProgress *Prog) const
 
 
    // Store the IMS information
    // Store the IMS information
    pkgCache::PkgFileIterator CFile = Gen.GetCurFile();
    pkgCache::PkgFileIterator CFile = Gen.GetCurFile();
-   struct stat St;
-   if (fstat(Pkg.Fd(),&St) != 0)
-      return _error->Errno("fstat","Failed to stat");
    CFile->Size = Pkg.FileSize();
    CFile->Size = Pkg.FileSize();
    CFile->mtime = Pkg.ModificationTime();
    CFile->mtime = Pkg.ModificationTime();
    CFile->Archive = Gen.WriteUniqString("now");
    CFile->Archive = Gen.WriteUniqString("now");

+ 4 - 4
ftparchive/cachedb.cc

@@ -351,7 +351,7 @@ bool CacheDB::GetMD5(bool const &GenOnly)
       return false;
       return false;
    }
    }
    MD5Summation MD5;
    MD5Summation MD5;
-   if (Fd->Seek(0) == false || MD5.AddFD(Fd->Fd(),CurStat.FileSize) == false)
+   if (Fd->Seek(0) == false || MD5.AddFD(*Fd, CurStat.FileSize) == false)
       return false;
       return false;
    
    
    MD5Res = MD5.Result();
    MD5Res = MD5.Result();
@@ -382,7 +382,7 @@ bool CacheDB::GetSHA1(bool const &GenOnly)
       return false;
       return false;
    }
    }
    SHA1Summation SHA1;
    SHA1Summation SHA1;
-   if (Fd->Seek(0) == false || SHA1.AddFD(Fd->Fd(),CurStat.FileSize) == false)
+   if (Fd->Seek(0) == false || SHA1.AddFD(*Fd, CurStat.FileSize) == false)
       return false;
       return false;
    
    
    SHA1Res = SHA1.Result();
    SHA1Res = SHA1.Result();
@@ -413,7 +413,7 @@ bool CacheDB::GetSHA256(bool const &GenOnly)
       return false;
       return false;
    }
    }
    SHA256Summation SHA256;
    SHA256Summation SHA256;
-   if (Fd->Seek(0) == false || SHA256.AddFD(Fd->Fd(),CurStat.FileSize) == false)
+   if (Fd->Seek(0) == false || SHA256.AddFD(*Fd, CurStat.FileSize) == false)
       return false;
       return false;
    
    
    SHA256Res = SHA256.Result();
    SHA256Res = SHA256.Result();
@@ -444,7 +444,7 @@ bool CacheDB::GetSHA512(bool const &GenOnly)
       return false;
       return false;
    }
    }
    SHA512Summation SHA512;
    SHA512Summation SHA512;
-   if (Fd->Seek(0) == false || SHA512.AddFD(Fd->Fd(),CurStat.FileSize) == false)
+   if (Fd->Seek(0) == false || SHA512.AddFD(*Fd, CurStat.FileSize) == false)
       return false;
       return false;
    
    
    SHA512Res = SHA512.Result();
    SHA512Res = SHA512.Result();

+ 1 - 1
ftparchive/writer.cc

@@ -1035,7 +1035,7 @@ bool ReleaseWriter::DoPackage(string FileName)
    CheckSums[NewFileName].size = fd.Size();
    CheckSums[NewFileName].size = fd.Size();
 
 
    Hashes hs;
    Hashes hs;
-   hs.AddFD(fd.Fd(), 0, DoMD5, DoSHA1, DoSHA256, DoSHA512);
+   hs.AddFD(fd, 0, DoMD5, DoSHA1, DoSHA256, DoSHA512);
    if (DoMD5 == true)
    if (DoMD5 == true)
       CheckSums[NewFileName].MD5 = hs.MD5.Result();
       CheckSums[NewFileName].MD5 = hs.MD5.Result();
    if (DoSHA1 == true)
    if (DoSHA1 == true)

+ 1 - 1
methods/cdrom.cc

@@ -268,7 +268,7 @@ bool CDROMMethod::Fetch(FetchItem *Itm)
 
 
    Hashes Hash;
    Hashes Hash;
    FileFd Fd(Res.Filename, FileFd::ReadOnly);
    FileFd Fd(Res.Filename, FileFd::ReadOnly);
-   Hash.AddFD(Fd.Fd(), Fd.Size());
+   Hash.AddFD(Fd);
    Res.TakeHashes(Hash);
    Res.TakeHashes(Hash);
 
 
    URIDone(Res);
    URIDone(Res);

+ 1 - 1
methods/copy.cc

@@ -85,7 +85,7 @@ bool CopyMethod::Fetch(FetchItem *Itm)
    
    
    Hashes Hash;
    Hashes Hash;
    FileFd Fd(Res.Filename, FileFd::ReadOnly);
    FileFd Fd(Res.Filename, FileFd::ReadOnly);
-   Hash.AddFD(Fd.Fd(), Fd.Size());
+   Hash.AddFD(Fd);
    Res.TakeHashes(Hash);
    Res.TakeHashes(Hash);
 
 
    URIDone(Res);
    URIDone(Res);

+ 1 - 1
methods/file.cc

@@ -83,7 +83,7 @@ bool FileMethod::Fetch(FetchItem *Itm)
 
 
    Hashes Hash;
    Hashes Hash;
    FileFd Fd(Res.Filename, FileFd::ReadOnly);
    FileFd Fd(Res.Filename, FileFd::ReadOnly);
-   Hash.AddFD(Fd.Fd(), Fd.Size());
+   Hash.AddFD(Fd);
    Res.TakeHashes(Hash);
    Res.TakeHashes(Hash);
    URIDone(Res);
    URIDone(Res);
    return true;
    return true;

+ 1 - 1
methods/ftp.cc

@@ -868,7 +868,7 @@ bool FTPConn::Get(const char *Path,FileFd &To,unsigned long long Resume,
    
    
    if (Resume != 0)
    if (Resume != 0)
    {
    {
-      if (Hash.AddFD(To.Fd(),Resume) == false)
+      if (Hash.AddFD(To,Resume) == false)
       {
       {
 	 _error->Errno("read",_("Problem hashing file"));
 	 _error->Errno("read",_("Problem hashing file"));
 	 return false;
 	 return false;

+ 7 - 17
methods/http.cc

@@ -1007,31 +1007,21 @@ HttpMethod::DealWithHeaders(FetchResult &Res,ServerState *Srv)
    FailFile.c_str();   // Make sure we dont do a malloc in the signal handler
    FailFile.c_str();   // Make sure we dont do a malloc in the signal handler
    FailFd = File->Fd();
    FailFd = File->Fd();
    FailTime = Srv->Date;
    FailTime = Srv->Date;
-      
-   // Set the expected size
-   if (Srv->StartPos >= 0)
-   {
-      Res.ResumePoint = Srv->StartPos;
-      if (ftruncate(File->Fd(),Srv->StartPos) < 0)
-	 _error->Errno("ftruncate", _("Failed to truncate file"));
-   }
-      
-   // Set the start point
-   lseek(File->Fd(),0,SEEK_END);
 
 
    delete Srv->In.Hash;
    delete Srv->In.Hash;
    Srv->In.Hash = new Hashes;
    Srv->In.Hash = new Hashes;
-   
-   // Fill the Hash if the file is non-empty (resume)
-   if (Srv->StartPos > 0)
+
+   // Set the expected size and read file for the hashes
+   if (Srv->StartPos >= 0)
    {
    {
-      lseek(File->Fd(),0,SEEK_SET);
-      if (Srv->In.Hash->AddFD(File->Fd(),Srv->StartPos) == false)
+      Res.ResumePoint = Srv->StartPos;
+      File->Truncate(Srv->StartPos);
+
+      if (Srv->In.Hash->AddFD(*File,Srv->StartPos) == false)
       {
       {
 	 _error->Errno("read",_("Problem hashing file"));
 	 _error->Errno("read",_("Problem hashing file"));
 	 return ERROR_NOT_FROM_SERVER;
 	 return ERROR_NOT_FROM_SERVER;
       }
       }
-      lseek(File->Fd(),0,SEEK_END);
    }
    }
    
    
    SetNonBlock(File->Fd(),true);
    SetNonBlock(File->Fd(),true);

+ 1 - 1
methods/https.cc

@@ -314,7 +314,7 @@ bool HttpsMethod::Fetch(FetchItem *Itm)
    // take hashes
    // take hashes
    Hashes Hash;
    Hashes Hash;
    FileFd Fd(Res.Filename, FileFd::ReadOnly);
    FileFd Fd(Res.Filename, FileFd::ReadOnly);
-   Hash.AddFD(Fd.Fd(), Fd.Size());
+   Hash.AddFD(Fd);
    Res.TakeHashes(Hash);
    Res.TakeHashes(Hash);
    
    
    // keep apt updated
    // keep apt updated

+ 1 - 1
methods/rsh.cc

@@ -305,7 +305,7 @@ bool RSHConn::Get(const char *Path,FileFd &To,unsigned long long Resume,
       return false;
       return false;
 
 
    if (Resume != 0) {
    if (Resume != 0) {
-      if (Hash.AddFD(To.Fd(),Resume) == false) {
+      if (Hash.AddFD(To,Resume) == false) {
 	 _error->Errno("read",_("Problem hashing file"));
 	 _error->Errno("read",_("Problem hashing file"));
 	 return false;
 	 return false;
       }
       }