From: Michael Vogt <michael.vogt@ubuntu.com>
Date: Mon, 26 Sep 2011 11:30:19 +0000 (+0200)
Subject: merged fix from donkult
X-Git-Tag: 0.9.0~51^2
X-Git-Url: https://git.saurik.com/apt.git/commitdiff_plain/a865ed25fa54514224cf4d6f83dd9cf48b7ed02b?hp=-c

merged fix from donkult
---

a865ed25fa54514224cf4d6f83dd9cf48b7ed02b
diff --git a/apt-pkg/deb/deblistparser.cc b/apt-pkg/deb/deblistparser.cc
index 59c4ee365..e4f3f9582 100644
--- a/apt-pkg/deb/deblistparser.cc
+++ b/apt-pkg/deb/deblistparser.cc
@@ -816,16 +816,16 @@ bool debListParser::LoadReleaseInfo(pkgCache::PkgFileIterator &FileI,
       ++lineEnd;
 
       // which datastorage need to be updated
-      map_ptrloc* writeTo = NULL;
+      enum { Suite, Component, Version, Origin, Codename, Label, None } writeTo = None;
       if (buffer[0] == ' ')
 	 ;
-      #define APT_PARSER_WRITETO(X, Y) else if (strncmp(Y, buffer, len) == 0) writeTo = &X;
-      APT_PARSER_WRITETO(FileI->Archive, "Suite")
-      APT_PARSER_WRITETO(FileI->Component, "Component")
-      APT_PARSER_WRITETO(FileI->Version, "Version")
-      APT_PARSER_WRITETO(FileI->Origin, "Origin")
-      APT_PARSER_WRITETO(FileI->Codename, "Codename")
-      APT_PARSER_WRITETO(FileI->Label, "Label")
+      #define APT_PARSER_WRITETO(X) else if (strncmp(#X, buffer, len) == 0) writeTo = X;
+      APT_PARSER_WRITETO(Suite)
+      APT_PARSER_WRITETO(Component)
+      APT_PARSER_WRITETO(Version)
+      APT_PARSER_WRITETO(Origin)
+      APT_PARSER_WRITETO(Codename)
+      APT_PARSER_WRITETO(Label)
       #undef APT_PARSER_WRITETO
       #define APT_PARSER_FLAGIT(X) else if (strncmp(#X, buffer, len) == 0) \
 	 pkgTagSection::FindFlag(FileI->Flags, pkgCache::Flag:: X, dataStart, lineEnd);
@@ -835,19 +835,19 @@ bool debListParser::LoadReleaseInfo(pkgCache::PkgFileIterator &FileI,
 
       // load all data from the line and save it
       string data;
-      if (writeTo != NULL)
+      if (writeTo != None)
 	 data.append(dataStart, dataEnd);
       if (sizeof(buffer) - 1 == (dataEnd - buffer))
       {
 	 while (fgets(buffer, sizeof(buffer), release) != NULL)
 	 {
-	    if (writeTo != NULL)
+	    if (writeTo != None)
 	       data.append(buffer);
 	    if (strlen(buffer) != sizeof(buffer) - 1)
 	       break;
 	 }
       }
-      if (writeTo != NULL)
+      if (writeTo != None)
       {
 	 // remove spaces and stuff from the end of the data line
 	 for (std::string::reverse_iterator s = data.rbegin();
@@ -857,7 +857,15 @@ bool debListParser::LoadReleaseInfo(pkgCache::PkgFileIterator &FileI,
 	       break;
 	    *s = '\0';
 	 }
-	 *writeTo = WriteUniqString(data);
+	 switch (writeTo) {
+	 case Suite: FileI->Archive = WriteUniqString(data); break;
+	 case Component: FileI->Component = WriteUniqString(data); break;
+	 case Version: FileI->Version = WriteUniqString(data); break;
+	 case Origin: FileI->Origin = WriteUniqString(data); break;
+	 case Codename: FileI->Codename = WriteUniqString(data); break;
+	 case Label: FileI->Label = WriteUniqString(data); break;
+	 case None: break;
+	 }
       }
    }
    fclose(release);
diff --git a/debian/changelog b/debian/changelog
index 51d09d28a..4ca81c329 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -28,6 +28,11 @@ apt (0.8.16~exp5) experimental; urgency=low
   * ftparchive/cachedb.cc:
     - fix buffersize in bytes2hex
 
+  [ David Kalnischkies ]  
+  * apt-pkg/deb/deblistparser.cc:
+    - fix crash when the dynamic mmap needs to be grown in
+      LoadReleaseInfo (LP: #854090)
+
  -- Michael Vogt <mvo@debian.org>  Fri, 05 Aug 2011 10:57:08 +0200
 
 apt (0.8.16~exp4) experimental; urgency=low