Package: apt Version: 0.7.25 Severity: important Tags: patch Hello,
apt-ftparchive currently crashes because the case when pathconf(".",_PC_PATH_MAX); returns -1 (no limit) is not properly handled. The attached patch replaces it with just using glibc's realpath(path, NULL) feature (which got into POSIX 2008 btw). Samuel -- Package-specific info: -- (no /etc/apt/preferences present) -- -- (/etc/apt/sources.list present, but not submitted) -- -- System Information: Debian Release: squeeze/sid APT prefers testing APT policy: (990, 'testing'), (500, 'unstable'), (500, 'stable'), (1, 'experimental') Architecture: amd64 (x86_64) Kernel: Linux 2.6.32 (SMP w/2 CPU cores) Locale: LANG=fr_FR.UTF-8, LC_CTYPE=fr_FR.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/bash Versions of packages apt depends on: ii debian-archive-keyring 2009.01.31 GnuPG archive keys of the Debian a ii libc6 2.10.2-2 GNU C Library: Shared libraries ii libgcc1 1:4.5-20091226-1 GCC support library ii libstdc++6 4.4.2-9 The GNU Standard C++ Library v3 apt recommends no packages. Versions of packages apt suggests: pn apt-doc <none> (no description available) ii aptitude 0.4.11.11-1+b2 terminal-based package manager ii bzip2 1.0.5-3 high-quality block-sorting file co ii dpkg-dev 1.15.5.6 Debian package development tools ii lzma 4.43-14 Compression method of 7z format in ii python-apt 0.7.13.3 Python interface to libapt-pkg ii synaptic 0.63 Graphical package manager -- no debconf information -- Samuel Thibault <samuel.thiba...@fnac.net> R: Parce que a renverse btement l'ordre naturel de lecture! Q: Mais pourquoi citer en fin d'article est-il si effroyable? R: Citer en fin d'article Q: Quelle est la chose la plus dsagrable sur les groupes de news?
diff -ur tmp/apt-0.7.25.1/ftparchive/writer.cc apt-0.7.25.1/ftparchive/writer.cc --- tmp/apt-0.7.25.1/ftparchive/writer.cc 2010-01-09 20:56:01.000000000 +0000 +++ apt-0.7.25.1/ftparchive/writer.cc 2010-01-24 12:27:55.000000000 +0000 @@ -58,10 +58,6 @@ { 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::ScannerFile(const char *File, bool ReadLink) { const char *LastComponent = strrchr(File, '/'); + char *RealPath; + if (LastComponent == NULL) LastComponent = File; else @@ -111,10 +109,13 @@ 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 @@ /* */ bool FTWScanner::RecursiveScan(string Dir) { + char *RealPath; /* 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 @@ of files from another file. */ bool FTWScanner::LoadFileList(string Dir,string File) { + char *RealPath; /* 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 @@ // Perform the delinking operation over all of the files string ParseJnk; const char *C = Files; + char *RealPath; for (;isspace(*C); C++); while (*C != 0) { @@ -679,10 +685,11 @@ 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 -ur tmp/apt-0.7.25.1/ftparchive/writer.h apt-0.7.25.1/ftparchive/writer.h --- tmp/apt-0.7.25.1/ftparchive/writer.h 2010-01-09 20:56:01.000000000 +0000 +++ apt-0.7.25.1/ftparchive/writer.h 2010-01-24 12:15:13.000000000 +0000 @@ -35,7 +35,6 @@ protected: vector<string> Patterns; const char *OriginalPath; - char *RealPath; bool ErrorPrinted; // Stuff for the delinker @@ -70,7 +69,6 @@ bool SetExts(string Vals); FTWScanner(); - virtual ~FTWScanner() {delete [] RealPath;}; }; class PackagesWriter : public FTWScanner