]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/versionmatch.cc
tests: don't do boundless string compares with data()
[apt.git] / apt-pkg / versionmatch.cc
index 86c1b7d4a65a3fc69d563cda5bd93b0549cfda64..2376ca8fd80de21596b866fd42b5626da1447102 100644 (file)
@@ -164,25 +164,37 @@ pkgCache::VerIterator pkgVersionMatch::Find(pkgCache::PkgIterator Pkg)
    pkgCache::VerIterator Ver = Pkg.VersionList();
    for (; Ver.end() == false; ++Ver)
    {
-      if (Type == Version)
-      {
-        if (MatchVer(Ver.VerStr(),VerStr,VerPrefixMatch) == true)
-           return Ver;
-        if (ExpressionMatches(VerStr, Ver.VerStr()) == true)
-           return Ver;
-        continue;
-      }
-      
-      for (pkgCache::VerFileIterator VF = Ver.FileList(); VF.end() == false; ++VF)
-        if (FileMatch(VF.File()) == true)
-           return Ver;
+      if (VersionMatches(Ver))
+        return Ver;
    }
-      
+
    // This will be Ended by now.
    return Ver;
 }
                                                                        /*}}}*/
 
+// VersionMatch::Find - Locate the best match for the select type      /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool pkgVersionMatch::VersionMatches(pkgCache::VerIterator Ver)
+{
+   if (Type == Version)
+   {
+      if (MatchVer(Ver.VerStr(),VerStr,VerPrefixMatch) == true)
+        return true;
+      if (ExpressionMatches(VerStr, Ver.VerStr()) == true)
+        return true;
+      return false;
+   }
+
+   for (pkgCache::VerFileIterator VF = Ver.FileList(); VF.end() == false; ++VF)
+      if (FileMatch(VF.File()) == true)
+        return true;
+
+   return false;
+}
+                                                                       /*}}}*/
+
 #ifndef FNM_CASEFOLD
 #define FNM_CASEFOLD 0
 #endif
@@ -269,12 +281,9 @@ bool pkgVersionMatch::FileMatch(pkgCache::PkgFileIterator File)
       if (OrSite.empty() == false) {
         if (File.Site() == NULL)
            return false;
-      } else // so we are talking about file:// or status file
-      {
-        pkgCache::RlsFileIterator const RlsFile = File.ReleaseFile();
-        if (strcmp(File.Site(),"") == 0 && RlsFile->Archive != 0 && strcmp(RlsFile.Archive(),"now") == 0) // skip the status file
-           return false;
       }
+      else if (File->Release == 0)// only 'bad' files like dpkg.status file has no release file
+        return false;
       return (ExpressionMatches(OrSite, File.Site())); /* both strings match */
    }