]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/edsp.cc
ensure Cnf::FindFile doesn't return files below /dev/null
[apt.git] / apt-pkg / edsp.cc
index 27b269fd21cbf5cec6c066e279dc53566e15beeb..ef2401f9ecc0df5829e7bd20d52dd9bd38fa27c0 100644 (file)
@@ -439,7 +439,7 @@ bool EDSP::WriteScenario(pkgDepCache &Cache, FileFd &output, OpProgress *Progres
            Progress->Progress(p);
       }
    }
-   return true;
+   return Okay;
 }
                                                                        /*}}}*/
 // EDSP::WriteLimitedScenario - to the given file descriptor           /*{{{*/
@@ -1026,8 +1026,20 @@ bool EDSP::ResolveExternal(const char* const solver, pkgDepCache &Cache,
                        return false;
                auto const dumpdir = flNotFile(dumpfile);
                FileFd output;
-               if (CreateAPTDirectoryIfNeeded(dumpdir, dumpdir) == false ||
-                     output.Open(dumpfile, FileFd::WriteOnly | FileFd::Exclusive | FileFd::Create, FileFd::Extension, 0644) == false)
+               _error->PushToStack();
+               bool errored_out = CreateAPTDirectoryIfNeeded(dumpdir, dumpdir) == false ||
+                  output.Open(dumpfile, FileFd::WriteOnly | FileFd::Exclusive | FileFd::Create, FileFd::Extension, 0644) == false;
+               std::vector<std::string> downgrademsgs;
+               while (_error->empty() == false)
+               {
+                  std::string msg;
+                  _error->PopMessage(msg);
+                  downgrademsgs.emplace_back(std::move(msg));
+               }
+               _error->RevertToStack();
+               for (auto && msg : downgrademsgs)
+                  _error->Warning("%s", msg.c_str());
+               if (errored_out)
                        return _error->WarningE("EDSP::Resolve", _("Could not open file '%s'"), dumpfile.c_str());
                bool Okay = EDSP::WriteRequest(Cache, output, flags, nullptr);
                return Okay && EDSP::WriteScenario(Cache, output, nullptr);
@@ -1081,8 +1093,20 @@ bool EIPP::OrderInstall(char const * const solver, pkgPackageManager * const PM,
         return false;
       auto const dumpdir = flNotFile(dumpfile);
       FileFd output;
-      if (CreateAPTDirectoryIfNeeded(dumpdir, dumpdir) == false ||
-           output.Open(dumpfile, FileFd::WriteOnly | FileFd::Exclusive | FileFd::Create, FileFd::Extension, 0644) == false)
+      _error->PushToStack();
+      bool errored_out = CreateAPTDirectoryIfNeeded(dumpdir, dumpdir) == false ||
+           output.Open(dumpfile, FileFd::WriteOnly | FileFd::Exclusive | FileFd::Create, FileFd::Extension, 0644) == false;
+      std::vector<std::string> downgrademsgs;
+      while (_error->empty() == false)
+      {
+        std::string msg;
+        _error->PopMessage(msg);
+        downgrademsgs.emplace_back(std::move(msg));
+      }
+      _error->RevertToStack();
+      for (auto && msg : downgrademsgs)
+        _error->Warning("%s", msg.c_str());
+      if (errored_out)
         return _error->WarningE("EIPP::OrderInstall", _("Could not open file '%s'"), dumpfile.c_str());
       bool Okay = EIPP::WriteRequest(PM->Cache, output, flags, nullptr);
       return Okay && EIPP::WriteScenario(PM->Cache, output, nullptr);
@@ -1284,7 +1308,7 @@ bool EIPP::WriteScenario(pkgDepCache &Cache, FileFd &output, OpProgress * const
         continue;
       forAllInterestingVersions(Cache, Pkg, WriteVersion);
    }
-   return true;
+   return Okay;
 }
                                                                        /*}}}*/
 // EIPP::ReadResponse - from the given file descriptor                 /*{{{*/
@@ -1361,7 +1385,7 @@ bool EIPP::ReadResponse(int const input, pkgPackageManager * const PM, OpProgres
       else if (strcmp(type, "Remove") == 0)
         PM->Remove(Pkg, PM->Cache[Pkg].Purge());
    }
-   return true;
+   return in.Failed() == false;
 }
                                                                        /*}}}*/
 bool EIPP::ReadRequest(int const input, std::list<std::pair<std::string,PKG_ACTION>> &actions,/*{{{*/
@@ -1417,9 +1441,6 @@ bool EIPP::ReadRequest(int const input, std::list<std::pair<std::string,PKG_ACTI
       }
    }
    return false;
-
-
-   return false;
 }
                                                                        /*}}}*/
 bool EIPP::ApplyRequest(std::list<std::pair<std::string,PKG_ACTION>> &actions,/*{{{*/