From 2f91076de326a0dee067659381a9c4cf745f0efe Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Fri, 30 Oct 2015 23:16:01 +0100 Subject: 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 --- apt-pkg/deb/debindexfile.cc | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'apt-pkg/deb/debindexfile.cc') 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) -- cgit v1.2.3