summaryrefslogtreecommitdiff
path: root/apt-pkg
diff options
context:
space:
mode:
Diffstat (limited to 'apt-pkg')
-rw-r--r--apt-pkg/acquire-item.cc13
-rw-r--r--apt-pkg/acquire-item.h2
-rw-r--r--apt-pkg/acquire-worker.cc2
3 files changed, 14 insertions, 3 deletions
diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc
index c845c9153..c50f46909 100644
--- a/apt-pkg/acquire-item.cc
+++ b/apt-pkg/acquire-item.cc
@@ -32,7 +32,9 @@
#include <apt-pkg/tagfile.h>
#include <algorithm>
+#include <array>
#include <cerrno>
+#include <ctime>
#include <chrono>
#include <cstddef>
#include <cstdio>
@@ -843,8 +845,17 @@ void pkgAcquire::Item::PushAlternativeURI(std::string &&NewURI, std::unordered_m
d->AlternativeURIs.emplace_front(std::move(NewURI), std::move(fields));
}
/*}}}*/
-void pkgAcquire::Item::RemoveAlternativeSite(std::string &&OldSite) /*{{{*/
+void pkgAcquire::Item::RemoveAlternativeSite(std::string const &AltUriStr)/*{{{*/
{
+ ::URI AltUri{AltUriStr};
+ // the hostnames for these methods are empty for absolute paths which would result
+ // in the elimination of all sites accessed via those methods. On the upside, those
+ // methods are local and fast to reply with failure, so it doesn't hurt that much to
+ // keep them in the loop – so we just exit here rather than trying to guess the site.
+ std::array const badhosts{"file", "copy", "cdrom"};
+ if (std::find(badhosts.begin(), badhosts.end(), AltUri.Access) != badhosts.end())
+ return;
+ auto const OldSite = URI::SiteOnly(AltUriStr);
d->AlternativeURIs.erase(std::remove_if(d->AlternativeURIs.begin(), d->AlternativeURIs.end(),
[&](decltype(*d->AlternativeURIs.cbegin()) AltUri) {
return URI::SiteOnly(AltUri.URI) == OldSite;
diff --git a/apt-pkg/acquire-item.h b/apt-pkg/acquire-item.h
index 22da9815d..b1985ada7 100644
--- a/apt-pkg/acquire-item.h
+++ b/apt-pkg/acquire-item.h
@@ -240,7 +240,7 @@ class APT_PUBLIC pkgAcquire::Item : public WeakPointable /*{{{*/
APT_HIDDEN bool PopAlternativeURI(std::string &NewURI);
APT_HIDDEN bool IsGoodAlternativeURI(std::string const &AltUri) const;
APT_HIDDEN void PushAlternativeURI(std::string &&NewURI, std::unordered_map<std::string, std::string> &&fields, bool const at_the_back);
- APT_HIDDEN void RemoveAlternativeSite(std::string &&OldSite);
+ APT_HIDDEN void RemoveAlternativeSite(std::string const &AltUri);
/** \brief A "descriptive" URI-like string.
*
diff --git a/apt-pkg/acquire-worker.cc b/apt-pkg/acquire-worker.cc
index ba3d52952..4b9d33505 100644
--- a/apt-pkg/acquire-worker.cc
+++ b/apt-pkg/acquire-worker.cc
@@ -720,7 +720,7 @@ void pkgAcquire::Worker::HandleFailure(std::vector<pkgAcquire::Item *> const &It
else
{
if (errAuthErr)
- Owner->RemoveAlternativeSite(URI::SiteOnly(Owner->GetItemDesc().URI));
+ Owner->RemoveAlternativeSite(Owner->GetItemDesc().URI);
if (Owner->PopAlternativeURI(NewURI))
{
Owner->FailMessage(Message);