From 4fa03143eee3776e2fa8fbd59d3cbaea40be0871 Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Tue, 30 Apr 2019 11:50:11 +0200 Subject: apt-helper: Support multiple hashes for a file This just peels supported hashes of the command-line until we reach a non-hash. For legacy compatability support, the first hash may be an empty string. --- cmdline/apt-helper.cc | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) (limited to 'cmdline') diff --git a/cmdline/apt-helper.cc b/cmdline/apt-helper.cc index beac0efba..119cbc4c8 100644 --- a/cmdline/apt-helper.cc +++ b/cmdline/apt-helper.cc @@ -63,14 +63,36 @@ static bool DoDownloadFile(CommandLine &CmdL) /*{{{*/ { std::string download_uri = CmdL.FileList[fileind + 1]; std::string targetfile = CmdL.FileList[fileind + 2]; - std::string hash; - if (CmdL.FileSize() > fileind + 3) - hash = CmdL.FileList[fileind + 3]; + HashStringList hashes; + + fileind += 2; + + // An empty string counts as a hash for compatability reasons + if (CmdL.FileSize() > fileind + 1 && *CmdL.FileList[fileind + 1] == '\0') + fileind++; + + /* Let's start looking for hashes */ + for (auto i = fileind + 1; CmdL.FileSize() > i; i++) + { + bool isAHash = false; + + for (auto HashP = HashString::SupportedHashes(); *HashP != nullptr; HashP++) + { + if (APT::String::Startswith(CmdL.FileList[i], *HashP)) + isAHash = true; + } + + if (!isAHash) + break; + + hashes.push_back(HashString(CmdL.FileList[i])); + fileind++; + } + // we use download_uri as descr and targetfile as short-descr - new pkgAcqFile(&Fetcher, download_uri, hash, 0, download_uri, targetfile, - "dest-dir-ignored", targetfile); + new pkgAcqFile(&Fetcher, download_uri, hashes, 0, download_uri, targetfile, + "dest-dir-ignored", targetfile); targetfiles.push_back(targetfile); - fileind += 3; } bool Failed = false; -- cgit v1.2.3