* apt-pkg/deb/deblistparser.cc:
authorDavid Kalnischkies <kalnischkies@gmail.com>
Wed, 27 Jul 2011 21:50:55 +0000 (23:50 +0200)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Wed, 27 Jul 2011 21:50:55 +0000 (23:50 +0200)
  - do not assume that the last char on a line is a \n (Closes: #633350)

apt-pkg/deb/deblistparser.cc
debian/changelog
test/integration/test-bug-633350-do-not-kill-last-char-in-Release [new file with mode: 0755]

index 651fa2a..fd5a1e4 100644 (file)
@@ -805,6 +805,10 @@ bool debListParser::LoadReleaseInfo(pkgCache::PkgFileIterator &FileI,
       for (++dataStart; *dataStart == ' '; ++dataStart);
       char* dataEnd = dataStart;
       for (++dataEnd; *dataEnd != '\0'; ++dataEnd);
+      // The last char should be a newline, but we can never be sure: #633350
+      char* lineEnd = dataEnd;
+      for (--lineEnd; *lineEnd == '\r' || *lineEnd == '\n'; --lineEnd);
+      ++lineEnd;
 
       // which datastorage need to be updated
       map_ptrloc* writeTo = NULL;
@@ -819,7 +823,7 @@ bool debListParser::LoadReleaseInfo(pkgCache::PkgFileIterator &FileI,
       APT_PARSER_WRITETO(FileI->Label, "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, dataEnd-1);
+        pkgTagSection::FindFlag(FileI->Flags, pkgCache::Flag:: X, dataStart, lineEnd);
       APT_PARSER_FLAGIT(NotAutomatic)
       APT_PARSER_FLAGIT(ButAutomaticUpgrades)
       #undef APT_PARSER_FLAGIT
index 1eeb99b..3f723f2 100644 (file)
@@ -1,3 +1,11 @@
+apt (0.8.15.5) UNRELEASED; urgency=low
+
+  [ David Kalnischkies ]
+  * apt-pkg/deb/deblistparser.cc:
+    - do not assume that the last char on a line is a \n (Closes: #633350)
+
+ -- David Kalnischkies <kalnischkies@gmail.com>  Wed, 27 Jul 2011 23:25:45 +0200
+
 apt (0.8.15.4) unstable; urgency=low
 
   [ David Miller ]
diff --git a/test/integration/test-bug-633350-do-not-kill-last-char-in-Release b/test/integration/test-bug-633350-do-not-kill-last-char-in-Release
new file mode 100755 (executable)
index 0000000..3d38355
--- /dev/null
@@ -0,0 +1,27 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+setupenvironment
+configarchitecture 'amd64'
+
+insertpackage 'unstable' 'cool' 'amd64' '1.0'
+
+setupaptarchive 2> /dev/null
+
+echo 'NotAutomatic: yes' >> aptarchive/dists/unstable/Release
+
+signreleasefiles
+find aptarchive/dists -name 'InRelease' -delete
+
+rm -rf rootdir/var/lib/apt/lists rootdir/var/cache/apt
+
+OUTPUT="$(aptget update 2>&1)"
+msgtest 'Check that parsing happens without warnings' 'with missing newline'
+if echo "${OUTPUT}" | grep '^W:' > /dev/null; then
+       msgfail
+       echo "${OUTPUT}"
+else
+       msgpass
+fi