From 50b942e9a228337a2ca20931036c7cfd8cdba90d Mon Sep 17 00:00:00 2001 From: Guillem Jover Date: Mon, 17 Feb 2014 22:02:38 +0100 Subject: DebFile: Refactor ExtractTarMember() out from ExtractArchive() Generalize DebFile::ExtractArchive() to take a member base name, so that we can reuse it for control.tar member extraction too. --- apt-inst/deb/debfile.cc | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'apt-inst/deb/debfile.cc') diff --git a/apt-inst/deb/debfile.cc b/apt-inst/deb/debfile.cc index 79434d8b5..15db1a7fc 100644 --- a/apt-inst/deb/debfile.cc +++ b/apt-inst/deb/debfile.cc @@ -88,21 +88,20 @@ const ARArchive::Member *debDebFile::GotoMember(const char *Name) return Member; } /*}}}*/ -// DebFile::ExtractArchive - Extract the archive data itself /*{{{*/ +// DebFile::ExtractTarMember - Extract the contents of a tar member /*{{{*/ // --------------------------------------------------------------------- /* Simple wrapper around tar.. */ -bool debDebFile::ExtractArchive(pkgDirStream &Stream) +bool debDebFile::ExtractTarMember(pkgDirStream &Stream,const char *Name) { // Get the archive member const ARArchive::Member *Member = NULL; std::string Compressor; - std::string const data = "data.tar"; std::vector compressor = APT::Configuration::getCompressors(); for (std::vector::const_iterator c = compressor.begin(); c != compressor.end(); ++c) { - Member = AR.FindMember(std::string(data).append(c->Extension).c_str()); + Member = AR.FindMember(std::string(Name).append(c->Extension).c_str()); if (Member == NULL) continue; Compressor = c->Binary; @@ -111,7 +110,7 @@ bool debDebFile::ExtractArchive(pkgDirStream &Stream) if (Member == NULL) { - std::string ext = "data.tar.{"; + std::string ext = std::string(Name) + ".{"; for (std::vector::const_iterator c = compressor.begin(); c != compressor.end(); ++c) ext.append(c->Extension.substr(1)); @@ -129,6 +128,14 @@ bool debDebFile::ExtractArchive(pkgDirStream &Stream) return Tar.Go(Stream); } /*}}}*/ +// DebFile::ExtractArchive - Extract the archive data itself /*{{{*/ +// --------------------------------------------------------------------- +/* Simple wrapper around DebFile::ExtractTarMember. */ +bool debDebFile::ExtractArchive(pkgDirStream &Stream) +{ + return ExtractTarMember(Stream, "data.tar"); +} + /*}}}*/ // DebFile::ControlExtract::DoItem - Control Tar Extraction /*{{{*/ // --------------------------------------------------------------------- -- cgit v1.2.3 From e7f56293f029505f59670be2bad244f6d9912369 Mon Sep 17 00:00:00 2001 From: Guillem Jover Date: Sun, 16 Feb 2014 23:30:48 +0100 Subject: Add support for data.tar, control.tar and control.tar.xz Sync the deb(5) format support with latest dpkg, by allowing uncompressed tar members and xz compressed control.tar. This also refactors the control.tar member extraction by using ExtractTarMember(), which also means future changes only need to be implemented in a single place. --- apt-inst/deb/debfile.cc | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) (limited to 'apt-inst/deb/debfile.cc') diff --git a/apt-inst/deb/debfile.cc b/apt-inst/deb/debfile.cc index 15db1a7fc..a811bbe88 100644 --- a/apt-inst/deb/debfile.cc +++ b/apt-inst/deb/debfile.cc @@ -42,12 +42,15 @@ debDebFile::debDebFile(FileFd &File) : File(File), AR(File) return; } - if (!CheckMember("control.tar.gz")) { - _error->Error(_("This is not a valid DEB archive, missing '%s' member"), "control.tar.gz"); + if (!CheckMember("control.tar") && + !CheckMember("control.tar.gz") && + !CheckMember("control.tar.xz")) { + _error->Error(_("This is not a valid DEB archive, missing '%s' member"), "control.tar"); return; } - if (!CheckMember("data.tar.gz") && + if (!CheckMember("data.tar") && + !CheckMember("data.tar.gz") && !CheckMember("data.tar.bz2") && !CheckMember("data.tar.lzma") && !CheckMember("data.tar.xz")) { @@ -108,6 +111,9 @@ bool debDebFile::ExtractTarMember(pkgDirStream &Stream,const char *Name) break; } + if (Member == NULL) + Member = AR.FindMember(std::string(Name).c_str()); + if (Member == NULL) { std::string ext = std::string(Name) + ".{"; @@ -201,14 +207,7 @@ bool debDebFile::MemControlExtract::Process(Item &Itm,const unsigned char *Data, it parses it into a tag section parser. */ bool debDebFile::MemControlExtract::Read(debDebFile &Deb) { - // Get the archive member and positition the file - const ARArchive::Member *Member = Deb.GotoMember("control.tar.gz"); - if (Member == 0) - return false; - - // Extract it. - ExtractTar Tar(Deb.GetFile(),Member->Size,"gzip"); - if (Tar.Go(*this) == false) + if (Deb.ExtractTarMember(*this, "control.tar") == false) return false; if (Control == 0) -- cgit v1.2.3 From 655122418d714f342b5d9789f45f8035f3fe8b9a Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Sat, 1 Mar 2014 15:11:42 +0100 Subject: =?UTF-8?q?warning:=20unused=20parameter=20=E2=80=98foo=E2=80=99?= =?UTF-8?q?=20[-Wunused-parameter]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reported-By: gcc -Wunused-parameter Git-Dch: Ignore --- apt-inst/deb/debfile.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'apt-inst/deb/debfile.cc') diff --git a/apt-inst/deb/debfile.cc b/apt-inst/deb/debfile.cc index a811bbe88..8684f03f7 100644 --- a/apt-inst/deb/debfile.cc +++ b/apt-inst/deb/debfile.cc @@ -194,7 +194,7 @@ bool debDebFile::MemControlExtract::DoItem(Item &Itm,int &Fd) // --------------------------------------------------------------------- /* Just memcopy the block from the tar extractor and put it in the right place in the pre-allocated memory block. */ -bool debDebFile::MemControlExtract::Process(Item &Itm,const unsigned char *Data, +bool debDebFile::MemControlExtract::Process(Item &/*Itm*/,const unsigned char *Data, unsigned long Size,unsigned long Pos) { memcpy(Control + Pos, Data,Size); -- cgit v1.2.3 From 453b82a388013e522b3a1b9fcd6ed0810dab1f4f Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Wed, 5 Mar 2014 22:11:25 +0100 Subject: cleanup headers and especially #includes everywhere Beside being a bit cleaner it hopefully also resolves oddball problems I have with high levels of parallel jobs. Git-Dch: Ignore Reported-By: iwyu (include-what-you-use) --- apt-inst/deb/debfile.cc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'apt-inst/deb/debfile.cc') diff --git a/apt-inst/deb/debfile.cc b/apt-inst/deb/debfile.cc index 8684f03f7..3803329fa 100644 --- a/apt-inst/deb/debfile.cc +++ b/apt-inst/deb/debfile.cc @@ -21,11 +21,17 @@ #include #include #include -#include #include - +#include +#include +#include +#include + +#include +#include +#include #include -#include + #include /*}}}*/ -- cgit v1.2.3 From b68ce88357daf362e60d7f8f131041289c8db690 Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Mon, 17 Mar 2014 13:43:12 +0100 Subject: apt-inst: Do not try to create a substring of an empty string in error reporting One of our compressors (the empty one) has an empty extension. Calling substr on it fails. --- apt-inst/deb/debfile.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'apt-inst/deb/debfile.cc') diff --git a/apt-inst/deb/debfile.cc b/apt-inst/deb/debfile.cc index 3803329fa..a63cb6716 100644 --- a/apt-inst/deb/debfile.cc +++ b/apt-inst/deb/debfile.cc @@ -124,8 +124,10 @@ bool debDebFile::ExtractTarMember(pkgDirStream &Stream,const char *Name) { std::string ext = std::string(Name) + ".{"; for (std::vector::const_iterator c = compressor.begin(); - c != compressor.end(); ++c) - ext.append(c->Extension.substr(1)); + c != compressor.end(); ++c) { + if (!c->Extension.empty()) + ext.append(c->Extension.substr(1)); + } ext.append("}"); return _error->Error(_("Internal error, could not locate member %s"), ext.c_str()); } -- cgit v1.2.3