]> git.saurik.com Git - apt.git/commitdiff
don't try other compressions on hashsum mismatch
authorDavid Kalnischkies <david@kalnischkies.de>
Tue, 19 May 2015 08:40:55 +0000 (10:40 +0200)
committerDavid Kalnischkies <david@kalnischkies.de>
Sun, 7 Jun 2015 07:42:53 +0000 (09:42 +0200)
If we e.g. fail on hash verification for Packages.xz its highly unlikely
that it will be any better with Packages.gz, so we just waste download
bandwidth and time. It also causes us always to fallback to the
uncompressed Packages file for which the error will finally be reported,
which in turn confuses users as the file usually doesn't exist on the
mirrors, so a bug in apt is suspected for even trying it…

apt-pkg/acquire-item.cc
test/integration/test-apt-update-not-modified
test/integration/test-apt-update-rollback
test/integration/test-apt-update-transactions

index 8155b9bfe530f37514ada9a8deeea89fc1e8fc61..cf89717c4f41b74c7e56df71385f3216faf91c46 100644 (file)
@@ -154,7 +154,18 @@ void pkgAcquire::Item::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
         return;
       }
 
-      Status = StatError;
+      switch (Status)
+      {
+        case StatIdle:
+        case StatFetching:
+        case StatDone:
+           Status = StatError;
+           break;
+        case StatAuthError:
+        case StatError:
+        case StatTransientNetworkError:
+           break;
+      }
       Complete = false;
       Dequeue();
    }
@@ -167,7 +178,7 @@ void pkgAcquire::Item::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
       RenameOnError(MaximumSizeExceeded);
 
    // report mirror failure back to LP if we actually use a mirror
-   if(FailReason.size() != 0)
+   if(FailReason.empty() == false)
       ReportMirrorFailure(FailReason);
    else
       ReportMirrorFailure(ErrorText);
@@ -1403,17 +1414,19 @@ void pkgAcqIndex::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
 {
    Item::Failed(Message,Cnf);
 
-   size_t const nextExt = CompressionExtensions.find(' ');
-   if (nextExt != std::string::npos)
+   // authorisation matches will not be fixed by other compression types
+   if (Status != StatAuthError)
    {
-      CompressionExtensions = CompressionExtensions.substr(nextExt+1);
-      Init(RealURI, Desc.Description, Desc.ShortDesc);
-      Status = StatIdle;
-      return;
+      size_t const nextExt = CompressionExtensions.find(' ');
+      if (nextExt != std::string::npos)
+      {
+        CompressionExtensions = CompressionExtensions.substr(nextExt+1);
+        Init(RealURI, Desc.Description, Desc.ShortDesc);
+        Status = StatIdle;
+        return;
+      }
    }
 
-   Item::Failed(Message,Cnf);
-
    if(Target->IsOptional() && ExpectedHashes.empty() && Stage == STAGE_DOWNLOAD)
       Status = StatDone;
    else
index b1d55c15615e39a9d3a98b628111add4856ea109..bac33d5318c0b533ed6ffe2c3ed49e3e5800599a 100755 (executable)
@@ -14,6 +14,7 @@ setupaptarchive --no-update
 methodtest() {
        msgmsg 'Test InRelease with' "$1"
        rm -rf rootdir/var/lib/apt/lists
+       cp -a aptarchive/dists  aptarchive/dists.good
        # get our cache populated
        testsuccess aptget update
        listcurrentlistsdirectory > listsdir.lst
@@ -30,8 +31,27 @@ Reading package lists..." aptget update
 Reading package lists..." aptget update
        testfileequal 'listsdir-without-amd64.lst' "$(listcurrentlistsdirectory)"
 
-       # readd arch so its downloaded again
+       # readd arch so its downloaded again
        configarchitecture 'amd64' 'i386'
+       # … but oh noes, hashsum mismatch!
+       find aptarchive/dists/unstable/main/binary-amd64/ -type f -delete
+       cat >> aptarchive/dists/unstable/main/binary-amd64/Packages <<EOF
+
+Package: thisisbad
+Architecture: amd64
+Version: 1
+EOF
+       compressfile aptarchive/dists/unstable/main/binary-amd64/Packages
+       testfailureequal "Hit $1 unstable InRelease
+Get:1 $1 unstable/main amd64 Packages [$(stat -c '%s' 'aptarchive/dists.good/unstable/main/binary-amd64/Packages.gz') B]
+W: Failed to fetch $1/dists/unstable/main/binary-amd64/Packages.gz  Hash Sum mismatch
+
+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
+       cp -a aptarchive/dists.good aptarchive/dists
+
+       # … now everything is fine again
        testsuccessequal "Hit $1 unstable InRelease
 Get:1 $1 unstable/main amd64 Packages [$(stat -c '%s' 'aptarchive/dists/unstable/main/binary-amd64/Packages.gz') B]
 Reading package lists..." aptget update
@@ -46,7 +66,6 @@ Reading package lists..." aptget update
 
        msgmsg 'Test Release.gpg with' "$1"
        rm -rf rootdir/var/lib/apt/lists
-       cp -a aptarchive/dists  aptarchive/dists.good
        find aptarchive/dists -name 'InRelease' -delete
        # get our cache populated
        testsuccess aptget update
index b464a04a1a808b098d87ec2e3a085f701c7ea1be..6fd9017158671fa5d259b1c3fd8379bc12fb022e 100755 (executable)
@@ -60,7 +60,7 @@ test_inrelease_to_broken_hash_reverts_all() {
     break_repository_sources_index '+1hour'
 
     # test the error condition
-    testfailureequal "W: Failed to fetch file:${APTARCHIVE}/dists/unstable/main/source/Sources  Hash Sum mismatch
+    testfailureequal "W: Failed to fetch file:${APTARCHIVE}/dists/unstable/main/source/Sources.gz  Hash Sum mismatch
 
 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
@@ -127,7 +127,7 @@ E: There are problems and -y was used without --force-yes" aptget install -qq -y
     add_new_package '+1hour'
     break_repository_sources_index '+1hour'
 
-    testfailureequal "W: Failed to fetch file:$APTARCHIVE/dists/unstable/main/source/Sources  Hash Sum mismatch
+    testfailureequal "W: Failed to fetch file:$APTARCHIVE/dists/unstable/main/source/Sources.gz  Hash Sum mismatch
 
 E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq
 
index 63b31805600ffc05a34e6ade40faf48c49a8c89a..152e1617a0d1bc614416e649cc2cf8e4fd05b916 100755 (executable)
@@ -8,6 +8,7 @@ TESTDIR=$(readlink -f $(dirname $0))
 
 setupenvironment
 configarchitecture 'i386'
+configcompression '.' 'gz'
 
 insertpackage 'unstable' 'foo' 'all' '1.0'
 insertsource 'unstable' 'foo' 'all' '1.0'
@@ -15,7 +16,8 @@ insertsource 'unstable' 'foo' 'all' '1.0'
 setupaptarchive --no-update
 
 breakfile() {
-       mv "$1" "${1}.bak"
+       mv "${1}" "${1}.bak"
+       mv "${1}.gz" "${1}.gz.bak"
        cat > "$1" <<EOF
 Package: bar
 EOF
@@ -23,6 +25,7 @@ EOF
 }
 restorefile() {
        mv "${1}.bak" "$1"
+       mv "${1}.gz.bak" "${1}.gz"
 }
 
 testrun() {
@@ -54,7 +57,8 @@ testsetup() {
        testrun 'listsdir.lst'
 
        msgmsg 'Test with initial data over' "$1"
-       testsuccess aptget update
+       rm -rf rootdir/var/lib/apt/lists
+       testsuccess aptget update -o Debug::pkgAcquire::Worker=1
        listcurrentlistsdirectory > listsdir.lst
        redatereleasefiles '+1hour'
        testrun 'listsdir.lst'