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

* apt-pkg/contrib/gpgv.cc:
- ExecGPGV is a method which should never return, so mark it as such
and fix the inconsistency of returning in error cases

David Kalnischkies лет назад: 13
Родитель
Сommit
99ed26d322
5 измененных файлов с 44 добавлено и 27 удалено
  1. 16 6
      apt-pkg/contrib/gpgv.cc
  2. 20 6
      apt-pkg/contrib/gpgv.h
  3. 4 2
      apt-pkg/indexcopy.h
  4. 3 0
      debian/changelog
  5. 1 13
      methods/gpgv.cc

+ 16 - 6
apt-pkg/contrib/gpgv.cc

@@ -25,20 +25,28 @@ using namespace std;
 // ---------------------------------------------------------------------
 /* Generating the commandline for calling gpgv is somehow complicated as
    we need to add multiple keyrings and user supplied options. */
-bool ExecGPGV(std::string const &File, std::string const &FileGPG,
+void ExecGPGV(std::string const &File, std::string const &FileGPG,
 			int const &statusfd, int fd[2])
 {
+   #define EINTERNAL 111
+
    if (File == FileGPG)
    {
       #define SIGMSG "-----BEGIN PGP SIGNED MESSAGE-----\n"
       char buffer[sizeof(SIGMSG)];
       FILE* gpg = fopen(File.c_str(), "r");
       if (gpg == NULL)
-	 return _error->Errno("RunGPGV", _("Could not open file %s"), File.c_str());
+      {
+	 ioprintf(std::cerr, _("Could not open file %s"), File.c_str());
+	 exit(EINTERNAL);
+      }
       char const * const test = fgets(buffer, sizeof(buffer), gpg);
       fclose(gpg);
       if (test == NULL || strcmp(buffer, SIGMSG) != 0)
-	 return _error->Error(_("File %s doesn't start with a clearsigned message"), File.c_str());
+      {
+	 ioprintf(std::cerr, _("File %s doesn't start with a clearsigned message"), File.c_str());
+	 exit(EINTERNAL);
+      }
       #undef SIGMSG
    }
 
@@ -69,8 +77,9 @@ bool ExecGPGV(std::string const &File, std::string const &FileGPG,
    if (keyrings.empty() == true)
    {
       // TRANSLATOR: %s is the trusted keyring parts directory
-      return _error->Error(_("No keyring installed in %s."),
-			   _config->FindDir("Dir::Etc::TrustedParts").c_str());
+      ioprintf(std::cerr, _("No keyring installed in %s."),
+	    _config->FindDir("Dir::Etc::TrustedParts").c_str());
+      exit(EINTERNAL);
    }
 
    Args.push_back(gpgvpath.c_str());
@@ -133,6 +142,7 @@ bool ExecGPGV(std::string const &File, std::string const &FileGPG,
    }
 
    execvp(gpgvpath.c_str(), (char **) &Args[0]);
-   return true;
+   ioprintf(std::cerr, "Couldn't execute %s to check %s", Args[0], File.c_str());
+   exit(EINTERNAL);
 }
 									/*}}}*/

+ 20 - 6
apt-pkg/contrib/gpgv.h

@@ -11,14 +11,28 @@
 
 #include <string>
 
-/** \brief generates and run the command to verify a file with gpgv */
-bool ExecGPGV(std::string const &File, std::string const &FileOut,
-      int const &statusfd, int fd[2]);
+#if __GNUC__ >= 4
+	#define APT_noreturn	__attribute__ ((noreturn))
+#else
+	#define APT_noreturn	/* no support */
+#endif
 
-inline bool ExecGPGV(std::string const &File, std::string const &FileOut,
+/** \brief generates and run the command to verify a file with gpgv
+ *
+ * If File and FileSig specify the same file it is assumed that we
+ * deal with a clear-signed message.
+ *
+ * @param File is the message (unsigned or clear-signed)
+ * @param FileSig is the signature (detached or clear-signed)
+ */
+void ExecGPGV(std::string const &File, std::string const &FileSig,
+      int const &statusfd, int fd[2]) APT_noreturn;
+inline void ExecGPGV(std::string const &File, std::string const &FileSig,
       int const &statusfd = -1) {
    int fd[2];
-   return ExecGPGV(File, FileOut, statusfd, fd);
-}
+   ExecGPGV(File, FileSig, statusfd, fd);
+};
+
+#undef APT_noreturn
 
 #endif

+ 4 - 2
apt-pkg/indexcopy.h

@@ -101,11 +101,13 @@ class SigVerify								/*{{{*/
 
    __deprecated static bool RunGPGV(std::string const &File, std::string const &FileOut,
 		       int const &statusfd, int fd[2]) {
-      return ExecGPGV(File, FileOut, statusfd, fd);
+      ExecGPGV(File, FileOut, statusfd, fd);
+      return false;
    };
    __deprecated static bool RunGPGV(std::string const &File, std::string const &FileOut,
 			      int const &statusfd = -1) {
-      return ExecGPGV(File, FileOut, statusfd);
+      ExecGPGV(File, FileOut, statusfd);
+      return false;
    };
 };
 									/*}}}*/

+ 3 - 0
debian/changelog

@@ -3,6 +3,9 @@ apt (0.9.7.9) UNRELEASED; urgency=low
   [ David Kalnischkies ]
   * apt-pkg/indexcopy.cc:
     - rename RunGPGV to ExecGPGV and move it to apt-pkg/contrib/gpgv.cc
+  * apt-pkg/contrib/gpgv.cc:
+    - ExecGPGV is a method which should never return, so mark it as such
+      and fix the inconsistency of returning in error cases
 
  -- David Kalnischkies <kalnischkies@gmail.com>  Fri, 15 Mar 2013 14:15:43 +0100
 

+ 1 - 13
methods/gpgv.cc

@@ -71,19 +71,7 @@ string GPGVMethod::VerifyGetSigners(const char *file, const char *outfile,
    if (pid < 0)
       return string("Couldn't spawn new process") + strerror(errno);
    else if (pid == 0)
-   {
-      _error->PushToStack();
-      bool const success = ExecGPGV(outfile, file, 3, fd);
-      if (success == false)
-      {
-	 string errmsg;
-	 _error->PopMessage(errmsg);
-	 _error->RevertToStack();
-	 return errmsg;
-      }
-      _error->RevertToStack();
-      exit(111);
-   }
+      ExecGPGV(outfile, file, 3, fd);
    close(fd[1]);
 
    FILE *pipein = fdopen(fd[0], "r");