]> granicus.if.org Git - neomutt/commitdiff
Convert crypt_extract_keys and signed handler to use buffers
authorKevin McCarthy <kevin@8t8.us>
Thu, 26 Sep 2019 01:44:50 +0000 (18:44 -0700)
committerRichard Russon <rich@flatcap.org>
Tue, 8 Oct 2019 16:43:58 +0000 (17:43 +0100)
Co-authored-by: Richard Russon <rich@flatcap.org>
ncrypt/crypt.c
ncrypt/crypt_mod.h
ncrypt/cryptglue.c
ncrypt/cryptglue.h
ncrypt/smime.c
ncrypt/smime.h

index 27c3255fd0d773bd1424bb05907f74821751ffb6..c407daafba7554603a8a7d794aeeaf826807a646 100644 (file)
@@ -857,14 +857,13 @@ void crypt_extract_keys_from_messages(struct Mailbox *m, struct EmailList *el)
   if (!WithCrypto)
     return;
 
-  char tempfname[PATH_MAX];
-
-  mutt_mktemp(tempfname, sizeof(tempfname));
-  FILE *fp_out = mutt_file_fopen(tempfname, "w");
+  struct Buffer *tempfname = mutt_buffer_pool_get();
+  mutt_buffer_mktemp(tempfname);
+  FILE *fp_out = mutt_file_fopen(mutt_b2s(tempfname), "w");
   if (!fp_out)
   {
-    mutt_perror(tempfname);
-    return;
+    mutt_perror(mutt_b2s(tempfname));
+    goto cleanup;
   }
 
   if (WithCrypto & APPLICATION_PGP)
@@ -889,7 +888,7 @@ void crypt_extract_keys_from_messages(struct Mailbox *m, struct EmailList *el)
 
       mutt_endwin();
       puts(_("Trying to extract PGP keys...\n"));
-      crypt_pgp_invoke_import(tempfname);
+      crypt_pgp_invoke_import(mutt_b2s(tempfname));
     }
 
     if (((WithCrypto & APPLICATION_SMIME) != 0) && (e->security & APPLICATION_SMIME))
@@ -918,7 +917,7 @@ void crypt_extract_keys_from_messages(struct Mailbox *m, struct EmailList *el)
       {
         mutt_endwin();
         puts(_("Trying to extract S/MIME certificates..."));
-        crypt_smime_invoke_import(tempfname, mbox);
+        crypt_smime_invoke_import(mutt_b2s(tempfname), mbox);
       }
     }
 
@@ -929,10 +928,13 @@ void crypt_extract_keys_from_messages(struct Mailbox *m, struct EmailList *el)
   if (isendwin())
     mutt_any_key_to_continue(NULL);
 
-  mutt_file_unlink(tempfname);
+  mutt_file_unlink(mutt_b2s(tempfname));
 
   if (WithCrypto & APPLICATION_PGP)
     OptDontHandlePgpKeys = false;
+
+cleanup:
+  mutt_buffer_pool_release(&tempfname);
 }
 
 /**
@@ -1126,6 +1128,7 @@ int mutt_signed_handler(struct Body *a, struct State *s)
   struct Body **signatures = NULL;
   int sigcnt = 0;
   int rc = 0;
+  struct Buffer *tempfile = NULL;
 
   a = a->parts;
   SecurityFlags signed_type = mutt_is_multipart_signed(b);
@@ -1186,10 +1189,10 @@ int mutt_signed_handler(struct Body *a, struct State *s)
 
     if (sigcnt != 0)
     {
-      char tempfile[PATH_MAX];
-      mutt_mktemp(tempfile, sizeof(tempfile));
+      tempfile = mutt_buffer_pool_get();
+      mutt_buffer_mktemp(tempfile);
       bool goodsig = true;
-      if (crypt_write_signed(a, s, tempfile) == 0)
+      if (crypt_write_signed(a, s, mutt_b2s(tempfile)) == 0)
       {
         for (int i = 0; i < sigcnt; i++)
         {
@@ -1197,7 +1200,7 @@ int mutt_signed_handler(struct Body *a, struct State *s)
               (signatures[i]->type == TYPE_APPLICATION) &&
               (mutt_str_strcasecmp(signatures[i]->subtype, "pgp-signature") == 0))
           {
-            if (crypt_pgp_verify_one(signatures[i], s, tempfile) != 0)
+            if (crypt_pgp_verify_one(signatures[i], s, mutt_b2s(tempfile)) != 0)
               goodsig = false;
 
             continue;
@@ -1210,7 +1213,7 @@ int mutt_signed_handler(struct Body *a, struct State *s)
                (mutt_str_strcasecmp(signatures[i]->subtype,
                                     "pkcs7-signature") == 0)))
           {
-            if (crypt_smime_verify_one(signatures[i], s, tempfile) != 0)
+            if (crypt_smime_verify_one(signatures[i], s, mutt_b2s(tempfile)) != 0)
               goodsig = false;
 
             continue;
@@ -1223,7 +1226,8 @@ int mutt_signed_handler(struct Body *a, struct State *s)
         }
       }
 
-      mutt_file_unlink(tempfile);
+      mutt_file_unlink(mutt_b2s(tempfile));
+      mutt_buffer_pool_release(&tempfile);
 
       b->goodsig = goodsig;
       b->badsig = !goodsig;
index 694d74aa978c3d5d2ad6c535026e4426d1541837..55370e308cc4a0b15abc171968b5c4e30ed5b5b3 100644 (file)
@@ -205,7 +205,7 @@ struct CryptModuleSpecs
    * @param infile  File containing certificate
    * @param mailbox Mailbox
    */
-  void         (*smime_invoke_import)(char *infile, char *mailbox);
+  void         (*smime_invoke_import)(const char *infile, const char *mailbox);
 };
 
 /* High Level crypto module interface */
index a4eb6f1887459200baec30efafebbaf3f627b0e8..e43016d324b45137541be199f00063466f3de9bf 100644 (file)
@@ -506,7 +506,7 @@ struct Body *crypt_smime_build_smime_entity(struct Body *a, char *certlist)
 /**
  * crypt_smime_invoke_import - Wrapper for CryptModuleSpecs::smime_invoke_import()
  */
-void crypt_smime_invoke_import(char *infile, char *mailbox)
+void crypt_smime_invoke_import(const char *infile, const char *mailbox)
 {
   if (CRYPT_MOD_CALL_CHECK(SMIME, smime_invoke_import))
     CRYPT_MOD_CALL(SMIME, smime_invoke_import)(infile, mailbox);
index b22c7f12531c8ec9ab4082cb8a678d8045073959..2238ec915413c18d55890da7dec72bd939d7f070 100644 (file)
@@ -43,7 +43,7 @@ void         crypt_pgp_void_passphrase(void);
 
 struct Body *crypt_smime_build_smime_entity(struct Body *a, char *certlist);
 char *       crypt_smime_find_keys(struct AddressList *al, bool oppenc_mode);
-void         crypt_smime_invoke_import(char *infile, char *mailbox);
+void         crypt_smime_invoke_import(const char *infile, const char *mailbox);
 void         crypt_smime_set_sender(const char *sender);
 struct Body *crypt_smime_sign_message(struct Body *a);
 bool         crypt_smime_valid_passphrase(void);
index 9f2cbc130de69dbb359cb68d39023e23be9e9597..3daf78168c139f8f7c563a05e543e2cb7f517853 100644 (file)
@@ -1171,7 +1171,7 @@ static int smime_handle_cert_email(char *certificate, char *mailbox, bool copy,
  * @param infile File to read
  * @retval ptr Filename of temporary file containing certificate
  */
-static char *smime_extract_certificate(char *infile)
+static char *smime_extract_certificate(const char *infile)
 {
   char pk7out[PATH_MAX], certfile[PATH_MAX];
   pid_t pid;
@@ -1339,7 +1339,7 @@ static char *smime_extract_signer_certificate(char *infile)
 /**
  * smime_class_invoke_import - Implements CryptModuleSpecs::smime_invoke_import()
  */
-void smime_class_invoke_import(char *infile, char *mailbox)
+void smime_class_invoke_import(const char *infile, const char *mailbox)
 {
   char *certfile = NULL;
   char buf[256];
index 86e3b9d5ac357c2c5e22a23189420bad724a9763..70b3fc6de35a07aad38f2444acd5f2f3eb5938c6 100644 (file)
@@ -60,7 +60,7 @@ struct Body *smime_class_build_smime_entity(struct Body *a, char *certlist);
 int          smime_class_decrypt_mime(FILE *fp_in, FILE **fp_out, struct Body *b, struct Body **cur);
 char *       smime_class_find_keys(struct AddressList *addrlist, bool oppenc_mode);
 void         smime_class_getkeys(struct Envelope *env);
-void         smime_class_invoke_import(char *infile, char *mailbox);
+void         smime_class_invoke_import(const char *infile, const char *mailbox);
 int          smime_class_send_menu(struct Email *e);
 struct Body *smime_class_sign_message(struct Body *a);
 bool         smime_class_valid_passphrase(void);