Browse Source

don't try other compressions on hashsum mismatch

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…
tags/debian/1.1.exp9
David Kalnischkies 6 years ago
parent
commit
58702f8563
4 changed files with 52 additions and 16 deletions
  1. +23
    -10
      apt-pkg/acquire-item.cc
  2. +21
    -2
      test/integration/test-apt-update-not-modified
  3. +2
    -2
      test/integration/test-apt-update-rollback
  4. +6
    -2
      test/integration/test-apt-update-transactions

+ 23
- 10
apt-pkg/acquire-item.cc View 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


+ 21
- 2
test/integration/test-apt-update-not-modified View File

@@ -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


+ 2
- 2
test/integration/test-apt-update-rollback View File

@@ -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



+ 6
- 2
test/integration/test-apt-update-transactions View File

@@ -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'


Loading…
Cancel
Save