From ab3846c01acfd223e7e4b8fbe1be5f325b205466 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Mon, 25 Jan 2010 17:34:02 +0100 Subject: * ftparchive/writer.{cc,h}: - merge crash fix for apt-ftparchive on hurd, thanks to Samuel Thibault for the patch (closes: #566664) --- ftparchive/writer.cc | 31 +++++++++++++++++++------------ ftparchive/writer.h | 2 -- 2 files changed, 19 insertions(+), 14 deletions(-) (limited to 'ftparchive') diff --git a/ftparchive/writer.cc b/ftparchive/writer.cc index 4e6c9a77d..b46152a9d 100644 --- a/ftparchive/writer.cc +++ b/ftparchive/writer.cc @@ -58,10 +58,6 @@ FTWScanner::FTWScanner() { ErrorPrinted = false; NoLinkAct = !_config->FindB("APT::FTPArchive::DeLinkAct",true); - RealPath = 0; - long PMax = pathconf(".",_PC_PATH_MAX); - if (PMax > 0) - RealPath = new char[PMax]; } /*}}}*/ // FTWScanner::Scanner - FTW Scanner /*{{{*/ @@ -92,6 +88,8 @@ int FTWScanner::ScannerFTW(const char *File,const struct stat *sb,int Flag) int FTWScanner::ScannerFile(const char *File, bool ReadLink) { const char *LastComponent = strrchr(File, '/'); + char *RealPath = NULL; + if (LastComponent == NULL) LastComponent = File; else @@ -111,10 +109,13 @@ int FTWScanner::ScannerFile(const char *File, bool ReadLink) given are not links themselves. */ char Jnk[2]; Owner->OriginalPath = File; - if (ReadLink && Owner->RealPath != 0 && + if (ReadLink && readlink(File,Jnk,sizeof(Jnk)) != -1 && - realpath(File,Owner->RealPath) != 0) - Owner->DoPackage(Owner->RealPath); + (RealPath = realpath(File,NULL)) != 0) + { + Owner->DoPackage(RealPath); + free(RealPath); + } else Owner->DoPackage(File); @@ -150,13 +151,15 @@ int FTWScanner::ScannerFile(const char *File, bool ReadLink) /* */ bool FTWScanner::RecursiveScan(string Dir) { + char *RealPath = NULL; /* If noprefix is set then jam the scan root in, so we don't generate link followed paths out of control */ if (InternalPrefix.empty() == true) { - if (realpath(Dir.c_str(),RealPath) == 0) + if ((RealPath = realpath(Dir.c_str(),NULL)) == 0) return _error->Errno("realpath",_("Failed to resolve %s"),Dir.c_str()); - InternalPrefix = RealPath; + InternalPrefix = RealPath; + free(RealPath); } // Do recursive directory searching @@ -180,13 +183,15 @@ bool FTWScanner::RecursiveScan(string Dir) of files from another file. */ bool FTWScanner::LoadFileList(string Dir,string File) { + char *RealPath = NULL; /* If noprefix is set then jam the scan root in, so we don't generate link followed paths out of control */ if (InternalPrefix.empty() == true) { - if (realpath(Dir.c_str(),RealPath) == 0) + if ((RealPath = realpath(Dir.c_str(),NULL)) == 0) return _error->Errno("realpath",_("Failed to resolve %s"),Dir.c_str()); InternalPrefix = RealPath; + free(RealPath); } Owner = this; @@ -668,6 +673,7 @@ bool SourcesWriter::DoPackage(string FileName) // Perform the delinking operation over all of the files string ParseJnk; const char *C = Files; + char *RealPath = NULL; for (;isspace(*C); C++); while (*C != 0) { @@ -679,10 +685,11 @@ bool SourcesWriter::DoPackage(string FileName) char Jnk[2]; string OriginalPath = Directory + ParseJnk; - if (RealPath != 0 && readlink(OriginalPath.c_str(),Jnk,sizeof(Jnk)) != -1 && - realpath(OriginalPath.c_str(),RealPath) != 0) + if (readlink(OriginalPath.c_str(),Jnk,sizeof(Jnk)) != -1 && + (RealPath = realpath(OriginalPath.c_str(),NULL)) != 0) { string RP = RealPath; + free(RealPath); if (Delink(RP,OriginalPath.c_str(),Stats.DeLinkBytes,St.st_size) == false) return false; } diff --git a/ftparchive/writer.h b/ftparchive/writer.h index e76438900..9aaadbdab 100644 --- a/ftparchive/writer.h +++ b/ftparchive/writer.h @@ -35,7 +35,6 @@ class FTWScanner protected: vector Patterns; const char *OriginalPath; - char *RealPath; bool ErrorPrinted; // Stuff for the delinker @@ -70,7 +69,6 @@ class FTWScanner bool SetExts(string Vals); FTWScanner(); - virtual ~FTWScanner() {delete [] RealPath;}; }; class PackagesWriter : public FTWScanner -- cgit v1.2.3 From 2893f7b5ec6b2220ccfca6b9648482a6df926eca Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Sun, 31 Jan 2010 07:28:06 -0800 Subject: * cmdline/acqprogress.cc: - Set Mode to Medium so that the correct prefix is used. Thanks Stefan Haller for the patch! (Closes: #567304 LP: #275243) * ftparchive/writer.cc: - generate sha1 and sha256 checksums for dsc (Closes: #567343) * cmdline/apt-get.cc: - don't mark as manually if in download only (Closes: #468180) --- ftparchive/writer.cc | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) (limited to 'ftparchive') diff --git a/ftparchive/writer.cc b/ftparchive/writer.cc index b46152a9d..95b73a84d 100644 --- a/ftparchive/writer.cc +++ b/ftparchive/writer.cc @@ -559,7 +559,12 @@ bool SourcesWriter::DoPackage(string FileName) char *BlkEnd = Buffer + St.st_size; MD5Summation MD5; MD5.Add((unsigned char *)Start,BlkEnd - Start); - + + SHA1Summation SHA1; + SHA256Summation SHA256; + SHA1.Add((unsigned char *)Start,BlkEnd - Start); + SHA256.Add((unsigned char *)Start,BlkEnd - Start); + // Add an extra \n to the end, just in case *BlkEnd++ = '\n'; @@ -650,12 +655,25 @@ bool SourcesWriter::DoPackage(string FileName) } // Add the dsc to the files hash list + string const strippedName = flNotDir(FileName); char Files[1000]; snprintf(Files,sizeof(Files),"\n %s %lu %s\n %s", string(MD5.Result()).c_str(),St.st_size, - flNotDir(FileName).c_str(), + strippedName.c_str(), Tags.FindS("Files").c_str()); - + + char ChecksumsSha1[1000]; + snprintf(ChecksumsSha1,sizeof(ChecksumsSha1),"\n %s %lu %s\n %s", + string(SHA1.Result()).c_str(),St.st_size, + strippedName.c_str(), + Tags.FindS("Checksums-Sha1").c_str()); + + char ChecksumsSha256[1000]; + snprintf(ChecksumsSha256,sizeof(ChecksumsSha256),"\n %s %lu %s\n %s", + string(SHA256.Result()).c_str(),St.st_size, + strippedName.c_str(), + Tags.FindS("Checksums-Sha256").c_str()); + // Strip the DirStrip prefix from the FileName and add the PathPrefix string NewFileName; if (DirStrip.empty() == false && @@ -700,12 +718,14 @@ bool SourcesWriter::DoPackage(string FileName) Directory.erase(Directory.end()-1); // This lists all the changes to the fields we are going to make. - // (5 hardcoded + maintainer + end marker) - TFRewriteData Changes[5+1+SOverItem->FieldOverride.size()+1]; + // (5 hardcoded + checksums + maintainer + end marker) + TFRewriteData Changes[5+2+1+SOverItem->FieldOverride.size()+1]; unsigned int End = 0; SetTFRewriteData(Changes[End++],"Source",Package.c_str(),"Package"); SetTFRewriteData(Changes[End++],"Files",Files); + SetTFRewriteData(Changes[End++],"Checksums-Sha1",ChecksumsSha1); + SetTFRewriteData(Changes[End++],"Checksums-Sha256",ChecksumsSha256); if (Directory != "./") SetTFRewriteData(Changes[End++],"Directory",Directory.c_str()); SetTFRewriteData(Changes[End++],"Priority",BestPrio.c_str()); -- cgit v1.2.3