]> git.saurik.com Git - apt.git/commitdiff
show more details for "Hash Sum mismatch" errors
authorDavid Kalnischkies <david@kalnischkies.de>
Sat, 12 Mar 2016 19:29:04 +0000 (20:29 +0100)
committerDavid Kalnischkies <david@kalnischkies.de>
Mon, 25 Apr 2016 13:35:52 +0000 (15:35 +0200)
Users tend to report these errors with just this error message… not very
actionable and hard to figure out if this is a temporary or 'permanent'
mirror-sync issue or even the occasional apt bug.

Showing the involved hashsums and modification times should help in
triaging these kind of bugs – and eventually we will have less of them
via by-hash.

The subheaders aren't marked for translation for now as they are
technical glibberish and probably easier to deal with if not translated.
After all, our iconic "Hash Sum mismatch" is translated at least.

These additions were proposed in #817240 by Peter Palfrader.

apt-pkg/acquire-item.cc
apt-pkg/acquire-item.h
apt-pkg/acquire-worker.cc
test/integration/framework
test/integration/test-apt-helper
test/integration/test-apt-update-not-modified
test/integration/test-apt-update-rollback
test/integration/test-ubuntu-bug-1098738-apt-get-source-md5sum

index 474c0a0f21c62fd46d0dc5ddd9eb30092505348a..aeadbcfc7994613f4719b3f9d83c3a3874ce5ac8 100644 (file)
@@ -650,8 +650,6 @@ APT_CONST bool pkgAcquire::Item::IsTrusted() const                  /*{{{*/
    fetch this object */
 void pkgAcquire::Item::Failed(string const &Message,pkgAcquire::MethodConfig const * const Cnf)
 {
-   if(ErrorText.empty())
-      ErrorText = LookupTag(Message,"Message");
    if (QueueCounter <= 1)
    {
       /* This indicates that the file is not available right now but might
@@ -681,18 +679,37 @@ void pkgAcquire::Item::Failed(string const &Message,pkgAcquire::MethodConfig con
       Dequeue();
    }
 
+   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)
+        {
+           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", "<none>") << std::endl;
+        ErrorText = out.str();
+      }
+      else
+        ErrorText = LookupTag(Message,"Message");
+   }
+
    string const FailReason = LookupTag(Message, "FailReason");
    if (FailReason == "MaximumSizeExceeded")
-   {
       RenameOnError(MaximumSizeExceeded);
-      ReportMirrorFailureToCentral(*this, FailReason, ErrorText);
-   }
    else if (Status == StatAuthError)
-   {
       RenameOnError(HashSumMismatch);
-      ReportMirrorFailureToCentral(*this, "HashChecksumFailure", ErrorText);
-   }
-   else if (FailReason.empty() == false)
+
+   if (FailReason.empty() == false)
       ReportMirrorFailureToCentral(*this, FailReason, ErrorText);
    else
       ReportMirrorFailureToCentral(*this, ErrorText, ErrorText);
@@ -1769,6 +1786,23 @@ pkgAcqBaseIndex::pkgAcqBaseIndex(pkgAcquire * const Owner,
       IndexTarget const &Target)
 : pkgAcqTransactionItem(Owner, TransactionManager, Target), d(NULL)
 {
+}
+                                                                       /*}}}*/
+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")
+      return;
+
+   ErrorText.append("Release file created at: ");
+   auto const timespec = TransactionManager->MetaIndexParser->GetDate();
+   if (timespec == 0)
+      ErrorText.append("<unknown>");
+   else
+      ErrorText.append(TimeRFC1123(timespec));
+   ErrorText.append("\n");
 }
                                                                        /*}}}*/
 pkgAcqBaseIndex::~pkgAcqBaseIndex() {}
@@ -2210,7 +2244,7 @@ bool pkgAcqDiffIndex::ParseDiffIndex(string const &IndexDiffFile) /*{{{*/
                                                                        /*}}}*/
 void pkgAcqDiffIndex::Failed(string const &Message,pkgAcquire::MethodConfig const * const Cnf)/*{{{*/
 {
-   Item::Failed(Message,Cnf);
+   pkgAcqBaseIndex::Failed(Message,Cnf);
    Status = StatDone;
 
    if(Debug)
@@ -2291,7 +2325,7 @@ pkgAcqIndexDiffs::pkgAcqIndexDiffs(pkgAcquire * const Owner,
                                                                        /*}}}*/
 void pkgAcqIndexDiffs::Failed(string const &Message,pkgAcquire::MethodConfig const * const Cnf)/*{{{*/
 {
-   Item::Failed(Message,Cnf);
+   pkgAcqBaseIndex::Failed(Message,Cnf);
    Status = StatDone;
 
    DestFile = GetKeepCompressedFileName(GetPartialFileNameFromURI(Target.URI), Target);
@@ -2496,7 +2530,7 @@ void pkgAcqIndexMergeDiffs::Failed(string const &Message,pkgAcquire::MethodConfi
    if(Debug)
       std::clog << "pkgAcqIndexMergeDiffs failed: " << Desc.URI << " with " << Message << std::endl;
 
-   Item::Failed(Message,Cnf);
+   pkgAcqBaseIndex::Failed(Message,Cnf);
    Status = StatDone;
 
    // check if we are the first to fail, otherwise we are done here
@@ -2734,7 +2768,7 @@ string pkgAcqIndex::Custom600Headers() const
 // AcqIndex::Failed - getting the indexfile failed                     /*{{{*/
 void pkgAcqIndex::Failed(string const &Message,pkgAcquire::MethodConfig const * const Cnf)
 {
-   Item::Failed(Message,Cnf);
+   pkgAcqBaseIndex::Failed(Message,Cnf);
 
    // authorisation matches will not be fixed by other compression types
    if (Status != StatAuthError)
index 1884cfe529cd08803f190bff897ca657bec7ab7e..61037f1b731ad4b5b55029a0baa2d12c5b798472 100644 (file)
@@ -609,6 +609,7 @@ class APT_HIDDEN pkgAcqBaseIndex : public pkgAcqTransactionItem
  public:
    /** \brief Get the full pathname of the final file for the current URI */
    virtual std::string GetFinalFilename() const APT_OVERRIDE;
+   virtual void Failed(std::string const &Message,pkgAcquire::MethodConfig const * const Cnf) APT_OVERRIDE;
 
    pkgAcqBaseIndex(pkgAcquire * const Owner, pkgAcqMetaClearSig * const TransactionManager,
                    IndexTarget const &Target);
index ca1fd4836c3311c668413255892620b1ca462b79..c009f402e11f170eba3f280af6020b960d0b0cdc 100644 (file)
@@ -439,7 +439,10 @@ bool pkgAcquire::Worker::RunMessages()
               else
               {
                  if (isDoomedItem(Owner) == false)
+                 {
+                    Message.append("\nFailReason: HashSumMismatch");
                     Owner->Failed(Message,Config);
+                 }
                  if (Log != nullptr)
                     Log->Fail(Owner->GetItemDesc());
               }
index 2a78e619462b284c12c11a8362ab6392d45d37f3..a68209326ab5f623f32f513ccafafe599f3f81f5 100644 (file)
@@ -217,6 +217,12 @@ gdb() {
        fi
        runapt command gdb --quiet -ex run "$CMD" --args "$CMD" "$@"
 }
+lastmodification() {
+       date -u -d "@$(stat -c '%Y' "${TMPWORKINGDIRECTORY}/$1")" '+%a, %d %b %Y %H:%M:%S GMT'
+}
+releasefiledate() {
+       grep "^${2:-Date}:" "$1" | cut -d' ' -f 2- | sed -e 's#UTC#GMT#'
+}
 
 exitwithstatus() {
         # error if we about to overflow, but ...
@@ -595,12 +601,12 @@ setupsimplenativepackage() {
        mkdir -p ${BUILDDIR}/debian/source
        cd ${BUILDDIR}
        echo "* most suckless software product ever" > FEATURES
-       test -e debian/copyright || echo "Copyleft by Joe Sixpack $(date +%Y)" > debian/copyright
+       test -e debian/copyright || echo "Copyleft by Joe Sixpack $(date -u +%Y)" > debian/copyright
        test -e debian/changelog || echo "$NAME ($VERSION) $RELEASE; urgency=low
 
   * Initial release
 
- -- Joe Sixpack <joe@example.org>  $(date -R)" > debian/changelog
+ -- Joe Sixpack <joe@example.org>  $(date -u -R)" > debian/changelog
        test -e debian/control || echo "Source: $NAME
 Section: $SECTION
 Priority: optional
@@ -658,12 +664,12 @@ buildsimplenativepackage() {
        echo "#!/bin/sh
 echo '$NAME says \"Hello!\"'" > "${BUILDDIR}/${NAME}"
 
-       echo "Copyleft by Joe Sixpack $(date +%Y)" > "${BUILDDIR}/debian/copyright"
+       echo "Copyleft by Joe Sixpack $(date -u +%Y)" > "${BUILDDIR}/debian/copyright"
        echo "$NAME ($VERSION) $RELEASE; urgency=low
 
   * Initial release
 
- -- Joe Sixpack <joe@example.org>  $(date -R)" > "${BUILDDIR}/debian/changelog"
+ -- Joe Sixpack <joe@example.org>  $(date -u -R)" > "${BUILDDIR}/debian/changelog"
        {
                echo "Source: $NAME
 Priority: $PRIORITY
@@ -1014,13 +1020,13 @@ NotAutomatic: yes' "$dir/Release"
        fi
        if [ -n "$DATE" -a "$DATE" != "now" ]; then
                for release in $(find ./aptarchive -name 'Release'); do
-                       sed -i "s/^Date: .*$/Date: $(date -d "$DATE" '+%a, %d %b %Y %H:%M:%S %Z')/" "$release"
+                       sed -i "s/^Date: .*$/Date: $(date -u -d "$DATE" '+%a, %d %b %Y %H:%M:%S %Z')/" "$release"
                        touch -d "$DATE" "$release"
                done
        fi
        if [ -n "$VALIDUNTIL" ]; then
                sed -i "/^Date: / a\
-Valid-Until: $(date -d "$VALIDUNTIL" '+%a, %d %b %Y %H:%M:%S %Z')" $(find ./aptarchive -name 'Release')
+Valid-Until: $(date -u -d "$VALIDUNTIL" '+%a, %d %b %Y %H:%M:%S %Z')" $(find ./aptarchive -name 'Release')
        fi
        msgdone "info"
 }
@@ -1119,7 +1125,7 @@ signreleasefiles() {
 }
 
 redatereleasefiles() {
-       local DATE="$(date -d "$1" '+%a, %d %b %Y %H:%M:%S %Z')"
+       local DATE="$(date -u -d "$1" '+%a, %d %b %Y %H:%M:%S %Z')"
        for release in $(find aptarchive/ -name 'Release'); do
                sed -i "s/^Date: .*$/Date: ${DATE}/" "$release"
                touch -d "$DATE" "$release"
index bc7f6e68067b1fbca0c1adadc8f484c27f441b27..8a25859b840e2dbd7d57eaa57a5e615110445a12 100755 (executable)
@@ -34,12 +34,27 @@ test_apt_helper_download() {
     msgtest 'apt-file download-file' 'wrong md5sum'
     testfailure --nomsg apthelper -qq download-file "${1}/foo" './downloaded/foo5' 'MD5Sum:aabbcc'
     testfileequal rootdir/tmp/testfailure.output "E: Failed to fetch ${1}/foo  Hash Sum mismatch
+   Hashes of expected file:
+    - MD5Sum:aabbcc
+   Hashes of received file:
+    - SHA512:0cf9180a764aba863a67b6d72f0918bc131c6772642cb2dce5a34f0a702f9470ddc2bf125c12198b1995c233c34b4afd346c54a2334c350a948a51b6e8b4e6b6
+    - SHA256:b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c
+    - SHA1:f1d2d2f924e986ac86fdf7b36c94bcdf32beec15
+    - MD5Sum:d3b07384d113edec49eaa6238ad5ff00
+    - Checksum-FileSize:4
+   Last modification reported: $(lastmodification 'aptarchive/foo')
 E: Download Failed"
     testfileequal ./downloaded/foo5.FAILED 'foo'
 
     msgtest 'apt-file download-file' 'wrong sha256'
     testfailure --nomsg apthelper -qq download-file "${1}/foo" './downloaded/foo6' 'SHA256:aabbcc'
     testfileequal rootdir/tmp/testfailure.output "E: Failed to fetch ${1}/foo  Hash Sum mismatch
+   Hashes of expected file:
+    - SHA256:aabbcc
+   Hashes of received file:
+    - SHA256:b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c
+    - Checksum-FileSize:4
+   Last modification reported: $(lastmodification 'aptarchive/foo')
 E: Download Failed"
     testfileequal './downloaded/foo6.FAILED' 'foo'
 
index b1f801bc519c5548d7a6d4674bb2268012dfa498..c81a05b2c14491fbab8002f94553a64a5e308e07 100755 (executable)
@@ -6,6 +6,7 @@ TESTDIR="$(readlink -f "$(dirname "$0")")"
 
 setupenvironment
 configarchitecture 'amd64' 'i386'
+confighashes 'SHA256'
 
 insertpackage 'unstable' 'apt' 'amd64,i386' '1.0'
 
@@ -34,10 +35,9 @@ Reading package lists..." aptget update
        # readd arch so its downloaded again…
        configarchitecture 'amd64' 'i386'
        # … but oh noes, hashsum mismatch!
-        SIZE=$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz')
-       find aptarchive/dists/unstable/main/binary-amd64/ -type f -delete
-       cat >> aptarchive/dists/unstable/main/binary-amd64/Packages <<EOF
-
+       SIZE=$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz')
+       mv aptarchive/dists/unstable/main/binary-amd64/Packages.gz aptarchive/dists/unstable/main/binary-amd64/Packages.gz.orig
+       cat > aptarchive/dists/unstable/main/binary-amd64/Packages <<EOF
 Package: thisisbad
 Architecture: amd64
 Version: 1
@@ -47,8 +47,24 @@ EOF
 Get:2 $1 unstable/main amd64 Packages [$SIZE B]
 Err:2 $1 unstable/main amd64 Packages
   Hash Sum mismatch
+  Hashes of expected file:
+   - Checksum-FileSize:$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz.orig')
+   - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz.orig' | cut -d' ' -f 1)
+  Hashes of received file:
+   - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz' | cut -d' ' -f 1)
+   - Checksum-FileSize:$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz')
+  Last modification reported: $(lastmodification 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz')
+  Release file created at: $(releasefiledate 'aptarchive/dists/unstable/InRelease')
 Reading package lists...
 E: Failed to fetch $1/dists/unstable/main/binary-amd64/Packages.gz  Hash Sum mismatch
+   Hashes of expected file:
+    - Checksum-FileSize:$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz.orig')
+    - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz.orig' | cut -d' ' -f 1)
+   Hashes of received file:
+    - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz' | cut -d' ' -f 1)
+    - Checksum-FileSize:$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz')
+   Last modification reported: $(lastmodification 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz')
+   Release file created at: $(releasefiledate 'aptarchive/dists/unstable/InRelease')
 E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update
        testfileequal 'listsdir-without-amd64.lst' "$(listcurrentlistsdirectory)"
        rm -rf aptarchive/dists
@@ -93,10 +109,9 @@ Reading package lists..." aptget update
        # readd arch so its downloaded again…
        configarchitecture 'amd64' 'i386'
        # … but oh noes, hashsum mismatch!
-        SIZE=$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz')
-       find aptarchive/dists/unstable/main/binary-amd64/ -type f -delete
-       cat >> aptarchive/dists/unstable/main/binary-amd64/Packages <<EOF
-
+       SIZE=$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz')
+       mv aptarchive/dists/unstable/main/binary-amd64/Packages.gz aptarchive/dists/unstable/main/binary-amd64/Packages.gz.orig
+       cat > aptarchive/dists/unstable/main/binary-amd64/Packages <<EOF
 Package: thisisbad
 Architecture: amd64
 Version: 1
@@ -108,8 +123,24 @@ Hit:2 $1 unstable Release
 Get:4 $1 unstable/main amd64 Packages [$SIZE B]
 Err:4 $1 unstable/main amd64 Packages
   Hash Sum mismatch
+  Hashes of expected file:
+   - Checksum-FileSize:$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz.orig')
+   - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz.orig' | cut -d' ' -f 1)
+  Hashes of received file:
+   - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz' | cut -d' ' -f 1)
+   - Checksum-FileSize:$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz')
+  Last modification reported: $(lastmodification 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz')
+  Release file created at: $(releasefiledate 'aptarchive/dists/unstable/Release')
 Reading package lists...
 E: Failed to fetch $1/dists/unstable/main/binary-amd64/Packages.gz  Hash Sum mismatch
+   Hashes of expected file:
+    - Checksum-FileSize:$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz.orig')
+    - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz.orig' | cut -d' ' -f 1)
+   Hashes of received file:
+    - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz' | cut -d' ' -f 1)
+    - Checksum-FileSize:$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz')
+   Last modification reported: $(lastmodification 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz')
+   Release file created at: $(releasefiledate 'aptarchive/dists/unstable/Release')
 E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update
        testfileequal 'listsdir-without-amd64.lst' "$(listcurrentlistsdirectory)"
        rm -rf aptarchive/dists
index dc95627d7108298b4fbdbec8c167826ba888d547..d343baeae410a9090285822591edca143719edff 100755 (executable)
@@ -30,6 +30,7 @@ add_new_package() {
 }
 
 break_repository_sources_index() {
+    mv "$APTARCHIVE/dists/unstable/main/source/Sources.gz" "$APTARCHIVE/dists/unstable/main/source/Sources.gz.orig"
     printf 'xxx' > "$APTARCHIVE/dists/unstable/main/source/Sources"
     compressfile "$APTARCHIVE/dists/unstable/main/source/Sources" "$@"
 }
@@ -61,6 +62,14 @@ test_inrelease_to_broken_hash_reverts_all() {
 
     # test the error condition
     testfailureequal "E: Failed to fetch file:${APTARCHIVE}/dists/unstable/main/source/Sources.gz  Hash Sum mismatch
+   Hashes of expected file:
+    - Checksum-FileSize:$(stat -c '%s' 'aptarchive/dists/unstable/main/source/Sources.gz.orig')
+    - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/source/Sources.gz.orig' | cut -d' ' -f 1)
+   Hashes of received file:
+    - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/source/Sources.gz' | cut -d' ' -f 1)
+    - Checksum-FileSize:$(stat -c '%s' 'aptarchive/dists/unstable/main/source/Sources.gz')
+   Last modification reported: $(lastmodification 'aptarchive/dists/unstable/main/source/Sources.gz')
+   Release file created at: $(releasefiledate 'aptarchive/dists/unstable/InRelease')
 E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq
     # ensure that the Packages file is also rolled back
     testfileequal lists.before "$(listcurrentlistsdirectory)"
@@ -127,6 +136,14 @@ E: There were unauthenticated packages and -y was used without --allow-unauthent
     break_repository_sources_index '+1hour'
 
     testfailureequal "E: Failed to fetch file:$APTARCHIVE/dists/unstable/main/source/Sources.gz  Hash Sum mismatch
+   Hashes of expected file:
+    - Checksum-FileSize:$(stat -c '%s' 'aptarchive/dists/unstable/main/source/Sources.gz.orig')
+    - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/source/Sources.gz.orig' | cut -d' ' -f 1)
+   Hashes of received file:
+    - SHA256:$(sha256sum 'aptarchive/dists/unstable/main/source/Sources.gz' | cut -d' ' -f 1)
+    - Checksum-FileSize:$(stat -c '%s' 'aptarchive/dists/unstable/main/source/Sources.gz')
+   Last modification reported: $(lastmodification 'aptarchive/dists/unstable/main/source/Sources.gz')
+   Release file created at: $(releasefiledate 'aptarchive/dists/unstable/InRelease')
 E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq
 
     testfileequal lists.before "$(listcurrentlistsdirectory)"
index 2a271607e81a6a30638bd4e6ea9313dff12b5666..8994fa24e1b3f6b607aaa688eb30d2e771fb9870 100755 (executable)
@@ -220,8 +220,74 @@ Err:1 http://localhost:${APTHTTPPORT}  $1 1.0 (dsc)
 Get:2 http://localhost:${APTHTTPPORT}  $1 1.0 (tar) [4 B]
 Err:2 http://localhost:${APTHTTPPORT}  $1 1.0 (tar)
   Hash Sum mismatch
+  Hashes of expected file:
+   - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb
+   - Checksum-FileSize:4
+  Hashes of received file:
+   - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb
+   - 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)
 E: Failed to fetch http://localhost:${APTHTTPPORT}/${1}_1.0.tar.gz  Hash Sum mismatch
+   Hashes of expected file:
+    - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb
+    - Checksum-FileSize:4
+   Hashes of received file:
+    - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb
+    - Checksum-FileSize:3
+   Last modification reported: $(lastmodification "aptarchive/${1}_1.0.dsc")
+E: Failed to fetch some archives."
+       elif [ "$1" = 'pkg-md5-bad' ]; then
+               FAILURE="Reading package lists...
+Need to get 6 B of source archives.
+Get:1 http://localhost:${APTHTTPPORT}  $1 1.0 (dsc) [3 B]
+Err:1 http://localhost:${APTHTTPPORT}  $1 1.0 (dsc)
+  Hash Sum mismatch
+  Hashes of expected file:
+   - MD5Sum:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+   - Checksum-FileSize:3
+  Hashes of received file:
+   - SHA512:e52b7bb395ea3f46974f1f65b7c5975839aad32d4e2ec0f458f735d5aa24d2bf36d7816ed1e01dc3c493e11879e9a8f66dfca42821608cfe993996929a6be18a
+   - SHA256:943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a
+   - SHA1:324f464e6151a92cf57b26ef95dcfcf2059a8c44
+   - MD5Sum:9604ba9427a280db542279d9ed78400b
+   - Checksum-FileSize:3
+  Last modification reported: $(lastmodification "aptarchive/${1}_1.0.dsc")
+Get:2 http://localhost:${APTHTTPPORT}  $1 1.0 (tar) [3 B]
+Err:2 http://localhost:${APTHTTPPORT}  $1 1.0 (tar)
+  Hash Sum mismatch
+  Hashes of expected file:
+   - MD5Sum:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+   - Checksum-FileSize:3
+  Hashes of received file:
+   - SHA512:5aa4cad81553320574eb72ee92bd45a1f0575528e257749dff298b2a33df9e7fc7f5c1c87fc1c8fde230f1234cca3a99bf8625a0ff7bb3238eb7e5473f9b43c0
+   - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb
+   - SHA1:680254bad1d7ca0d65ec46aaa315d363abf6a50a
+   - MD5Sum:db5570bf61464b46e2bde31ed61a7dc6
+   - Checksum-FileSize:3
+  Last modification reported: $(lastmodification "aptarchive/${1}_1.0.tar.gz")
+E: Failed to fetch http://localhost:${APTHTTPPORT}/${1}_1.0.dsc  Hash Sum mismatch
+   Hashes of expected file:
+    - MD5Sum:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+    - Checksum-FileSize:3
+   Hashes of received file:
+    - SHA512:e52b7bb395ea3f46974f1f65b7c5975839aad32d4e2ec0f458f735d5aa24d2bf36d7816ed1e01dc3c493e11879e9a8f66dfca42821608cfe993996929a6be18a
+    - SHA256:943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a
+    - SHA1:324f464e6151a92cf57b26ef95dcfcf2059a8c44
+    - MD5Sum:9604ba9427a280db542279d9ed78400b
+    - Checksum-FileSize:3
+   Last modification reported: $(lastmodification "aptarchive/${1}_1.0.dsc")
+E: Failed to fetch http://localhost:${APTHTTPPORT}/${1}_1.0.tar.gz  Hash Sum mismatch
+   Hashes of expected file:
+    - MD5Sum:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+    - Checksum-FileSize:3
+   Hashes of received file:
+    - SHA512:5aa4cad81553320574eb72ee92bd45a1f0575528e257749dff298b2a33df9e7fc7f5c1c87fc1c8fde230f1234cca3a99bf8625a0ff7bb3238eb7e5473f9b43c0
+    - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb
+    - SHA1:680254bad1d7ca0d65ec46aaa315d363abf6a50a
+    - MD5Sum:db5570bf61464b46e2bde31ed61a7dc6
+    - Checksum-FileSize:3
+   Last modification reported: $(lastmodification "aptarchive/${1}_1.0.tar.gz")
 E: Failed to fetch some archives."
        else
                FAILURE="Reading package lists...
@@ -229,11 +295,55 @@ Need to get 6 B of source archives.
 Get:1 http://localhost:${APTHTTPPORT}  $1 1.0 (dsc) [3 B]
 Err:1 http://localhost:${APTHTTPPORT}  $1 1.0 (dsc)
   Hash Sum mismatch
+  Hashes of expected file:
+   - SHA256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+   - Checksum-FileSize:3
+   - SHA1:324f464e6151a92cf57b26ef95dcfcf2059a8c44
+   - MD5Sum:9604ba9427a280db542279d9ed78400b
+  Hashes of received file:
+   - SHA256:943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a
+   - SHA1:324f464e6151a92cf57b26ef95dcfcf2059a8c44
+   - MD5Sum:9604ba9427a280db542279d9ed78400b
+   - Checksum-FileSize:3
+  Last modification reported: $(lastmodification "aptarchive/${1}_1.0.dsc")
 Get:2 http://localhost:${APTHTTPPORT}  $1 1.0 (tar) [3 B]
 Err:2 http://localhost:${APTHTTPPORT}  $1 1.0 (tar)
   Hash Sum mismatch
+  Hashes of expected file:
+   - SHA256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+   - Checksum-FileSize:3
+   - SHA1:680254bad1d7ca0d65ec46aaa315d363abf6a50a
+   - MD5Sum:db5570bf61464b46e2bde31ed61a7dc6
+  Hashes of received file:
+   - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb
+   - SHA1:680254bad1d7ca0d65ec46aaa315d363abf6a50a
+   - MD5Sum:db5570bf61464b46e2bde31ed61a7dc6
+   - Checksum-FileSize:3
+  Last modification reported: $(lastmodification "aptarchive/${1}_1.0.tar.gz")
 E: Failed to fetch http://localhost:${APTHTTPPORT}/${1}_1.0.dsc  Hash Sum mismatch
+   Hashes of expected file:
+    - SHA256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+    - Checksum-FileSize:3
+    - SHA1:324f464e6151a92cf57b26ef95dcfcf2059a8c44
+    - MD5Sum:9604ba9427a280db542279d9ed78400b
+   Hashes of received file:
+    - SHA256:943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a
+    - SHA1:324f464e6151a92cf57b26ef95dcfcf2059a8c44
+    - MD5Sum:9604ba9427a280db542279d9ed78400b
+    - Checksum-FileSize:3
+   Last modification reported: $(lastmodification "aptarchive/${1}_1.0.dsc")
 E: Failed to fetch http://localhost:${APTHTTPPORT}/${1}_1.0.tar.gz  Hash Sum mismatch
+   Hashes of expected file:
+    - SHA256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+    - Checksum-FileSize:3
+    - SHA1:680254bad1d7ca0d65ec46aaa315d363abf6a50a
+    - MD5Sum:db5570bf61464b46e2bde31ed61a7dc6
+   Hashes of received file:
+    - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb
+    - SHA1:680254bad1d7ca0d65ec46aaa315d363abf6a50a
+    - MD5Sum:db5570bf61464b46e2bde31ed61a7dc6
+    - Checksum-FileSize:3
+   Last modification reported: $(lastmodification "aptarchive/${1}_1.0.tar.gz")
 E: Failed to fetch some archives."
        fi
        testfailureequal "$FAILURE" aptget source -d "$@"
@@ -311,7 +421,21 @@ Need to get 3 B of source archives.
 Get:1 http://localhost:${APTHTTPPORT}  pkg-mixed-sha2-bad 1.0 (tar) [3 B]
 Err:1 http://localhost:${APTHTTPPORT}  pkg-mixed-sha2-bad 1.0 (tar)
   Hash Sum mismatch
+  Hashes of expected file:
+   - SHA256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+   - Checksum-FileSize:3
+  Hashes of received file:
+   - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb
+   - Checksum-FileSize:3
+  Last modification reported: $(lastmodification 'aptarchive/pkg-mixed-sha2-bad_1.0.tar.gz')
 E: Failed to fetch http://localhost:${APTHTTPPORT}/pkg-mixed-sha2-bad_1.0.tar.gz  Hash Sum mismatch
+   Hashes of expected file:
+    - SHA256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+    - Checksum-FileSize:3
+   Hashes of received file:
+    - SHA256:90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb
+    - Checksum-FileSize:3
+   Last modification reported: $(lastmodification 'aptarchive/pkg-mixed-sha2-bad_1.0.tar.gz')
 E: Failed to fetch some archives." aptget source -d pkg-mixed-sha2-bad
 
 # it gets even more pathologic: multiple entries for one file, some even disagreeing!