]> git.saurik.com Git - apt.git/commitdiff
ignore newlines in dpkg-deb control output for installing debs
authorDavid Kalnischkies <david@kalnischkies.de>
Fri, 30 Oct 2015 22:16:01 +0000 (23:16 +0100)
committerDavid Kalnischkies <david@kalnischkies.de>
Wed, 4 Nov 2015 17:42:28 +0000 (18:42 +0100)
Leading or trailing newlines can be confusing for our parser as it
expects two newlines to start/stop a new stanza. To solve this the lines
we wanna add are printed first, ignore any leading newlines and then add
the stanza as provided by dpkg-deb with or without trailing newlines as
the parser will look at the first stanza only anyway and removing
trailing newlines is considerably harder to do.

Closes: 802553
apt-pkg/deb/debindexfile.cc
test/integration/test-apt-get-install-deb

index 793882e67a6d6d827e091517c4160fbafba49a5a..708b40a964e52d65db0fcd5e46d6f84ad5dab6f5 100644 (file)
@@ -181,6 +181,9 @@ bool debDebPkgFileIndex::GetContent(std::ostream &content, std::string const &de
    if(Popen((const char**)&Args[0], PipeFd, Child, FileFd::ReadOnly) == false)
       return _error->Error("Popen failed");
 
+   content << "Filename: " << debfile << "\n";
+   content << "Size: " << Buf.st_size << "\n";
+   bool first_line_seen = false;
    char buffer[1024];
    do {
       unsigned long long actual = 0;
@@ -189,13 +192,19 @@ bool debDebPkgFileIndex::GetContent(std::ostream &content, std::string const &de
       if (actual == 0)
         break;
       buffer[actual] = '\0';
-      content << buffer;
+      char const * b = buffer;
+      if (first_line_seen == false)
+      {
+        for (; *b != '\0' && (*b == '\n' || *b == '\r'); ++b)
+           /* skip over leading newlines */;
+        if (*b == '\0')
+           continue;
+        first_line_seen = true;
+      }
+      content << b;
    } while(true);
    ExecWait(Child, "Popen");
 
-   content << "Filename: " << debfile << "\n";
-   content << "Size: " << Buf.st_size << "\n";
-
    return true;
 }
 bool debDebPkgFileIndex::OpenListFile(FileFd &Pkg, std::string const &FileName)
index 5af6c5bf7c0a464ba3ba2ec7afdb320adf30b8c0..c41713a923a0a26103ed13bb2b056c7602ea4dc1 100755 (executable)
@@ -74,3 +74,32 @@ The following NEW packages will be installed:
 Remv foo:i386 [1.0]
 Inst foo (1.0 local-deb [amd64])
 Conf foo (1.0 local-deb [amd64])" aptget install ./incoming/foo_1.0_amd64.deb -s -q=0
+
+createpkg() {
+       local PKG="pkg-$1"
+       mkdir -p ./incoming/$PKG/DEBIAN
+       if [ -n "$2" ]; then
+               echo -n "$2" >> ./incoming/$PKG/DEBIAN/control
+       fi
+       echo "Package: $PKG
+Version: 0
+Priority: extra
+Maintainer: No Body <no@example.org>
+Architecture: all
+Description: test package" >> ./incoming/$PKG/DEBIAN/control
+       if [ -n "$3" ]; then
+               echo -n "$3" >> ./incoming/$PKG/DEBIAN/control
+       fi
+       testsuccess dpkg-deb --build ./incoming/$PKG/ ./incoming
+       #dpkg-deb -I ./incoming/${PKG}_0_all.deb control
+}
+createpkg 'as-it-should-be'
+createpkg 'leading-newline' '
+
+'
+createpkg 'trailing-newline' '' '
+'
+
+testsuccess aptget install ./incoming/pkg-as-it-should-be_0_all.deb
+testsuccess aptget install ./incoming/pkg-leading-newline_0_all.deb
+testsuccess aptget install ./incoming/pkg-trailing-newline_0_all.deb