From 562f0774f8f04d978c7cea69a29c131a0e0ec75f Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Sat, 18 Jun 2016 13:55:39 +0200 Subject: better error message for insufficient hashsums Downloading and saying "Hash Sum mismatch" isn't very friendly from a user POV, so with this change we try to detect such cases early on and report it, preferably before download even started. Closes: 827758 --- apt-pkg/acquire-worker.cc | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) (limited to 'apt-pkg/acquire-worker.cc') diff --git a/apt-pkg/acquire-worker.cc b/apt-pkg/acquire-worker.cc index 2ad0eda7f..d3d95998c 100644 --- a/apt-pkg/acquire-worker.cc +++ b/apt-pkg/acquire-worker.cc @@ -443,7 +443,13 @@ bool pkgAcquire::Worker::RunMessages() { if (isDoomedItem(Owner) == false) { - Message.append("\nFailReason: HashSumMismatch"); + if (Message.find("\nFailReason:") == std::string::npos) + { + if (ReceivedHashes != ExpectedHashes) + Message.append("\nFailReason: HashSumMismatch"); + else + Message.append("\nFailReason: WeakHashSums"); + } Owner->Failed(Message,Config); } if (Log != nullptr) @@ -484,7 +490,7 @@ bool pkgAcquire::Worker::RunMessages() } if (errTransient == false) { - auto const reasons = { "HashSumMismatch", "MaximumSizeExceeded" }; + auto const reasons = { "HashSumMismatch", "WeakHashSums", "MaximumSizeExceeded" }; errAuthErr = std::find(std::begin(reasons), std::end(reasons), failReason) != std::end(reasons); } } @@ -631,12 +637,36 @@ bool pkgAcquire::Worker::QueueItem(pkgAcquire::Queue::QItem *Item) if (OutFd == -1) return false; + HashStringList const hsl = Item->GetExpectedHashes(); + + if (isDoomedItem(Item->Owner)) + return true; + + if (hsl.usable() == false && Item->Owner->HashesRequired() && + _config->Exists("Acquire::ForceHash") == false) + { + std::string const Message = "400 URI Failure" + "\nURI: " + Item->URI + + "\nFilename: " + Item->Owner->DestFile + + "\nFailReason: WeakHashSums"; + + auto const ItmOwners = Item->Owners; + for (auto &O: ItmOwners) + { + O->Status = pkgAcquire::Item::StatAuthError; + O->Failed(Message, Config); + if (Log != nullptr) + Log->Fail(O->GetItemDesc()); + } + // "queued" successfully, the item just instantly failed + return true; + } + string Message = "600 URI Acquire\n"; Message.reserve(300); Message += "URI: " + Item->URI; Message += "\nFilename: " + Item->Owner->DestFile; - HashStringList const hsl = Item->GetExpectedHashes(); for (HashStringList::const_iterator hs = hsl.begin(); hs != hsl.end(); ++hs) Message += "\nExpected-" + hs->HashType() + ": " + hs->HashValue(); -- cgit v1.2.3