]> git.llucax.com Git - software/mutt-debian.git/blobdiff - smime.c
Use elinks-lite (with an alternative Build-Dependency on elinks) for rendering the...
[software/mutt-debian.git] / smime.c
diff --git a/smime.c b/smime.c
index 437b62fb8ba0a4e69eeb5cba7049c034203f5959..e4a784fbcbc953612e3b54cb363380c11ab0d799 100644 (file)
--- a/smime.c
+++ b/smime.c
@@ -381,7 +381,7 @@ char* smime_ask_for_key (char *prompt, char *mailbox, short public)
   while (!feof(index)) {
     if (fgets(buf, sizeof(buf), index)) cert_num++;
   }
   while (!feof(index)) {
     if (fgets(buf, sizeof(buf), index)) cert_num++;
   }
-  fclose(index);
+  safe_fclose (&index);
 
   FOREVER
   {
 
   FOREVER
   {
@@ -425,7 +425,7 @@ char* smime_ask_for_key (char *prompt, char *mailbox, short public)
   
       cur++;
     }
   
       cur++;
     }
-    fclose(index);
+    safe_fclose (&index);
   
     /* Make Helpstring */
     helpstr[0] = 0;
   
     /* Make Helpstring */
     helpstr[0] = 0;
@@ -438,10 +438,9 @@ char* smime_ask_for_key (char *prompt, char *mailbox, short public)
     strcat (helpstr, buf);     /* __STRCAT_CHECKED__ */
   
     /* Create the menu */
     strcat (helpstr, buf);     /* __STRCAT_CHECKED__ */
   
     /* Create the menu */
-    menu = mutt_new_menu();
+    menu = mutt_new_menu(MENU_SMIME);
     menu->max = cur;
     menu->make_entry = smime_entry;
     menu->max = cur;
     menu->make_entry = smime_entry;
-    menu->menu = MENU_SMIME;
     menu->help = helpstr;
     menu->data = Table;
     menu->title = title;
     menu->help = helpstr;
     menu->data = Table;
     menu->title = title;
@@ -531,8 +530,7 @@ char *smime_get_field_from_db (char *mailbox, char *query, short public, short m
        if (numFields < 2)
            continue;
        if (mailbox && public && 
        if (numFields < 2)
            continue;
        if (mailbox && public && 
-           (!fields[4] ||
-            *fields[4] == 'i' || *fields[4] == 'e' || *fields[4] == 'r'))
+           (*fields[4] == 'i' || *fields[4] == 'e' || *fields[4] == 'r'))
            continue;
 
        if (found)
            continue;
 
        if (found)
@@ -769,7 +767,7 @@ char *smime_findKeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc)
       default: abort ();
     }
     
       default: abort ();
     }
     
-    *last = rfc822_cpy_adr (p);
+    *last = rfc822_cpy_adr (p, 0);
     while (*last)
       last = &((*last)->next);
   }
     while (*last)
       last = &((*last)->next);
   }
@@ -838,7 +836,7 @@ static int smime_handle_cert_email (char *certificate, char *mailbox,
   mutt_mktemp (tmpfname);
   if ((fpout = safe_fopen (tmpfname, "w+")) == NULL)
   {
   mutt_mktemp (tmpfname);
   if ((fpout = safe_fopen (tmpfname, "w+")) == NULL)
   {
-    fclose (fperr);
+    safe_fclose (&fperr);
     mutt_perror (tmpfname);
     return 1;
   }
     mutt_perror (tmpfname);
     return 1;
   }
@@ -850,8 +848,8 @@ static int smime_handle_cert_email (char *certificate, char *mailbox,
                               SmimeGetCertEmailCommand))== -1)
   {
     mutt_message (_("Error: unable to create OpenSSL subprocess!"));
                               SmimeGetCertEmailCommand))== -1)
   {
     mutt_message (_("Error: unable to create OpenSSL subprocess!"));
-    fclose (fperr);
-    fclose (fpout);
+    safe_fclose (&fperr);
+    safe_fclose (&fpout);
     return 1;
   }
 
     return 1;
   }
 
@@ -901,8 +899,8 @@ static int smime_handle_cert_email (char *certificate, char *mailbox,
   }
   else if(copy) ret = 2;
 
   }
   else if(copy) ret = 2;
 
-  fclose (fpout);
-  fclose (fperr);
+  safe_fclose (&fpout);
+  safe_fclose (&fperr);
 
   return ret;
 }
 
   return ret;
 }
@@ -929,7 +927,7 @@ static char *smime_extract_certificate (char *infile)
   mutt_mktemp (pk7out);
   if ((fpout = safe_fopen (pk7out, "w+")) == NULL)
   {
   mutt_mktemp (pk7out);
   if ((fpout = safe_fopen (pk7out, "w+")) == NULL)
   {
-    fclose (fperr);
+    safe_fclose (&fperr);
     mutt_perror (pk7out);
     return NULL;
   }
     mutt_perror (pk7out);
     return NULL;
   }
@@ -943,8 +941,8 @@ static char *smime_extract_certificate (char *infile)
                               SmimePk7outCommand))== -1)
   {
     mutt_any_key_to_continue (_("Error: unable to create OpenSSL subprocess!"));
                               SmimePk7outCommand))== -1)
   {
     mutt_any_key_to_continue (_("Error: unable to create OpenSSL subprocess!"));
-    fclose (fperr);
-    fclose (fpout);
+    safe_fclose (&fperr);
+    safe_fclose (&fpout);
     mutt_unlink (pk7out);
     return NULL;
   }
     mutt_unlink (pk7out);
     return NULL;
   }
@@ -961,19 +959,19 @@ static char *smime_extract_certificate (char *infile)
   {
     mutt_perror (pk7out);
     mutt_copy_stream (fperr, stdout);
   {
     mutt_perror (pk7out);
     mutt_copy_stream (fperr, stdout);
-    fclose (fpout);
-    fclose (fperr);
+    safe_fclose (&fpout);
+    safe_fclose (&fperr);
     mutt_unlink (pk7out);
     return NULL;
     
   }
 
 
     mutt_unlink (pk7out);
     return NULL;
     
   }
 
 
-  fclose (fpout);
+  safe_fclose (&fpout);
   mutt_mktemp (certfile);
   if ((fpout = safe_fopen (certfile, "w+")) == NULL)
   {
   mutt_mktemp (certfile);
   if ((fpout = safe_fopen (certfile, "w+")) == NULL)
   {
-    fclose (fperr);
+    safe_fclose (&fperr);
     mutt_unlink (pk7out);
     mutt_perror (certfile);
     return NULL;
     mutt_unlink (pk7out);
     mutt_perror (certfile);
     return NULL;
@@ -987,8 +985,8 @@ static char *smime_extract_certificate (char *infile)
                               SmimeGetCertCommand))== -1)
   {
     mutt_any_key_to_continue (_("Error: unable to create OpenSSL subprocess!"));
                               SmimeGetCertCommand))== -1)
   {
     mutt_any_key_to_continue (_("Error: unable to create OpenSSL subprocess!"));
-    fclose (fperr);
-    fclose (fpout);
+    safe_fclose (&fperr);
+    safe_fclose (&fpout);
     mutt_unlink (pk7out);
     mutt_unlink (certfile);
     return NULL;
     mutt_unlink (pk7out);
     mutt_unlink (certfile);
     return NULL;
@@ -1006,14 +1004,14 @@ static char *smime_extract_certificate (char *infile)
   if (empty)
   {
     mutt_copy_stream (fperr, stdout);
   if (empty)
   {
     mutt_copy_stream (fperr, stdout);
-    fclose (fpout);
-    fclose (fperr);
+    safe_fclose (&fpout);
+    safe_fclose (&fperr);
     mutt_unlink (certfile);
     return NULL;
   }
 
     mutt_unlink (certfile);
     return NULL;
   }
 
-  fclose (fpout);
-  fclose (fperr);
+  safe_fclose (&fpout);
+  safe_fclose (&fperr);
 
   return safe_strdup (certfile);
 }
 
   return safe_strdup (certfile);
 }
@@ -1039,7 +1037,7 @@ static char *smime_extract_signer_certificate (char *infile)
   mutt_mktemp (certfile);
   if ((fpout = safe_fopen (certfile, "w+")) == NULL)
   {
   mutt_mktemp (certfile);
   if ((fpout = safe_fopen (certfile, "w+")) == NULL)
   {
-    fclose (fperr);
+    safe_fclose (&fperr);
     mutt_perror (certfile);
     return NULL;
   }
     mutt_perror (certfile);
     return NULL;
   }
@@ -1052,8 +1050,8 @@ static char *smime_extract_signer_certificate (char *infile)
                               SmimeGetSignerCertCommand))== -1)
   {
     mutt_any_key_to_continue (_("Error: unable to create OpenSSL subprocess!"));
                               SmimeGetSignerCertCommand))== -1)
   {
     mutt_any_key_to_continue (_("Error: unable to create OpenSSL subprocess!"));
-    fclose (fperr);
-    fclose (fpout);
+    safe_fclose (&fperr);
+    safe_fclose (&fpout);
     mutt_unlink (pk7out);
     mutt_unlink (certfile);
     return NULL;
     mutt_unlink (pk7out);
     mutt_unlink (certfile);
     return NULL;
@@ -1071,14 +1069,14 @@ static char *smime_extract_signer_certificate (char *infile)
     mutt_endwin (NULL);
     mutt_copy_stream (fperr, stdout);
     mutt_any_key_to_continue (NULL);
     mutt_endwin (NULL);
     mutt_copy_stream (fperr, stdout);
     mutt_any_key_to_continue (NULL);
-    fclose (fpout);
-    fclose (fperr);
+    safe_fclose (&fpout);
+    safe_fclose (&fperr);
     mutt_unlink (certfile);
     return NULL;
   }
 
     mutt_unlink (certfile);
     return NULL;
   }
 
-  fclose (fpout);
-  fclose (fperr);
+  safe_fclose (&fpout);
+  safe_fclose (&fperr);
 
   return safe_strdup (certfile);
 }
 
   return safe_strdup (certfile);
 }
@@ -1105,7 +1103,7 @@ void smime_invoke_import (char *infile, char *mailbox)
   mutt_mktemp (tmpfname);
   if ((fpout = safe_fopen (tmpfname, "w+")) == NULL)
   {
   mutt_mktemp (tmpfname);
   if ((fpout = safe_fopen (tmpfname, "w+")) == NULL)
   {
-    fclose (fperr);
+    safe_fclose (&fperr);
     mutt_perror (tmpfname);
     return;
   }
     mutt_perror (tmpfname);
     return;
   }
@@ -1131,7 +1129,7 @@ void smime_invoke_import (char *infile, char *mailbox)
     }
     fputs (buf, smimein);
     fputc ('\n', smimein);
     }
     fputs (buf, smimein);
     fputc ('\n', smimein);
-    fclose(smimein);
+    safe_fclose (&smimein);
 
     mutt_wait_filter (thepid);
   
 
     mutt_wait_filter (thepid);
   
@@ -1147,8 +1145,8 @@ void smime_invoke_import (char *infile, char *mailbox)
   mutt_copy_stream (fpout, stdout);
   mutt_copy_stream (fperr, stdout);
 
   mutt_copy_stream (fpout, stdout);
   mutt_copy_stream (fperr, stdout);
 
-  fclose (fpout);
-  fclose (fperr);
+  safe_fclose (&fpout);
+  safe_fclose (&fperr);
 
 }
 
 
 }
 
@@ -1175,7 +1173,7 @@ int smime_verify_sender(HEADER *h)
     mutt_copy_message (fpout, Context, h, 0, 0);
 
   fflush(fpout);
     mutt_copy_message (fpout, Context, h, 0, 0);
 
   fflush(fpout);
-  fclose (fpout);
+  safe_fclose (&fpout);
 
   if (h->env->from)
   {
 
   if (h->env->from)
   {
@@ -1276,7 +1274,7 @@ BODY *smime_build_smime_entity (BODY *a, char *certlist)
   if ((smimeerr = safe_fopen (smimeerrfile, "w+")) == NULL)
   {
     mutt_perror (smimeerrfile);
   if ((smimeerr = safe_fopen (smimeerrfile, "w+")) == NULL)
   {
     mutt_perror (smimeerrfile);
-    fclose (fpout);
+    safe_fclose (&fpout);
     mutt_unlink (tempfile);
     return NULL;
   }
     mutt_unlink (tempfile);
     return NULL;
   }
@@ -1287,8 +1285,8 @@ BODY *smime_build_smime_entity (BODY *a, char *certlist)
   {
     mutt_perror (smimeinfile);
     mutt_unlink (tempfile);
   {
     mutt_perror (smimeinfile);
     mutt_unlink (tempfile);
-    fclose (fpout);
-    fclose (smimeerr);
+    safe_fclose (&fpout);
+    safe_fclose (&smimeerr);
     return NULL;
   }
 
     return NULL;
   }
 
@@ -1310,20 +1308,20 @@ BODY *smime_build_smime_entity (BODY *a, char *certlist)
   mutt_write_mime_header (a, fptmp);
   fputc ('\n', fptmp);
   mutt_write_mime_body (a, fptmp);
   mutt_write_mime_header (a, fptmp);
   fputc ('\n', fptmp);
   mutt_write_mime_body (a, fptmp);
-  fclose (fptmp);
+  safe_fclose (&fptmp);
 
   if ((thepid =
        smime_invoke_encrypt (&smimein, NULL, NULL, -1,
                             fileno (fpout), fileno (smimeerr),
                             smimeinfile, certfile)) == -1)
   {
 
   if ((thepid =
        smime_invoke_encrypt (&smimein, NULL, NULL, -1,
                             fileno (fpout), fileno (smimeerr),
                             smimeinfile, certfile)) == -1)
   {
-    fclose (smimeerr);
+    safe_fclose (&smimeerr);
     mutt_unlink (smimeinfile);
     mutt_unlink (certfile);
     return (NULL);
   }
 
     mutt_unlink (smimeinfile);
     mutt_unlink (certfile);
     return (NULL);
   }
 
-  fclose (smimein);
+  safe_fclose (&smimein);
   
   mutt_wait_filter (thepid);
   mutt_unlink (smimeinfile);
   
   mutt_wait_filter (thepid);
   mutt_unlink (smimeinfile);
@@ -1332,7 +1330,7 @@ BODY *smime_build_smime_entity (BODY *a, char *certlist)
   fflush (fpout);
   rewind (fpout);
   empty = (fgetc (fpout) == EOF);
   fflush (fpout);
   rewind (fpout);
   empty = (fgetc (fpout) == EOF);
-  fclose (fpout);
+  safe_fclose (&fpout);
  
   fflush (smimeerr);
   rewind (smimeerr);
  
   fflush (smimeerr);
   rewind (smimeerr);
@@ -1341,7 +1339,7 @@ BODY *smime_build_smime_entity (BODY *a, char *certlist)
     err = 1;
     fputs (buf, stdout);
   }
     err = 1;
     fputs (buf, stdout);
   }
-  fclose (smimeerr);
+  safe_fclose (&smimeerr);
 
   /* pause if there is any error output from SMIME */
   if (err)
 
   /* pause if there is any error output from SMIME */
   if (err)
@@ -1386,6 +1384,13 @@ BODY *smime_sign_message (BODY *a )
   pid_t thepid;
   char *intermediates = smime_get_field_from_db(NULL, SmimeDefaultKey, 1, 1);
 
   pid_t thepid;
   char *intermediates = smime_get_field_from_db(NULL, SmimeDefaultKey, 1, 1);
 
+  if (!SmimeDefaultKey)
+  {
+    mutt_error _("Can't sign: No key specified. Use Sign As.");
+    FREE (&intermediates);
+    return NULL;
+  }
+
   if (!intermediates)
   {
     mutt_message(_("Warning: Intermediate certificate not found."));
   if (!intermediates)
   {
     mutt_message(_("Warning: Intermediate certificate not found."));
@@ -1398,6 +1403,8 @@ BODY *smime_sign_message (BODY *a )
   if ((sfp = safe_fopen (filetosign, "w+")) == NULL)
   {
     mutt_perror (filetosign);
   if ((sfp = safe_fopen (filetosign, "w+")) == NULL)
   {
     mutt_perror (filetosign);
+    if (intermediates != SmimeDefaultKey)
+      FREE (&intermediates);
     return NULL;
   }
 
     return NULL;
   }
 
@@ -1405,15 +1412,17 @@ BODY *smime_sign_message (BODY *a )
   if ((smimeout = safe_fopen (signedfile, "w+")) == NULL)
   {
     mutt_perror (signedfile);
   if ((smimeout = safe_fopen (signedfile, "w+")) == NULL)
   {
     mutt_perror (signedfile);
-    fclose (sfp);
+    safe_fclose (&sfp);
     mutt_unlink (filetosign);
     mutt_unlink (filetosign);
+    if (intermediates != SmimeDefaultKey)
+      FREE (&intermediates);
     return NULL;
   }
   
   mutt_write_mime_header (a, sfp);
   fputc ('\n', sfp);
   mutt_write_mime_body (a, sfp);
     return NULL;
   }
   
   mutt_write_mime_header (a, sfp);
   fputc ('\n', sfp);
   mutt_write_mime_body (a, sfp);
-  fclose (sfp);
+  safe_fclose (&sfp);
 
   
 
 
   
 
@@ -1432,14 +1441,16 @@ BODY *smime_sign_message (BODY *a )
                                 -1, fileno (smimeout), -1, filetosign)) == -1)
   {
     mutt_perror _("Can't open OpenSSL subprocess!");
                                 -1, fileno (smimeout), -1, filetosign)) == -1)
   {
     mutt_perror _("Can't open OpenSSL subprocess!");
-    fclose (smimeout);
+    safe_fclose (&smimeout);
     mutt_unlink (signedfile);
     mutt_unlink (filetosign);
     mutt_unlink (signedfile);
     mutt_unlink (filetosign);
+    if (intermediates != SmimeDefaultKey)
+      FREE (&intermediates);
     return NULL;
   }
   fputs (SmimePass, smimein);
   fputc ('\n', smimein);
     return NULL;
   }
   fputs (SmimePass, smimein);
   fputc ('\n', smimein);
-  fclose (smimein);
+  safe_fclose (&smimein);
   
 
   mutt_wait_filter (thepid);
   
 
   mutt_wait_filter (thepid);
@@ -1453,13 +1464,13 @@ BODY *smime_sign_message (BODY *a )
     err = 1;
     fputs (buffer, stdout);
   }
     err = 1;
     fputs (buffer, stdout);
   }
-  fclose (smimeerr);
+  safe_fclose (&smimeerr);
 
 
   fflush (smimeout);
   rewind (smimeout);
   empty = (fgetc (smimeout) == EOF);
 
 
   fflush (smimeout);
   rewind (smimeout);
   empty = (fgetc (smimeout) == EOF);
-  fclose (smimeout);
+  safe_fclose (&smimeout);
 
   mutt_unlink (filetosign);
   
 
   mutt_unlink (filetosign);
   
@@ -1580,7 +1591,7 @@ int smime_verify_one (BODY *sigbdy, STATE *s, const char *tempfile)
 
   sigbdy->length = ftello (s->fpout);
   sigbdy->offset = 0;
 
   sigbdy->length = ftello (s->fpout);
   sigbdy->offset = 0;
-  fclose (s->fpout);
+  safe_fclose (&s->fpout);
 
   /* restore final destination and substitute the tempfile for input */
   s->fpout = fp;
 
   /* restore final destination and substitute the tempfile for input */
   s->fpout = fp;
@@ -1608,7 +1619,7 @@ int smime_verify_one (BODY *sigbdy, STATE *s, const char *tempfile)
                                   tempfile, signedfile, 0)) != -1)
   {
     fflush (smimeout);
                                   tempfile, signedfile, 0)) != -1)
   {
     fflush (smimeout);
-    fclose (smimeout);
+    safe_fclose (&smimeout);
       
     if (mutt_wait_filter (thepid))
       badsig = -1;
       
     if (mutt_wait_filter (thepid))
       badsig = -1;
@@ -1621,7 +1632,7 @@ int smime_verify_one (BODY *sigbdy, STATE *s, const char *tempfile)
       fflush (smimeerr);
       rewind (smimeerr);
       
       fflush (smimeerr);
       rewind (smimeerr);
       
-      line = mutt_read_line (line, &linelen, smimeerr, &lineno);
+      line = mutt_read_line (line, &linelen, smimeerr, &lineno, 0);
       if (linelen && !ascii_strcasecmp (line, "verification successful"))
        badsig = 0;
 
       if (linelen && !ascii_strcasecmp (line, "verification successful"))
        badsig = 0;
 
@@ -1632,7 +1643,7 @@ int smime_verify_one (BODY *sigbdy, STATE *s, const char *tempfile)
   fflush (smimeerr);
   rewind (smimeerr);
   mutt_copy_stream (smimeerr, s->fpout);
   fflush (smimeerr);
   rewind (smimeerr);
   mutt_copy_stream (smimeerr, s->fpout);
-  fclose (smimeerr);
+  safe_fclose (&smimeerr);
     
   state_attach_puts (_("[-- End of OpenSSL output --]\n\n"), s);
   
     
   state_attach_puts (_("[-- End of OpenSSL output --]\n\n"), s);
   
@@ -1643,7 +1654,7 @@ int smime_verify_one (BODY *sigbdy, STATE *s, const char *tempfile)
   sigbdy->offset = tmpoffset;
   
   /* restore the original source stream */
   sigbdy->offset = tmpoffset;
   
   /* restore the original source stream */
-  fclose (s->fpin);
+  safe_fclose (&s->fpin);
   s->fpin = fp;
   
 
   s->fpin = fp;
   
 
@@ -1688,7 +1699,7 @@ static BODY *smime_handle_entity (BODY *m, STATE *s, FILE *outFile)
   if ((smimeerr = safe_fopen (errfile, "w+")) == NULL)
   {
     mutt_perror (errfile);
   if ((smimeerr = safe_fopen (errfile, "w+")) == NULL)
   {
     mutt_perror (errfile);
-    fclose (smimeout); smimeout = NULL;
+    safe_fclose (&smimeout); smimeout = NULL;
     return NULL;
   }
   mutt_unlink (errfile);
     return NULL;
   }
   mutt_unlink (errfile);
@@ -1698,8 +1709,8 @@ static BODY *smime_handle_entity (BODY *m, STATE *s, FILE *outFile)
   if ((tmpfp = safe_fopen (tmpfname, "w+")) == NULL)
   {
     mutt_perror (tmpfname);
   if ((tmpfp = safe_fopen (tmpfname, "w+")) == NULL)
   {
     mutt_perror (tmpfname);
-    fclose (smimeout); smimeout = NULL;
-    fclose (smimeerr); smimeerr = NULL;
+    safe_fclose (&smimeout); smimeout = NULL;
+    safe_fclose (&smimeerr); smimeerr = NULL;
     return NULL;
   }
 
     return NULL;
   }
 
@@ -1709,13 +1720,13 @@ static BODY *smime_handle_entity (BODY *m, STATE *s, FILE *outFile)
   mutt_copy_bytes (s->fpin, tmpfp,  m->length);
 
   fflush (tmpfp);
   mutt_copy_bytes (s->fpin, tmpfp,  m->length);
 
   fflush (tmpfp);
-  fclose (tmpfp);
+  safe_fclose (&tmpfp);
 
   if ((type & ENCRYPT) &&
       (thepid = smime_invoke_decrypt (&smimein, NULL, NULL, -1,
                                      fileno (smimeout),  fileno (smimeerr), tmpfname)) == -1)
   {
 
   if ((type & ENCRYPT) &&
       (thepid = smime_invoke_decrypt (&smimein, NULL, NULL, -1,
                                      fileno (smimeout),  fileno (smimeerr), tmpfname)) == -1)
   {
-    fclose (smimeout); smimeout = NULL;
+    safe_fclose (&smimeout); smimeout = NULL;
     mutt_unlink (tmpfname);
     if (s->flags & M_DISPLAY)
       state_attach_puts (_("[-- Error: unable to create OpenSSL subprocess! --]\n"), s);
     mutt_unlink (tmpfname);
     if (s->flags & M_DISPLAY)
       state_attach_puts (_("[-- Error: unable to create OpenSSL subprocess! --]\n"), s);
@@ -1726,7 +1737,7 @@ static BODY *smime_handle_entity (BODY *m, STATE *s, FILE *outFile)
                                          fileno (smimeout), fileno (smimeerr), NULL,
                                          tmpfname, SIGNOPAQUE)) == -1)
   {
                                          fileno (smimeout), fileno (smimeerr), NULL,
                                          tmpfname, SIGNOPAQUE)) == -1)
   {
-    fclose (smimeout); smimeout = NULL;
+    safe_fclose (&smimeout); smimeout = NULL;
     mutt_unlink (tmpfname);
     if (s->flags & M_DISPLAY)
       state_attach_puts (_("[-- Error: unable to create OpenSSL subprocess! --]\n"), s);
     mutt_unlink (tmpfname);
     if (s->flags & M_DISPLAY)
       state_attach_puts (_("[-- Error: unable to create OpenSSL subprocess! --]\n"), s);
@@ -1742,7 +1753,7 @@ static BODY *smime_handle_entity (BODY *m, STATE *s, FILE *outFile)
     fputc ('\n', smimein);
   }
 
     fputc ('\n', smimein);
   }
 
-  fclose (smimein);
+  safe_fclose (&smimein);
        
   mutt_wait_filter (thepid);
   mutt_unlink (tmpfname);
        
   mutt_wait_filter (thepid);
   mutt_unlink (tmpfname);
@@ -1781,7 +1792,7 @@ static BODY *smime_handle_entity (BODY *m, STATE *s, FILE *outFile)
       if ((fpout = safe_fopen (tmptmpfname, "w+")) == NULL)
       {
        mutt_perror(tmptmpfname);
       if ((fpout = safe_fopen (tmptmpfname, "w+")) == NULL)
       {
        mutt_perror(tmptmpfname);
-       fclose (smimeout); smimeout = NULL;
+       safe_fclose (&smimeout); smimeout = NULL;
        return NULL;
       }
     }
        return NULL;
       }
     }
@@ -1815,13 +1826,13 @@ static BODY *smime_handle_entity (BODY *m, STATE *s, FILE *outFile)
       }
       
     }
       }
       
     }
-    fclose (smimeout);
+    safe_fclose (&smimeout);
     smimeout = NULL;
     mutt_unlink (outfile);
 
     if (!outFile)
     {
     smimeout = NULL;
     mutt_unlink (outfile);
 
     if (!outFile)
     {
-      fclose (fpout);
+      safe_fclose (&fpout);
       mutt_unlink (tmptmpfname);
     }
     fpout = NULL;
       mutt_unlink (tmptmpfname);
     }
     fpout = NULL;
@@ -1843,7 +1854,7 @@ static BODY *smime_handle_entity (BODY *m, STATE *s, FILE *outFile)
     
     rewind (smimeerr);
     
     
     rewind (smimeerr);
     
-    line = mutt_read_line (line, &linelen, smimeerr, &lineno);
+    line = mutt_read_line (line, &linelen, smimeerr, &lineno, 0);
     if (linelen && !ascii_strcasecmp (line, "verification successful"))
       m->goodsig = 1;
     FREE (&line);
     if (linelen && !ascii_strcasecmp (line, "verification successful"))
       m->goodsig = 1;
     FREE (&line);
@@ -1853,7 +1864,7 @@ static BODY *smime_handle_entity (BODY *m, STATE *s, FILE *outFile)
     m->goodsig = p->goodsig;
     m->badsig  = p->badsig;
   }
     m->goodsig = p->goodsig;
     m->badsig  = p->badsig;
   }
-  fclose (smimeerr);
+  safe_fclose (&smimeerr);
 
   return (p);
 }
 
   return (p);
 }
@@ -2023,12 +2034,17 @@ int smime_send_menu (HEADER *msg, int *redraw)
   case 2: /* (s)ign */
       
     if(!SmimeDefaultKey)
   case 2: /* (s)ign */
       
     if(!SmimeDefaultKey)
-       mutt_message _("Can't sign: No key specified. Use Sign As.");
-    else
     {
     {
-      msg->security |= SIGN;
-      msg->security &= ~ENCRYPT;
+      *redraw = REDRAW_FULL;
+
+      if ((p = smime_ask_for_key (_("Sign as: "), NULL, 0)))
+        mutt_str_replace (&SmimeDefaultKey, p);
+      else
+        break;
     }
     }
+
+    msg->security |= SIGN;
+    msg->security &= ~ENCRYPT;
     break;
 
   case 4: /* sign (a)s */
     break;
 
   case 4: /* sign (a)s */