X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/7db98ffceda347f0bc457c6bdc4ff33d60e26b18..65dbd5a1a32f63dae81c8b5814cd246f1154c38d:/apt-inst/contrib/arfile.cc diff --git a/apt-inst/contrib/arfile.cc b/apt-inst/contrib/arfile.cc index 54d90bf3a..9d84c1784 100644 --- a/apt-inst/contrib/arfile.cc +++ b/apt-inst/contrib/arfile.cc @@ -14,16 +14,17 @@ ##################################################################### */ /*}}}*/ // Include Files /*{{{*/ -#ifdef __GNUG__ -#pragma implementation "apt-pkg/arfile.h" -#endif +#include + #include #include +#include #include #include - /*}}}*/ + #include + /*}}}*/ struct ARArchive::MemberHeader { @@ -63,7 +64,7 @@ ARArchive::~ARArchive() byte plain text header then the file data, another header, data, etc */ bool ARArchive::LoadHeaders() { - signed long Left = File.Size(); + off_t Left = File.Size(); // Check the magic byte char Magic[8]; @@ -90,7 +91,7 @@ bool ARArchive::LoadHeaders() StrToNum(Head.Size,Memb->Size,sizeof(Head.Size)) == false) { delete Memb; - return _error->Error(_("Invalid archive member header")); + return _error->Error(_("Invalid archive member header %s"), Head.Name); } // Check for an extra long name string @@ -99,13 +100,16 @@ bool ARArchive::LoadHeaders() char S[300]; unsigned long Len; if (StrToNum(Head.Name+3,Len,sizeof(Head.Size)-3) == false || - Len >= strlen(S)) + Len >= sizeof(S)) { delete Memb; return _error->Error(_("Invalid archive member header")); } if (File.Read(S,Len) == false) + { + delete Memb; return false; + } S[Len] = 0; Memb->Name = S; Memb->Size -= Len; @@ -114,12 +118,12 @@ bool ARArchive::LoadHeaders() else { unsigned int I = sizeof(Head.Name) - 1; - for (; Head.Name[I] == ' '; I--); - Memb->Name = string(Head.Name,I+1); + for (; Head.Name[I] == ' ' || Head.Name[I] == '/'; I--); + Memb->Name = std::string(Head.Name,I+1); } // Account for the AR header alignment - unsigned Skip = Memb->Size % 2; + off_t Skip = Memb->Size % 2; // Add it to the list Memb->Next = List; @@ -127,7 +131,7 @@ bool ARArchive::LoadHeaders() Memb->Start = File.Tell(); if (File.Skip(Memb->Size + Skip) == false) return false; - if (Left < (signed)(Memb->Size + Skip)) + if (Left < (off_t)(Memb->Size + Skip)) return _error->Error(_("Archive is too short")); Left -= Memb->Size + Skip; }