releasing/blocks/cclient/patches/linux/apt-cache-search.patch
changeset 632 934f9131337b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/blocks/cclient/patches/linux/apt-cache-search.patch	Thu Sep 02 15:02:14 2010 +0800
@@ -0,0 +1,130 @@
+*** apt-0.7.20.2/cmdline/apt-cache.cc	2009-02-07 17:09:35.000000000 +0200
+--- apt-0.7.20.2-rhel/cmdline/apt-cache.cc	2010-01-08 20:21:29.000000000 +0200
+***************
+*** 1208,1214 ****
+     pkgCache::VerFileIterator Vf = V.FileList();
+     for (; Vf.end() == false; Vf++)
+        if ((Vf.File()->Flags & pkgCache::Flag::NotSource) == 0)
+! 	 break;
+     if (Vf.end() == true)
+        Vf = V.FileList();
+        
+--- 1208,1214 ----
+     pkgCache::VerFileIterator Vf = V.FileList();
+     for (; Vf.end() == false; Vf++)
+        if ((Vf.File()->Flags & pkgCache::Flag::NotSource) == 0)
+! 	 			break;
+     if (Vf.end() == true)
+        Vf = V.FileList();
+        
+***************
+*** 1233,1238 ****
+--- 1233,1245 ----
+  
+     // Get a pointer to start of Description field
+     const unsigned char *DescP = (unsigned char*)strstr((char*)Buffer, "Description:");
++    // HH: Bug fix. If descriptions are not found quit now to prevent crash
++    if (DescP == NULL)
++    {
++ 	cout << "E: Malformed packages inserted into cache. Description field missing!";
++ 	delete [] Buffer;
++ 	return false;
++    }
+  
+     // Write all but Description
+     if (fwrite(Buffer,1,DescP - Buffer,stdout) < (size_t)(DescP - Buffer))
+***************
+*** 1282,1287 ****
+--- 1289,1300 ----
+  bool Search(CommandLine &CmdL)
+  {
+     pkgCache &Cache = *GCache;
++    // HH: Bug fix. No need to do anything if no packages
++    if (Cache.HeaderP->PackageCount == 0)
++    {
++    		return true;
++    }
++    	
+     bool ShowFull = _config->FindB("APT::Cache::ShowFull",false);
+     bool NamesOnly = _config->FindB("APT::Cache::NamesOnly",false);
+     unsigned NumPatterns = CmdL.FileSize() -1;
+***************
+*** 1316,1322 ****
+     }
+     
+     ExDescFile *DFList = new ExDescFile[Cache.HeaderP->PackageCount+1];
+!    memset(DFList,0,sizeof(*DFList)*Cache.HeaderP->PackageCount+1);
+  
+     // Map versions that we want to write out onto the VerList array.
+     for (pkgCache::PkgIterator P = Cache.PkgBegin(); P.end() == false; P++)
+--- 1329,1336 ----
+     }
+     
+     ExDescFile *DFList = new ExDescFile[Cache.HeaderP->PackageCount+1];
+!    // HH: Bug fix. Memset all the memory
+!    memset(DFList, 0, sizeof(*DFList) * (Cache.HeaderP->PackageCount + 1));
+  
+     // Map versions that we want to write out onto the VerList array.
+     for (pkgCache::PkgIterator P = Cache.PkgBegin(); P.end() == false; P++)
+***************
+*** 1416,1423 ****
+        pkgCache::PkgIterator Pkg = Cache.FindPkg(*I);
+        if (Pkg.end() == true)
+        {
+! 	 _error->Warning(_("Unable to locate package %s"),*I);
+! 	 continue;
+        }
+  
+        ++found;
+--- 1430,1437 ----
+        pkgCache::PkgIterator Pkg = Cache.FindPkg(*I);
+        if (Pkg.end() == true)
+        {
+! 	 			_error->Warning(_("Unable to locate package %s"),*I);
+! 	 			continue;
+        }
+  
+        ++found;
+***************
+*** 1425,1444 ****
+        // Find the proper version to use.
+        if (_config->FindB("APT::Cache::AllVersions","true") == true)
+        {
+! 	 pkgCache::VerIterator V;
+! 	 for (V = Pkg.VersionList(); V.end() == false; V++)
+! 	 {
+! 	    if (DisplayRecord(V) == false)
+! 	       return false;
+! 	 }
+        }
+        else
+        {
+! 	 pkgCache::VerIterator V = Plcy.GetCandidateVer(Pkg);
+! 	 if (V.end() == true || V.FileList().end() == true)
+! 	    continue;
+! 	 if (DisplayRecord(V) == false)
+! 	    return false;
+        }      
+     }
+  
+--- 1439,1458 ----
+        // Find the proper version to use.
+        if (_config->FindB("APT::Cache::AllVersions","true") == true)
+        {
+! 				 pkgCache::VerIterator V;
+! 				 for (V = Pkg.VersionList(); V.end() == false; V++)
+! 				 {
+! 				    if (DisplayRecord(V) == false)
+! 				       return false;
+! 				 }
+        }
+        else
+        {
+! 				 pkgCache::VerIterator V = Plcy.GetCandidateVer(Pkg);
+! 				 if (V.end() == true || V.FileList().end() == true)
+! 				    continue;
+! 				 if (DisplayRecord(V) == false)
+! 				    return false;
+        }      
+     }
+