diff options
author | David Kalnischkies <david@kalnischkies.de> | 2015-10-30 23:16:01 +0100 |
---|---|---|
committer | David Kalnischkies <david@kalnischkies.de> | 2015-11-04 18:42:28 +0100 |
commit | 2f91076de326a0dee067659381a9c4cf745f0efe (patch) | |
tree | feb88d028ec1d312143c326be87ec942c4995919 | |
parent | 1dd20368486820efb6ef4476ad739e967174bec4 (diff) |
ignore newlines in dpkg-deb control output for installing debs
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
-rw-r--r-- | apt-pkg/deb/debindexfile.cc | 17 | ||||
-rwxr-xr-x | test/integration/test-apt-get-install-deb | 29 |
2 files changed, 42 insertions, 4 deletions
diff --git a/apt-pkg/deb/debindexfile.cc b/apt-pkg/deb/debindexfile.cc index 793882e67..708b40a96 100644 --- a/apt-pkg/deb/debindexfile.cc +++ b/apt-pkg/deb/debindexfile.cc @@ -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) diff --git a/test/integration/test-apt-get-install-deb b/test/integration/test-apt-get-install-deb index 5af6c5bf7..c41713a92 100755 --- a/test/integration/test-apt-get-install-deb +++ b/test/integration/test-apt-get-install-deb @@ -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 |