Просмотр исходного кода

check internal redirections for loops, too

Now that we have the redirections loopchecker centrally in our items we
can use it also to prevent internal redirections to loop caused by
bugs as in a few instances we get into the business of rewriting the URI
we will query by ourself as we predict we would see such a redirect
anyway. Our code has no bugs of course, hence no practical difference. ;)

Gbp-Dch: Ignore
David Kalnischkies лет назад: 10
Родитель
Сommit
18ccc85f02
2 измененных файлов с 22 добавлено и 0 удалено
  1. 3 0
      apt-pkg/acquire-item.cc
  2. 19 0
      apt-pkg/acquire-worker.cc

+ 3 - 0
apt-pkg/acquire-item.cc

@@ -991,6 +991,9 @@ std::string pkgAcquire::Item::HashSum() const				/*{{{*/
 									/*}}}*/
 									/*}}}*/
 bool pkgAcquire::Item::IsRedirectionLoop(std::string const &NewURI)	/*{{{*/
 bool pkgAcquire::Item::IsRedirectionLoop(std::string const &NewURI)	/*{{{*/
 {
 {
+   // store can fail due to permission errors and the item will "loop" then
+   if (APT::String::Startswith(NewURI, "store:"))
+      return false;
    if (d->PastRedirections.empty())
    if (d->PastRedirections.empty())
    {
    {
       d->PastRedirections.push_back(NewURI);
       d->PastRedirections.push_back(NewURI);

+ 19 - 0
apt-pkg/acquire-worker.cc

@@ -686,6 +686,25 @@ bool pkgAcquire::Worker::QueueItem(pkgAcquire::Queue::QItem *Item)
       return true;
       return true;
    }
    }
 
 
+   if (Item->Owner->IsRedirectionLoop(Item->URI))
+   {
+      std::string const Message = "400 URI Failure"
+	 "\nURI: " + Item->URI +
+	 "\nFilename: " + Item->Owner->DestFile +
+	 "\nFailReason: RedirectionLoop";
+
+      auto const ItmOwners = Item->Owners;
+      for (auto &O: ItmOwners)
+      {
+	 O->Status = pkgAcquire::Item::StatError;
+	 O->Failed(Message, Config);
+	 if (Log != nullptr)
+	    Log->Fail(O->GetItemDesc());
+      }
+      // "queued" successfully, the item just instantly failed
+      return true;
+   }
+
    string Message = "600 URI Acquire\n";
    string Message = "600 URI Acquire\n";
    Message.reserve(300);
    Message.reserve(300);
    Message += "URI: " + Item->URI;
    Message += "URI: " + Item->URI;