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", "<none>") << 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);
- 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);
{
case HashSumMismatch:
errtext = _("Hash Sum mismatch");
- Status = StatAuthError;
break;
case SizeMismatch:
errtext = _("Size mismatch");
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
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: ");
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)
. "$TESTDIR/framework"
setupenvironment
-configarchitecture "i386"
+configarchitecture 'i386'
+configcompression '.' 'gz'
insertpackage 'unstable' 'apt' 'i386' '1.0'
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
}
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
- 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