From 30979dd7616105302f06af82f419eb62d7b613f8 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Sun, 24 Apr 2016 10:35:08 +0200 Subject: show more details for "Writing more data" errors, too They are the small brothers of the hashsum mismatch, so they deserve a similar treatment even through we have for architectual reasons not a much to display as for hashsum mismatches for now. --- apt-pkg/acquire-item.cc | 63 ++++++++++++++-------- apt-pkg/acquire-worker.cc | 20 +++++-- test/integration/test-apt-update-expected-size | 9 ++-- .../test-ubuntu-bug-1098738-apt-get-source-md5sum | 6 +++ 4 files changed, 68 insertions(+), 30 deletions(-) diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc index aeadbcfc7..ceed5a510 100644 --- a/apt-pkg/acquire-item.cc +++ b/apt-pkg/acquire-item.cc @@ -679,35 +679,59 @@ void pkgAcquire::Item::Failed(string const &Message,pkgAcquire::MethodConfig con Dequeue(); } + string const FailReason = LookupTag(Message, "FailReason"); + enum { MAXIMUM_SIZE_EXCEEDED, HASHSUM_MISMATCH, OTHER } failreason = OTHER; + if ( FailReason == "MaximumSizeExceeded") + failreason = MAXIMUM_SIZE_EXCEEDED; + else if (Status == StatAuthError) + failreason = HASHSUM_MISMATCH; + if(ErrorText.empty()) { if (Status == StatAuthError) { std::ostringstream out; - out << _("Hash Sum mismatch") << std::endl; - out << "Hashes of expected file:" << std::endl; - for (auto const &hs: GetExpectedHashes()) - out << " - " << hs.toStr() << std::endl; - out << "Hashes of received file:" << std::endl; - for (char const * const * type = HashString::SupportedHashes(); *type != NULL; ++type) + switch (failreason) + { + case HASHSUM_MISMATCH: + out << _("Hash Sum mismatch") << std::endl; + break; + case MAXIMUM_SIZE_EXCEEDED: + case OTHER: + out << LookupTag(Message, "Message") << std::endl; + break; + } + auto const ExpectedHashes = GetExpectedHashes(); + if (ExpectedHashes.empty() == false) { - std::string const tagname = std::string(*type) + "-Hash"; - std::string const hashsum = LookupTag(Message, tagname.c_str()); - if (hashsum.empty() == false) - out << " - " << HashString(*type, hashsum).toStr() << std::endl; + out << "Hashes of expected file:" << std::endl; + for (auto const &hs: ExpectedHashes) + out << " - " << hs.toStr() << std::endl; + } + if (failreason == HASHSUM_MISMATCH) + { + out << "Hashes of received file:" << std::endl; + for (char const * const * type = HashString::SupportedHashes(); *type != NULL; ++type) + { + std::string const tagname = std::string(*type) + "-Hash"; + std::string const hashsum = LookupTag(Message, tagname.c_str()); + if (hashsum.empty() == false) + out << " - " << HashString(*type, hashsum).toStr() << std::endl; + } + out << "Last modification reported: " << LookupTag(Message, "Last-Modified", "") << std::endl; } - out << "Last modification reported: " << LookupTag(Message, "Last-Modified", "") << std::endl; ErrorText = out.str(); } else ErrorText = LookupTag(Message,"Message"); } - string const FailReason = LookupTag(Message, "FailReason"); - if (FailReason == "MaximumSizeExceeded") - RenameOnError(MaximumSizeExceeded); - else if (Status == StatAuthError) - RenameOnError(HashSumMismatch); + switch (failreason) + { + case MAXIMUM_SIZE_EXCEEDED: RenameOnError(MaximumSizeExceeded); break; + case HASHSUM_MISMATCH: RenameOnError(HashSumMismatch); break; + case OTHER: break; + } if (FailReason.empty() == false) ReportMirrorFailureToCentral(*this, FailReason, ErrorText); @@ -800,7 +824,6 @@ bool pkgAcquire::Item::RenameOnError(pkgAcquire::Item::RenameOnErrorState const { case HashSumMismatch: errtext = _("Hash Sum mismatch"); - Status = StatAuthError; break; case SizeMismatch: errtext = _("Size mismatch"); @@ -821,7 +844,6 @@ bool pkgAcquire::Item::RenameOnError(pkgAcquire::Item::RenameOnErrorState const break; case MaximumSizeExceeded: // the method is expected to report a good error for this - Status = StatError; break; case PDiffError: // no handling here, done by callers @@ -1791,9 +1813,8 @@ pkgAcqBaseIndex::pkgAcqBaseIndex(pkgAcquire * const Owner, void pkgAcqBaseIndex::Failed(std::string const &Message,pkgAcquire::MethodConfig const * const Cnf)/*{{{*/ { pkgAcquire::Item::Failed(Message, Cnf); - if (TransactionManager == nullptr || ErrorText.empty() || - TransactionManager->MetaIndexParser == nullptr || - LookupTag(Message, "FailReason") != "HashSumMismatch") + if (TransactionManager == nullptr || TransactionManager->MetaIndexParser == nullptr || + Status != StatAuthError) return; ErrorText.append("Release file created at: "); diff --git a/apt-pkg/acquire-worker.cc b/apt-pkg/acquire-worker.cc index c009f402e..69ca6a28e 100644 --- a/apt-pkg/acquire-worker.cc +++ b/apt-pkg/acquire-worker.cc @@ -471,18 +471,28 @@ bool pkgAcquire::Worker::RunMessages() OwnerQ->ItemDone(Itm); Itm = nullptr; - bool errTransient; + bool errTransient = false, errAuthErr = false; { std::string const failReason = LookupTag(Message, "FailReason"); - std::string const reasons[] = { "Timeout", "ConnectionRefused", - "ConnectionTimedOut", "ResolveFailure", "TmpResolveFailure" }; - errTransient = std::find(std::begin(reasons), std::end(reasons), failReason) != std::end(reasons); + { + auto const reasons = { "Timeout", "ConnectionRefused", + "ConnectionTimedOut", "ResolveFailure", "TmpResolveFailure" }; + errTransient = std::find(std::begin(reasons), std::end(reasons), failReason) != std::end(reasons); + } + if (errTransient == false) + { + auto const reasons = { "HashSumMismatch", "MaximumSizeExceeded" }; + errAuthErr = std::find(std::begin(reasons), std::end(reasons), failReason) != std::end(reasons); + } } for (auto const Owner: ItmOwners) { - if (errTransient) + if (errAuthErr && Owner->GetExpectedHashes().empty() == false) + Owner->Status = pkgAcquire::Item::StatAuthError; + else if (errTransient) Owner->Status = pkgAcquire::Item::StatTransientNetworkError; + if (isDoomedItem(Owner) == false) Owner->Failed(Message,Config); if (Log != nullptr) diff --git a/test/integration/test-apt-update-expected-size b/test/integration/test-apt-update-expected-size index 4981e72c3..ee0eae981 100755 --- a/test/integration/test-apt-update-expected-size +++ b/test/integration/test-apt-update-expected-size @@ -5,7 +5,8 @@ TESTDIR="$(readlink -f "$(dirname "$0")")" . "$TESTDIR/framework" setupenvironment -configarchitecture "i386" +configarchitecture 'i386' +configcompression '.' 'gz' insertpackage 'unstable' 'apt' 'i386' '1.0' @@ -30,13 +31,13 @@ test_packagestoobig() { buildaptarchivefromfiles '+1 hour' signreleasefiles # append junk at the end of the Packages.gz/Packages - SIZE="$(stat --printf=%s aptarchive/dists/unstable/main/binary-i386/Packages)" + SIZE="$(stat --printf=%s aptarchive/dists/unstable/main/binary-i386/Packages.gz)" find aptarchive/dists -name 'Packages*' | while read pkg; do echo "1234567890" >> "$pkg" touch -d '+1hour' "$pkg" done - NEW_SIZE="$(stat --printf=%s aptarchive/dists/unstable/main/binary-i386/Packages)" - testfailuremsg "E: Failed to fetch ${1}/dists/unstable/main/binary-i386/Packages Writing more data than expected ($NEW_SIZE > $SIZE) + NEW_SIZE="$(stat --printf=%s aptarchive/dists/unstable/main/binary-i386/Packages.gz)" + testfailuremsg "E: Failed to fetch ${1}/dists/unstable/main/binary-i386/Packages.gz Writing more data than expected ($NEW_SIZE > $SIZE) E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -o Debug::pkgAcquire::Worker=1 -o Debug::Acquire::Transaction=0 } diff --git a/test/integration/test-ubuntu-bug-1098738-apt-get-source-md5sum b/test/integration/test-ubuntu-bug-1098738-apt-get-source-md5sum index 8994fa24e..ac5dd11b8 100755 --- a/test/integration/test-ubuntu-bug-1098738-apt-get-source-md5sum +++ b/test/integration/test-ubuntu-bug-1098738-apt-get-source-md5sum @@ -217,6 +217,9 @@ Need to get 6 B of source archives. Get:1 http://localhost:${APTHTTPPORT} $1 1.0 (dsc) [2 B] Err:1 http://localhost:${APTHTTPPORT} $1 1.0 (dsc) Writing more data than expected (3 > 2) + Hashes of expected file: + - SHA256:943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a + - Checksum-FileSize:2 Get:2 http://localhost:${APTHTTPPORT} $1 1.0 (tar) [4 B] Err:2 http://localhost:${APTHTTPPORT} $1 1.0 (tar) Hash Sum mismatch @@ -228,6 +231,9 @@ Err:2 http://localhost:${APTHTTPPORT} $1 1.0 (tar) - Checksum-FileSize:3 Last modification reported: $(lastmodification "aptarchive/${1}_1.0.dsc") E: Failed to fetch http://localhost:${APTHTTPPORT}/${1}_1.0.dsc Writing more data than expected (3 > 2) + Hashes of expected file: + - SHA256:943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a + - Checksum-FileSize:2 E: Failed to fetch http://localhost:${APTHTTPPORT}/${1}_1.0.tar.gz Hash Sum mismatch Hashes of expected file: - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb -- cgit v1.2.3