Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37749711
en ru br
Репозитории ALT
S:2.1.1.0.3.g6c0f75cca-alt1
5.1: 1.4.2.3-alt3
4.1: 1.4.2.3-alt1
4.0: 1.4.2.3-alt1
3.0: 1.4.2.1i-alt4
www.altlinux.org/Changes

Группа :: Сети/Почта
Пакет: mutt

 Главная   Изменения   Спек   Патчи   Sources   Загрузить   Gear   Bugs and FR  Repocop 

Патч: mutt-1.4.2.1-owl-tmp.patch
Скачать


--- mutt-1.4.2.1/imap/message.c.orig	Sun Apr  7 21:19:57 2002
+++ mutt-1.4.2.1/imap/message.c	Thu Feb 12 14:32:44 2004
@@ -78,8 +78,7 @@
 
   /* instead of downloading all headers and then parsing them, we parse them
    * as they come in. */
-  mutt_mktemp (tempfile);
-  if (!(fp = safe_fopen (tempfile, "w+")))
+  if (!(fp = mutt_mktempfile (tempfile, sizeof (tempfile), "w+")))
   {
     mutt_error (_("Could not create temporary file %s"), tempfile);
     mutt_sleep (2);
@@ -250,13 +249,11 @@
     mutt_message _("Fetching message...");
 
   cache->uid = HEADER_DATA(h)->uid;
-  mutt_mktemp (path);
-  cache->path = safe_strdup (path);
-  if (!(msg->fp = safe_fopen (path, "w+")))
+  if (!(msg->fp = mutt_mktempfile (path, sizeof (path), "w+")))
   {
-    safe_free ((void**) &cache->path);
     return -1;
   }
+  cache->path = safe_strdup (path);
 
   /* mark this header as currently inactive so the command handler won't
    * also try to update it. HACK until all this code can be moved into the
--- mutt-1.4.2.1/attach.c.orig	Mon Sep  9 19:24:44 2002
+++ mutt-1.4.2.1/attach.c	Thu Feb 12 14:32:44 2004
@@ -54,15 +54,13 @@
 
   snprintf(type, sizeof(type), "%s/%s", TYPE(a), a->subtype);
   rfc1524_mailcap_lookup(a, type, entry, 0);
-  rfc1524_expand_filename(entry->nametemplate, a->filename, 
-			  tempfile, sizeof(tempfile));
+  rfc1524_expand_tofile(entry->nametemplate, a->filename,
+			  tempfile, sizeof(tempfile), &fpout, "w");
   
   rfc1524_free_entry(&entry);
-
   if(stat(a->filename, &st) == -1)
     return -1;
-
-  if((fpin = fopen(a->filename, "r")) && (fpout = safe_fopen(tempfile, "w")))  /* __FOPEN_CHECKED__ */
+  if((fpin = fopen(a->filename, "r")) && fpout)  /* __FOPEN_CHECKED__ */
   {
     mutt_copy_stream (fpin, fpout);
     mutt_str_replace (&a->filename, tempfile);
@@ -108,10 +106,12 @@
 				  a->filename, newfile));
 	if (safe_symlink (a->filename, newfile) == -1)
 	{
-	  if (!mutt_yesorno (_("Can't match nametemplate, continue?"), 1))
+	  if (!mutt_yesorno (_("Can't match nametemplate (temporary file error), continue?"), 1))
 	    goto bailout;
+      strfcpy (newfile, a->filename, sizeof (newfile));
 	}
-	unlink_newfile = 1;
+    else
+      unlink_newfile = 1;
       }
       else
 	strfcpy(newfile, a->filename, sizeof(newfile));
@@ -166,8 +166,7 @@
 	    /* Remove headers by copying out data to another file, then 
 	     * copying the file back */
 	    fseek (fp, b->offset, 0);
-	    mutt_mktemp (tempfile);
-	    if ((tfp = safe_fopen (tempfile, "w")) == NULL)
+	    if ((tfp = mutt_mktempfile (tempfile, sizeof (tempfile), "w")) == NULL)
 	    {
 	      mutt_perror _("Failure to open file to strip headers.");
 	      goto bailout;
@@ -175,9 +174,13 @@
 	    mutt_copy_stream (fp, tfp);
 	    fclose (fp);
 	    fclose (tfp);
-	    mutt_unlink (a->filename);  
-	    mutt_rename_file (tempfile, a->filename); 
-
+	  /* XXX: mutt_rename_file RACE */
+	    mutt_unlink (a->filename);
+        if (mutt_rename_file (tempfile, a->filename))
+        {
+          mutt_error ("Failure writing attachment. Content in %s", tempfile);
+          goto bailout;
+        }
 	    mutt_free_body (&b);
 	  }
 	}
@@ -235,10 +238,12 @@
 				  a->filename, newfile));
 	if (safe_symlink (a->filename, newfile) == -1)
 	{
-	  if (!mutt_yesorno (_("Can't match nametemplate, continue?"), 1))
+	  if (!mutt_yesorno (_("Can't match nametemplate (temporary file error), continue?"), 1))
 	    goto bailout;
+      strfcpy(newfile, a->filename, sizeof(newfile));
 	}
-	unlink_newfile = 1;
+    else
+      unlink_newfile = 1;
       }
       else
 	strfcpy(newfile, a->filename, sizeof(newfile));
@@ -363,6 +368,8 @@
 {
   char tempfile[_POSIX_PATH_MAX] = "";
   char pagerfile[_POSIX_PATH_MAX] = "";
+  FILE *tmpf = NULL;
+  FILE *pagerf = NULL;
   int is_message;
   int use_mailcap;
   int use_pipe = 0;
@@ -404,6 +411,8 @@
   
   if (use_mailcap)
   {
+    int rfc1524_expand;
+	
     if (!entry->command)
     {
       mutt_error _("MIME type not defined.  Cannot view attachment.");
@@ -419,15 +428,22 @@
     else
       fname = a->filename;
 
-    if (rfc1524_expand_filename (entry->nametemplate, fname,
-				 tempfile, sizeof (tempfile)))
+	if (fp)
+      rfc1524_expand = rfc1524_expand_tofile(entry->nametemplate, fname,
+			  tempfile, sizeof(tempfile), &tmpf, "w");
+    else
+      rfc1524_expand = rfc1524_expand_filename (entry->nametemplate, fname,
+			  tempfile, sizeof (tempfile));
+
+    if (rfc1524_expand)
     {
       if (fp == NULL && mutt_strcmp(tempfile, a->filename))
       {
 	/* send case: the file is already there */
+		  /* XXX: Error checking */
 	if (safe_symlink (a->filename, tempfile) == -1)
 	{
-	  if (mutt_yesorno (_("Can't match nametemplate, continue?"), 1) == M_YES)
+	  if (mutt_yesorno (_("Can't match nametemplate (temporary file error), continue?"), 1) == M_YES)
 	    strfcpy (tempfile, a->filename, sizeof (tempfile));
 	  else
 	    goto return_error;
@@ -443,7 +459,7 @@
     {
       /* recv case: we need to save the attachment to a file */
       FREE (&fname);
-      if (mutt_save_attachment (fp, a, tempfile, 0, NULL) == -1)
+      if (mutt_save_attachment_file (fp, a, tmpf, 0) == -1)
 	goto return_error;
     }
 
@@ -458,10 +474,10 @@
     {
       /* recv case */
       strfcpy (pagerfile, a->filename, sizeof (pagerfile));
-      mutt_adv_mktemp (pagerfile, sizeof(pagerfile));
+      pagerf = mutt_adv_mktempfile (pagerfile, sizeof(pagerfile), "w");
     }
     else
-      mutt_mktemp (pagerfile);
+      pagerf = mutt_mktempfile (pagerfile, sizeof (pagerfile), "w");
   }
     
   if (use_mailcap)
@@ -474,15 +490,15 @@
 
     if (use_pager || use_pipe)
     {
-      if (use_pager && ((pagerfd = safe_open (pagerfile, O_CREAT | O_EXCL | O_WRONLY)) == -1))
+      if (use_pager && ((pagerf == NULL) || ((pagerfd = fileno(pagerf)) == -1)))
       {
 	mutt_perror ("open");
 	goto return_error;
       }
-      if (use_pipe && ((tempfd = open (tempfile, 0)) == -1))
+      if (use_pipe && ((tempfd = open (tempfile, O_RDONLY)) == -1))
       {
-	if(pagerfd != -1)
-	  close(pagerfd);
+	if(pagerf)
+	  fclose(pagerf);
 	mutt_perror ("open");
 	goto return_error;
       }
@@ -490,8 +506,8 @@
       if ((thepid = mutt_create_filter_fd (command, NULL, NULL, NULL,
 					   use_pipe ? tempfd : -1, use_pager ? pagerfd : -1, -1)) == -1)
       {
-	if(pagerfd != -1)
-	  close(pagerfd);
+	if(pagerf)
+	  fclose(pagerf);
 	
 	if(tempfd != -1)
 	  close(tempfd);
@@ -516,7 +532,7 @@
 	mutt_any_key_to_continue (NULL);
       
       close(tempfd);
-      close(pagerfd);
+      fclose(pagerf);
       
     }
     else
@@ -534,7 +550,7 @@
     if (flag == M_AS_TEXT)
     {
       /* just let me see the raw data */
-      if (mutt_save_attachment (fp, a, pagerfile, 0, NULL))
+      if (mutt_save_attachment_file (fp, a, pagerf, 0))
 	goto return_error;
     }
     else
@@ -542,7 +558,7 @@
       /* Use built-in handler */
       set_option (OPTVIEWATTACH); /* disable the "use 'v' to view this part"
 				   * message in case of error */
-      if (mutt_decode_save_attachment (fp, a, pagerfile, M_DISPLAY, 0))
+      if (mutt_decode_save_attachment_file (fp, a, pagerf, M_DISPLAY, 0))
       {
 	unset_option (OPTVIEWATTACH);
 	goto return_error;
@@ -575,6 +591,8 @@
 
     rc = mutt_do_pager (descrip, pagerfile,
 			M_PAGER_ATTACHMENT | (is_message ? M_PAGER_MESSAGE : 0), &info);
+    /* mutt_do_pager mutt_unlinks pagerfile, don't do it twice */
+    pagerfile[0] = '\0';
   }
   else
     rc = 0;
@@ -595,18 +613,14 @@
 }
 
 /* returns 1 on success, 0 on error */
-int mutt_pipe_attachment (FILE *fp, BODY *b, const char *path, char *outfile)
+int mutt_pipe_attachment (FILE *fp, BODY *b, const char *path, FILE *outf)
 {
   pid_t thepid;
   int out = -1;
   int rv = 0;
   
-  if (outfile && *outfile)
-    if ((out = safe_open (outfile, O_CREAT | O_EXCL | O_WRONLY)) < 0)
-    {
-      mutt_perror ("open");
-      return 0;
-    }
+  if (outf)
+    out = fileno (outf);
 
   mutt_endwin (NULL);
 
@@ -618,7 +632,7 @@
 
     memset (&s, 0, sizeof (STATE));
 
-    if (outfile && *outfile)
+    if (outf && (out != -1))
       thepid = mutt_create_filter_fd (path, &s.fpout, NULL, NULL, -1, out, -1);
     else
       thepid = mutt_create_filter (path, &s.fpout, NULL, NULL);
@@ -642,15 +656,14 @@
     if ((ifp = fopen (b->filename, "r")) == NULL)
     {
       mutt_perror ("fopen");
-      if (outfile && *outfile)
+      if (outf && (out != -1))
       {
-	close (out);
-	unlink (outfile);
+	fclose (outf);
       }
       return 0;
     }
 
-    if (outfile && *outfile)
+    if (outf && (out != -1))
       thepid = mutt_create_filter_fd (path, &ofp, NULL, NULL, -1, out, -1);
     else
       thepid = mutt_create_filter (path, &ofp, NULL, NULL);
@@ -671,8 +684,8 @@
   
 bail:
   
-  if (outfile && *outfile)
-    close (out);
+  if (outf)
+    fclose (outf);
 
   /*
    * check for error exit from child process
@@ -750,29 +763,64 @@
     {
       /* In recv mode, extract from folder and decode */
       
-      STATE s;
-      
-      memset (&s, 0, sizeof (s));
-      if ((s.fpout = mutt_save_attachment_open (path, flags)) == NULL)
+      FILE *tmpf;
+
+      if ((tmpf = mutt_save_attachment_open (path, flags)) == NULL)
       {
 	mutt_perror ("fopen");
 	return (-1);
       }
-      fseek ((s.fpin = fp), m->offset, 0);
-      mutt_decode_attachment (m, &s);
+      /* mutt_save_attachment_file closes tmpf */
+      return mutt_save_attachment_file (fp, m, tmpf, flags);
+    }
+  }
+  else
+  {
+    /* In send mode, just copy file */
+
+    FILE *nfp;
+
+    if ((nfp = mutt_save_attachment_open (path, flags)) == NULL)
+    {
+      mutt_perror ("fopen");
+      return (-1);
+    }
+    return mutt_save_attachment_file(fp, m, nfp, flags);
+  }
+
+  return 0;
+}
+
+/* Save attachment to tmpf */
+/* returns 0 on success, -1 on error */
+int mutt_save_attachment_file (FILE *fp, BODY *m, FILE *tmpf, int flags)
+{
+  if (fp)
+  {
+    /* In recv mode, extract from folder and decode */
       
-      if (fclose (s.fpout) != 0)
-      {
-	mutt_perror ("fclose");
-	return (-1);
-      }
+    STATE s;
+
+    memset (&s, 0, sizeof (s));
+    if ((s.fpout = tmpf) == NULL)
+    {
+      mutt_perror ("fopen");
+      return (-1);
+    }
+    fseek ((s.fpin = fp), m->offset, 0);
+    mutt_decode_attachment (m, &s);
+
+    if (fclose (s.fpout) != 0)
+    {
+      mutt_perror ("fclose");
+      return (-1);
     }
   }
   else
   {
     /* In send mode, just copy file */
 
-    FILE *ofp, *nfp;
+    FILE *ofp;
 
     if ((ofp = fopen (m->filename, "r")) == NULL)
     {
@@ -780,29 +828,29 @@
       return (-1);
     }
     
-    if ((nfp = mutt_save_attachment_open (path, flags)) == NULL)
+    if (tmpf == NULL)
     {
       mutt_perror ("fopen");
       safe_fclose (&ofp);
       return (-1);
     }
 
-    if (mutt_copy_stream (ofp, nfp) == -1)
+    if (mutt_copy_stream (ofp, tmpf) == -1)
     {
       mutt_error _("Write fault!");
       safe_fclose (&ofp);
-      safe_fclose (&nfp);
+      safe_fclose (&tmpf);
       return (-1);
     }
     safe_fclose (&ofp);
-    safe_fclose (&nfp);
+    safe_fclose (&tmpf);
   }
 
   return 0;
 }
 
 /* returns 0 on success, -1 on error */
-int mutt_decode_save_attachment (FILE *fp, BODY *m, char *path,
+int mutt_decode_save_attachment_file (FILE *fp, BODY *m, FILE *outf,
 				 int displaying, int flags)
 {
   STATE s;
@@ -813,18 +861,12 @@
   memset (&s, 0, sizeof (s));
   s.flags = displaying;
 
-  if (flags == M_SAVE_APPEND)
-    s.fpout = fopen (path, "a");
-  else if (flags == M_SAVE_OVERWRITE)
-    s.fpout = fopen (path, "w");	/* __FOPEN_CHECKED__ */
-  else
-    s.fpout = safe_fopen (path, "w");
-
-  if (s.fpout == NULL)
+  if (outf == NULL)
   {
     mutt_perror ("fopen");
     return (-1);
   }
+  s.fpout = outf;
 
   if (fp == NULL)
   {
@@ -905,19 +947,27 @@
     char command[_POSIX_PATH_MAX+STRING];
     rfc1524_entry *entry;
     int piped = FALSE;
+    int rfc1524_expand;
+    FILE *newf = NULL;
 
     dprint (2, (debugfile, "Using mailcap...\n"));
     
     entry = rfc1524_new_entry ();
     rfc1524_mailcap_lookup (a, type, entry, M_PRINT);
-    if (rfc1524_expand_filename (entry->nametemplate, a->filename,
-						  newfile, sizeof (newfile)))
+    if (fp)
+      rfc1524_expand = rfc1524_expand_tofile (entry->nametemplate, a->filename,
+			  newfile, sizeof (newfile), &newf, "w");
+    else
+      rfc1524_expand = rfc1524_expand_filename (entry->nametemplate,
+			  a->filename, newfile, sizeof (newfile));
+	
+    if (rfc1524_expand)
     {
       if (!fp)
       {
 	if (safe_symlink(a->filename, newfile) == -1)
 	{
-	  if (mutt_yesorno (_("Can't match nametemplate, continue?"), 1) != M_YES)
+	  if (mutt_yesorno (_("Can't match nametemplate (temporary file error), continue?"), 1) != M_YES)
 	  {
 	    rfc1524_free_entry (&entry);
 	    return 0;
@@ -931,7 +981,16 @@
 
     /* in recv mode, save file to newfile first */
     if (fp)
-      mutt_save_attachment (fp, a, newfile, 0, NULL);
+    {
+      if (mutt_save_attachment_file (fp, a, newf, 0) == -1)
+      {
+        mutt_perror("Can't write attachment to tempfile");
+        rfc1524_free_entry(&entry);
+        if (newf)
+          unlink (newfile);
+        return 0;
+      }
+    }
 
     strfcpy (command, entry->printcommand, sizeof (command));
     piped = rfc1524_expand_command (a, newfile, type, command, sizeof (command));
@@ -984,14 +1043,18 @@
   else if (mutt_can_decode (a))
   {
     /* decode and print */
-
+    FILE *tmpf;
     int rc = 0;
-    
+    int unlink_newfile = 0;
     ifp = NULL;
     fpout = NULL;
-    
-    mutt_mktemp (newfile);
-    if (mutt_decode_save_attachment (fp, a, newfile, M_PRINTING, 0) == 0)
+
+    if ((tmpf = mutt_mktempfile (newfile, sizeof (newfile), "w")) == NULL)
+	  goto bail0;
+
+    unlink_newfile = 1;
+
+    if (mutt_decode_save_attachment_file (fp, a, tmpf, M_PRINTING, 0) == 0)
     {
       
       dprint (2, (debugfile, "successfully decoded %s type attachment to %s\n",
@@ -1026,7 +1089,8 @@
   bail0:
     safe_fclose (&ifp);
     safe_fclose (&fpout);
-    mutt_unlink (newfile);
+    if (unlink_newfile)
+      mutt_unlink (newfile);
     return rc;
   }
   else
--- mutt-1.4.2.1/commands.c.orig	Wed Apr  3 10:55:49 2002
+++ mutt-1.4.2.1/commands.c	Thu Feb 12 14:32:44 2004
@@ -107,8 +107,7 @@
 
 #endif
 
-  mutt_mktemp (tempfile);
-  if ((fpout = safe_fopen (tempfile, "w")) == NULL)
+  if ((fpout = mutt_mktempfile (tempfile, sizeof (tempfile), "w")) == NULL)
   {
     mutt_error _("Could not create temporary file!");
     return (0);
--- mutt-1.4.2.1/editmsg.c.orig	Wed Jul 24 08:41:29 2002
+++ mutt-1.4.2.1/editmsg.c	Thu Feb 12 14:32:44 2004
@@ -59,19 +59,29 @@
 
   struct stat sb;
   time_t mtime = 0;
-  
-  mutt_mktemp (tmp);
+
+  /* XXX: Create the temporary file and reopen it w/out O_EXCL, this method
+   * has it's problems: see Zalewski's paper about tmp cleaners, but
+   * we call editor with the filename ... */
+  if ((fp = mutt_mktempfile (tmp, sizeof (tmp), "w")) == NULL)
+  {
+    mutt_perror ("could not create temporary folder");
+    return -1;
+  }
+  fclose (fp);
+  fp = NULL;
 
   omagic = DefaultMagic;
   DefaultMagic = M_MBOX;
-
-  rc = (mx_open_mailbox (tmp, M_NEWFOLDER, &tmpctx) == NULL) ? -1 : 0;
+  /* M_NEWFOLDER implies O_EXCL, so use M_APPEND here */
+  rc = (mx_open_mailbox (tmp, M_APPEND, &tmpctx) == NULL) ? -1 : 0;
 
   DefaultMagic = omagic;
 
   if (rc == -1)
   {
     mutt_error (_("could not create temporary folder: %s"), strerror (errno));
+    unlink (tmp);
     return -1;
   }
 
--- mutt-1.4.2.1/handler.c.orig	Tue Mar 26 09:49:51 2002
+++ mutt-1.4.2.1/handler.c	Thu Feb 12 14:32:44 2004
@@ -1504,9 +1504,18 @@
 
   fname = safe_strdup (a->filename);
   mutt_sanitize_filename (fname, 1);
-  rfc1524_expand_filename (entry->nametemplate, fname, tempfile, sizeof (tempfile));
+
+  rfc1524_expand_tofile(entry->nametemplate, fname, tempfile, sizeof(tempfile),
+		  &fpin, "w+");
   FREE (&fname);
 
+  if (!fpin)
+  {
+    mutt_perror ("rfc1524_expand_tofile");
+    rfc1524_free_entry(&entry);
+    return;
+  }
+
   if (entry->command)
   {
     strfcpy (command, entry->command, sizeof (command));
@@ -1521,13 +1530,6 @@
       mutt_message(_("Invoking autoview command: %s"),command);
     }
 
-    if ((fpin = safe_fopen (tempfile, "w+")) == NULL)
-    {
-      mutt_perror ("fopen");
-      rfc1524_free_entry (&entry);
-      return;
-    }
-    
     mutt_copy_bytes (s->fpin, fpin, a->length);
 
     if(!piped)
@@ -1611,6 +1613,10 @@
     if (s->flags & M_DISPLAY) 
       mutt_clear_error ();
   }
+  else if (fpin) {
+    mutt_unlink (tempfile);
+    safe_fclose (&fpin);
+  }
   rfc1524_free_entry (&entry);
 }
 
@@ -1871,8 +1877,7 @@
       {
 	/* decode to a tempfile, saving the original destination */
 	fp = s->fpout;
-	mutt_mktemp (tempfile);
-	if ((s->fpout = safe_fopen (tempfile, "w")) == NULL)
+	if ((s->fpout = mutt_mktempfile (tempfile, sizeof (tempfile), "w")) == NULL)
 	{
 	  mutt_error _("Unable to open temporary file!");
 	  goto bail;
--- mutt-1.4.2.1/headers.c.orig	Mon Nov  5 21:19:33 2001
+++ mutt-1.4.2.1/headers.c	Thu Feb 12 14:32:44 2004
@@ -42,10 +42,9 @@
   struct stat st;
   LIST *cur, **last = NULL, *tmp;
 
-  mutt_mktemp (path);
-  if ((ofp = safe_fopen (path, "w")) == NULL)
+  if ((ofp = mutt_mktempfile (path, sizeof (path), "w")) == NULL)
   {
-    mutt_perror (path);
+    mutt_perror ("mutt_mktempfile");
     return;
   }
 
--- mutt-1.4.2.1/help.c.orig	Sat Oct  7 18:06:24 2000
+++ mutt-1.4.2.1/help.c	Thu Feb 12 14:32:44 2004
@@ -312,17 +312,15 @@
   FILE *f;
   struct binding_t *funcs;
 
-  mutt_mktemp (t);
-
   funcs = km_get_table (menu);
   desc = mutt_getnamebyvalue (menu, Menus);
   if (!desc)
     desc = _("<UNKNOWN>");
   
   do {
-    if ((f = safe_fopen (t, "w")) == NULL)
+    if ((f = mutt_mktempfile (t, sizeof (t), "w")) == NULL)
     {
-      mutt_perror (t);
+      mutt_perror ("mutt_mktempfile");
       return;
     }
   
--- mutt-1.4.2.1/main.c.orig	Tue Jul 16 07:28:00 2002
+++ mutt-1.4.2.1/main.c	Thu Feb 12 14:32:44 2004
@@ -717,27 +717,25 @@
       else
 	fin = NULL;
 
-      mutt_mktemp (buf);
-      tempfile = safe_strdup (buf);
-
       if (draftFile)
 	msg->env = mutt_read_rfc822_header (fin, NULL, 1, 0);
 
       /* is the following if still needed? */
       
-      if (tempfile)
       {
 	FILE *fout;
 
-	if ((fout = safe_fopen (tempfile, "w")) == NULL)
+	if ((fout = mutt_mktempfile (buf, sizeof (buf), "w")) == NULL)
 	{
 	  if (!option (OPTNOCURSES))
 	    mutt_endwin (NULL);
-	  perror (tempfile);
+	  perror ("mutt_mktempfile");
 	  fclose (fin);
-	  FREE (&tempfile);
 	  exit (1);
 	}
+    else
+      tempfile = safe_strdup (buf);
+
 	if (fin)
 	  mutt_copy_stream (fin, fout);
 	else if (bodytext)
--- mutt-1.4.2.1/mbox.c.orig	Thu Feb 28 07:59:24 2002
+++ mutt-1.4.2.1/mbox.c	Thu Feb 12 14:32:44 2004
@@ -28,6 +28,7 @@
 #include "sort.h"
 #include "copy.h"
 
+#include <stdio.h>
 #include <sys/stat.h>
 #include <dirent.h>
 #include <string.h>
@@ -728,15 +729,8 @@
   }
 
   /* Create a temporary file to write the new version of the mailbox in. */
-  mutt_mktemp (tempfile);
-  if ((i = open (tempfile, O_WRONLY | O_EXCL | O_CREAT, 0600)) == -1 ||
-      (fp = fdopen (i, "w")) == NULL)
+  if ((fp = mutt_mktempfile (tempfile, sizeof (tempfile), "w")) == NULL)
   {
-    if (-1 != i)
-    {
-      close (i);
-      unlink (tempfile);
-    }
     mutt_error _("Could not create temporary file!");
     mutt_sleep (5);
     goto bail;
@@ -952,14 +946,29 @@
      */
     
     char savefile[_POSIX_PATH_MAX];
-    
-    snprintf (savefile, sizeof (savefile), "%s/mutt.%s-%s-%d",
-	      NONULL (Tempdir), NONULL(Username), NONULL(Hostname), getpid ());
-    rename (tempfile, savefile);
+    int maxattempts;
+
+    for (maxattempts=0; maxattempts < TMP_MAX; maxattempts++)
+    {
+      snprintf (savefile, sizeof (savefile), "%s/mutt.XXXXXX",
+	        NONULL (Tempdir));
+      if (mktemp(savefile) == NULL) {
+        mutt_error("Can't create temporary file '%s'", savefile);
+        break;
+	  }
+      if (rename (tempfile, savefile) == 0)
+      {
+        mutt_unblock_signals ();
+        mx_fastclose_mailbox (ctx);
+        mutt_pretty_mailbox (savefile);
+        mutt_error (_("Write failed!  Saved partial mailbox to %s"), savefile);
+        mutt_sleep (5);
+        return (-1);
+      }
+    }
     mutt_unblock_signals ();
     mx_fastclose_mailbox (ctx);
-    mutt_pretty_mailbox (savefile);
-    mutt_error (_("Write failed!  Saved partial mailbox to %s"), savefile);
+    mutt_error (_("Write failed!"));
     mutt_sleep (5);
     return (-1);
   }
--- mutt-1.4.2.1/muttlib.c.orig	Mon Mar 25 11:29:32 2002
+++ mutt-1.4.2.1/muttlib.c	Thu Feb 12 14:32:44 2004
@@ -34,6 +34,7 @@
 #include "pgp.h"
 #endif
 
+#include <stdio.h>
 #include <string.h>
 #include <ctype.h>
 #include <unistd.h>
@@ -97,12 +98,139 @@
   }
 }
 
+FILE *mutt_adv_mktempfile (char *s, size_t l, const char *mode)
+{
+  char buf[_POSIX_PATH_MAX];
+  char tmp[_POSIX_PATH_MAX];
+  char *period;
+  size_t sl;
+  int saved_errno;
+  FILE *tmpf = NULL;
+
+  strfcpy (buf, NONULL (Tempdir), sizeof (buf));
+  mutt_expand_path (buf, sizeof (buf));
+  if (s[0] == '\0')
+  {
+    int tmpfd;
+
+    snprintf (s, l, "%s/muttXXXXXX", buf);
+    if ((tmpfd = mkstemp (s)) == -1 || (tmpf = fdopen (tmpfd, mode)) == NULL)
+    {
+      if (tmpfd != -1) {
+        saved_errno = errno;
+        unlink (s);
+        close (tmpfd);
+        errno = saved_errno;
+      }
+      return NULL;
+   }
+    return tmpf;
+  }
+  else
+  {
+    int maxattempts;
+    int fd;
+
+    strfcpy (tmp, s, sizeof (tmp));
+    mutt_sanitize_filename (tmp, 1);
+    snprintf (s, l, "%s/%s", buf, tmp);
+    if ((fd = open (s, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR)) == -1 ||
+        (tmpf = fdopen (fd, mode)) == NULL)
+    {
+      if (fd != -1) {
+        unlink (s);
+        close (fd);
+      }
+    }
+    else
+      return tmpf;
+
+	  /* Kind of mkstemps: First use mktemp to create a 'unique' filename
+	   * then append the suffix to the filename and try to O_EXCL open it.
+	   * If the open call fails (file exists) then this code tries to
+	   * create the file TMP_MAX times before giving up.
+	   */
+    if ((period = strrchr (tmp, '.')) != NULL)
+      *period = 0;
+
+	if (period == NULL)
+    {
+      /* No suffix use plain mkstemp */
+      snprintf (s, l, "%s/%s.XXXXXX", buf, tmp);
+      if ((fd = mkstemp (s)) == -1 || (tmpf = fdopen (fd, mode)) == NULL)
+      {
+        if (fd != -1)
+        {
+          saved_errno = errno;
+          unlink (s);
+          close (fd);
+          errno = saved_errno;
+        }
+        return NULL;
+      }
+      else
+        return tmpf;
+    }
+
+    for (maxattempts = 0; maxattempts < TMP_MAX; maxattempts++)
+    {
+      snprintf (s, l, "%s/%s.XXXXXX", buf, tmp);
+#ifndef HAVE_MKSTEMPS
+	  if (mktemp (s) == NULL)
+        return NULL;
+#endif
+
+      if (period != NULL)
+      {
+        *period = '.';
+        sl = mutt_strlen (s);
+        strfcpy (s + sl, period, l - sl);
+
+#ifdef HAVE_MKSTEMPS
+        if ((fd = mkstemps (s, mutt_strlen (period))) == -1 ||
+				   (tmpf = fdopen (fd, mode)) == NULL)
+        {
+          if (fd != -1)
+          {
+            saved_errno = errno;
+            unlink (s);
+            close (fd);
+            errno = saved_errno;
+          }
+          return NULL;
+        }
+        else
+          return tmpf;
+#endif
+      }
+
+      if ((fd = open(s, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR)) != -1)
+      {
+        if ((tmpf = fdopen(fd, mode)) == NULL)
+        {
+          if (fd != -1)
+          {
+            unlink (s);
+            close (fd);
+          }
+        }
+        else
+          return tmpf;
+      }
+      else if (errno != EEXIST)
+	    return NULL; /* if error is not EEXIST this is not going to work?*/
+    }
+  }
+  return NULL;
+}
+
 /* create a send-mode duplicate from a receive-mode body */
 
 int mutt_copy_body (FILE *fp, BODY **tgt, BODY *src)
 {
   char tmp[_POSIX_PATH_MAX];
   BODY *b;
+  FILE *tmpf;
 
   PARAMETER *par, **ppar;
   
@@ -119,10 +247,15 @@
     tmp[0] = '\0';
   }
 
-  mutt_adv_mktemp (tmp, sizeof (tmp));
-  if (mutt_save_attachment (fp, src, tmp, 0, NULL) == -1)
+  if ((tmpf = mutt_adv_mktempfile (tmp, sizeof (tmp), "w")) == NULL)
     return -1;
-      
+
+  if (mutt_save_attachment_file (fp, src, tmpf, 0) == -1)
+  {
+    unlink (tmp);
+    return -1;
+  }
+
   *tgt = mutt_new_body ();
   b = *tgt;
 
@@ -654,10 +787,28 @@
   safe_free ((void **) p);
 }
 
-void mutt_mktemp (char *s)
+/* Create temporary file with mkstemp/fdopen. Places the filename
+ * in s and returns the opened file. Returns NULL if a temporary file
+ * can't be created. The FILE* is fdopened with mode.
+ */
+FILE *mutt_mktempfile(char *s, size_t l, const char *mode)
 {
-  snprintf (s, _POSIX_PATH_MAX, "%s/mutt-%s-%d-%d", NONULL (Tempdir), NONULL(Hostname), (int) getpid (), Counter++);
-  unlink (s);
+  int tmpfd;
+  FILE *fp;
+  int saved_errno;
+
+  snprintf (s, l, "%s/mutt.XXXXXX", NONULL(Tempdir));
+
+  if ((tmpfd = mkstemp (s)) == -1 || (fp = fdopen (tmpfd, mode)) == NULL) {
+    if (tmpfd != -1) {
+      saved_errno = errno;
+      unlink (s);
+      close (tmpfd);
+      errno = saved_errno;
+    }
+    return NULL;
+  }
+  return fp;
 }
 
 void mutt_free_alias (ALIAS **p)
--- mutt-1.4.2.1/mx.c.orig	Wed Mar 20 09:53:42 2002
+++ mutt-1.4.2.1/mx.c	Thu Feb 12 14:32:44 2004
@@ -1229,8 +1229,7 @@
 {
   char tmp[_POSIX_PATH_MAX];
 
-  mutt_mktemp(tmp);
-  if ((msg->fp = safe_fopen (tmp, "w")) == NULL)
+  if ((msg->fp = mutt_mktempfile (tmp, sizeof (tmp), "w")) == NULL)
     return (-1);
   msg->path = safe_strdup(tmp);
   return 0;
--- mutt-1.4.2.1/pattern.c.orig	Sat May 18 05:39:55 2002
+++ mutt-1.4.2.1/pattern.c	Thu Feb 12 14:32:44 2004
@@ -157,10 +157,9 @@
       memset (&s, 0, sizeof (s));
       s.fpin = msg->fp;
       s.flags = M_CHARCONV;
-      mutt_mktemp (tempfile);
-      if ((s.fpout = safe_fopen (tempfile, "w+")) == NULL)
+      if ((s.fpout = mutt_mktempfile (tempfile, sizeof (tempfile), "w+")) == NULL)
       {
-	mutt_perror (tempfile);
+	mutt_perror ("mutt_mktempfile");
 	return (0);
       }
 
--- mutt-1.4.2.1/pgp.c.orig	Wed Jan  9 15:39:28 2002
+++ mutt-1.4.2.1/pgp.c	Thu Feb 12 14:32:44 2004
@@ -317,17 +317,15 @@
 
 	/* invoke PGP */
 	
-	mutt_mktemp (outfile);
-	if ((pgpout = safe_fopen (outfile, "w+")) == NULL)
+	if ((pgpout = mutt_mktempfile (outfile, sizeof (outfile), "w+")) == NULL)
 	{
-	  mutt_perror (outfile);
+	  mutt_perror ("mutt_mktempfile");
 	  return;
 	}
 	
-	mutt_mktemp (tmpfname);
-	if ((tmpfp = safe_fopen (tmpfname, "w+")) == NULL)
+	if ((tmpfp = mutt_mktempfile (tmpfname, sizeof (tmpfname), "w+")) == NULL)
 	{
-	  mutt_perror (tmpfname);
+	  mutt_perror ("mutt_mktempfile");
 	  safe_fclose (&pgpout); 
 	  return;
 	}
@@ -482,7 +480,8 @@
   char tempfile[_POSIX_PATH_MAX];
   char buf[HUGE_STRING];
   FILE *tfp;
-  
+  FILE *tmpf;
+
   short sgn = 0;
   short enc = 0;
   
@@ -491,9 +490,11 @@
 
   if (tagged_only && !b->tagged)
     return 0;
-  
-  mutt_mktemp (tempfile);
-  if (mutt_decode_save_attachment (fp, b, tempfile, 0, 0) != 0)
+
+  if ((tmpf = mutt_mktempfile(tempfile, sizeof (tempfile), "w")) == NULL)
+	return 0;
+
+  if (mutt_decode_save_attachment_file (fp, b, tmpf, 0, 0) != 0)
   {
     unlink (tempfile);
     return 0;
@@ -651,16 +652,15 @@
   }
 }
 
-static int pgp_write_signed(BODY *a, STATE *s, const char *tempfile)
+static int pgp_write_signed(BODY *a, STATE *s, FILE *fp)
 {
-  FILE *fp;
   int c;
   short hadcr;
   size_t bytes;
 
-  if(!(fp = safe_fopen (tempfile, "w")))
+  if(!fp)
   {
-    mutt_perror(tempfile);
+    mutt_perror("Error: NULL signature file");
     return -1;
   }
       
@@ -700,12 +700,10 @@
   pid_t thepid;
   int badsig = -1;
   int rv;
-  
-  snprintf (sigfile, sizeof (sigfile), "%s.asc", tempfile);
-  
-  if(!(fp = safe_fopen (sigfile, "w")))
+
+  if(!(fp = mutt_mktempfile (sigfile, sizeof (sigfile), "w")))
   {
-    mutt_perror(sigfile);
+    mutt_perror("mutt_mktempfile");
     return -1;
   }
 	
@@ -713,10 +711,9 @@
   mutt_copy_bytes (s->fpin, fp, sigbdy->length);
   fclose (fp);
   
-  mutt_mktemp(pgperrfile);
-  if(!(pgperr = safe_fopen(pgperrfile, "w+")))
+  if(!(pgperr = mutt_mktempfile (pgperrfile, sizeof (pgperrfile), "w+")))
   {
-    mutt_perror(pgperrfile);
+    mutt_perror("mutt_mktempfile");
     unlink(sigfile);
     return -1;
   }
@@ -817,8 +814,10 @@
     
     if (sigcnt)
     {
-      mutt_mktemp (tempfile);
-      if (pgp_write_signed (a, s, tempfile) == 0)
+      FILE *tmpf = NULL;
+
+      tmpf = mutt_mktempfile (tempfile, sizeof (tempfile), "w");
+      if (pgp_write_signed (a, s, tmpf) == 0)
       {
 	for (i = 0; i < sigcnt; i++)
 	{
@@ -837,7 +836,8 @@
 	}
       }
       
-      mutt_unlink (tempfile);
+      if (tmpf)
+        mutt_unlink (tempfile);
 
       b->goodsig = goodsig;
       
@@ -877,10 +877,9 @@
       return;
   }
 
-  mutt_mktemp (tempfname);
-  if (!(fpout = safe_fopen (tempfname, "w")))
+  if (!(fpout = mutt_mktempfile (tempfname, sizeof (tempfname), "w")))
   {
-    mutt_perror (tempfname);
+    mutt_perror ("mutt_mktempfile");
     return;
   }
 
@@ -933,10 +932,9 @@
   FILE *tempfp;
   char tempfname[_POSIX_PATH_MAX];
 
-  mutt_mktemp (tempfname);
-  if (!(tempfp = safe_fopen (tempfname, "w")))
+  if (!(tempfp = mutt_mktempfile (tempfname, sizeof (tempfname), "w")))
   {
-    mutt_perror (tempfname);
+    mutt_perror ("mutt_mktempfile");
     return;
   }
 
@@ -989,18 +987,16 @@
   char pgptmpfile[_POSIX_PATH_MAX];
   pid_t thepid;
   
-  mutt_mktemp (pgperrfile);
-  if ((pgperr = safe_fopen (pgperrfile, "w+")) == NULL)
+  if ((pgperr = mutt_mktempfile (pgperrfile, sizeof (pgperrfile), "w+")) == NULL)
   {
-    mutt_perror (pgperrfile);
+    mutt_perror ("mutt_mktempfile");
     return NULL;
   }
   unlink (pgperrfile);
 
-  mutt_mktemp (pgptmpfile);
-  if((pgptmp = safe_fopen (pgptmpfile, "w")) == NULL)
+  if((pgptmp = mutt_mktempfile (pgptmpfile, sizeof (pgptmpfile), "w")) == NULL)
   {
-    mutt_perror (pgptmpfile);
+    mutt_perror ("mutt_mktempfile");
     fclose(pgperr);
     return NULL;
   }
@@ -1017,7 +1013,7 @@
 				    fileno (pgperr), pgptmpfile)) == -1)
   {
     fclose (pgperr);
-    unlink (pgptmpfile);
+    mutt_unlink (pgptmpfile);
     if (s->flags & M_DISPLAY)
       state_attach_puts (_("[-- Error: could not create a PGP subprocess! --]\n\n"), s);
     return (NULL);
@@ -1087,10 +1083,10 @@
   
   memset (&s, 0, sizeof (s));
   s.fpin = fpin;
-  mutt_mktemp (tempfile);
-  if ((*fpout = safe_fopen (tempfile, "w+")) == NULL)
+
+  if ((*fpout = mutt_mktempfile (tempfile, sizeof (tempfile), "w+")) == NULL)
   {
-    mutt_perror (tempfile);
+    mutt_perror ("mutt_mktempfile");
     return (-1);
   }
   unlink (tempfile);
@@ -1124,8 +1120,7 @@
    */
   a = a->next;
 
-  mutt_mktemp (tempfile);
-  if ((fpout = safe_fopen (tempfile, "w+")) == NULL)
+  if ((fpout = mutt_mktempfile (tempfile, sizeof (tempfile), "w+")) == NULL)
   {
     if (s->flags & M_DISPLAY)
       state_attach_puts (_("[-- Error: could not create temporary file! --]\n"), s);
@@ -1215,16 +1210,14 @@
   
   convert_to_7bit (a); /* Signed data _must_ be in 7-bit format. */
 
-  mutt_mktemp (sigfile);
-  if ((fp = safe_fopen (sigfile, "w")) == NULL)
+  if ((fp = mutt_mktempfile (sigfile, sizeof (sigfile), "w")) == NULL)
   {
     return (NULL);
   }
 
-  mutt_mktemp (signedfile);
-  if ((sfp = safe_fopen(signedfile, "w")) == NULL)
+  if ((sfp = mutt_mktempfile (signedfile, sizeof (signedfile), "w")) == NULL)
   {
-    mutt_perror(signedfile);
+    mutt_perror("mutt_mktempfile");
     fclose(fp);
     unlink(sigfile);
     return NULL;
@@ -1436,27 +1429,24 @@
   int empty;
   pid_t thepid;
   
-  mutt_mktemp (tempfile);
-  if ((fpout = safe_fopen (tempfile, "w+")) == NULL)
+  if ((fpout = mutt_mktempfile (tempfile, sizeof (tempfile), "w+")) == NULL)
   {
-    mutt_perror (tempfile);
+    mutt_perror ("mutt_mktempfile");
     return (NULL);
   }
 
-  mutt_mktemp (pgperrfile);
-  if ((pgperr = safe_fopen (pgperrfile, "w+")) == NULL)
+  if ((pgperr = mutt_mktempfile (pgperrfile, sizeof (pgperrfile), "w+")) == NULL)
   {
-    mutt_perror (pgperrfile);
+    mutt_perror ("mutt_mktempfile");
     unlink(tempfile);
     fclose(fpout);
     return NULL;
   }
   unlink (pgperrfile);
 
-  mutt_mktemp(pgpinfile);
-  if((fptmp = safe_fopen(pgpinfile, "w")) == NULL)
+  if((fptmp = mutt_mktempfile (pgpinfile, sizeof (pgpinfile), "w")) == NULL)
   {
-    mutt_perror(pgpinfile);
+    mutt_perror ("mutt_mktempfile");
     unlink(tempfile);
     fclose(fpout);
     fclose(pgperr);
@@ -1567,10 +1557,9 @@
     return NULL;
   }
   
-  mutt_mktemp (pgpinfile);
-  if ((pgpin = safe_fopen (pgpinfile, "w")) == NULL)
+  if ((pgpin = mutt_mktempfile (pgpinfile, sizeof (pgpinfile), "w")) == NULL)
   {
-    mutt_perror (pgpinfile);
+    mutt_perror ("mutt_mktempfile");
     fclose (fp);
     return NULL;
   }
@@ -1579,12 +1568,10 @@
   fclose (fp);
   fclose (pgpin);
 
-  mutt_mktemp (pgpoutfile);
-  mutt_mktemp (pgperrfile);
-  if ((pgpout = safe_fopen (pgpoutfile, "w+")) == NULL ||
-      (pgperr = safe_fopen (pgperrfile, "w+")) == NULL)
+  if ((pgpout = mutt_mktempfile (pgpoutfile, sizeof (pgpoutfile), "w+")) == NULL ||
+      (pgperr = mutt_mktempfile (pgperrfile, sizeof (pgperrfile), "w+")) == NULL)
   {
-    mutt_perror (pgpout ? pgperrfile : pgpoutfile);
+    mutt_perror ("mutt_mktempfile");
     unlink (pgpinfile);
     if (pgpout) 
     {
--- mutt-1.4.2.1/pgpkey.c.orig	Tue Jan 15 09:04:28 2002
+++ mutt-1.4.2.1/pgpkey.c	Thu Feb 12 14:32:44 2004
@@ -543,13 +543,12 @@
 
     case OP_VERIFY_KEY:
 
-      mutt_mktemp (tempfile);
       if ((devnull = fopen ("/dev/null", "w")) == NULL)	/* __FOPEN_CHECKED__ */
       {
 	mutt_perror _("Can't open /dev/null");
 	break;
       }
-      if ((fp = safe_fopen (tempfile, "w")) == NULL)
+      if ((fp = mutt_mktempfile (tempfile, sizeof (tempfile), "w")) == NULL)
       {
 	fclose (devnull);
 	mutt_perror _("Can't create temporary file");
@@ -726,11 +725,13 @@
   
   if (!tempf)
   {
-    mutt_mktemp (tempfb);
+    tempfp = mutt_mktempfile (tempfb, sizeof (tempfb), "w");
     tempf = tempfb;
   }
+  else
+    tempfp = safe_fopen (tempf, "a");
 
-  if ((tempfp = safe_fopen (tempf, tempf == tempfb ? "w" : "a")) == NULL)
+  if (tempfp == NULL)
   {
     mutt_perror _("Can't create temporary file");
     return NULL;
--- mutt-1.4.2.1/pgpmicalg.c.orig	Mon Feb 12 17:21:38 2001
+++ mutt-1.4.2.1/pgpmicalg.c	Thu Feb 12 14:32:44 2004
@@ -163,10 +163,9 @@
   
   short rv = -1;
   
-  mutt_mktemp (tempfile);
-  if ((out = safe_fopen (tempfile, "w+")) == NULL)
+  if ((out = mutt_mktempfile (tempfile, sizeof (tempfile), "w+")) == NULL)
   {
-    mutt_perror (tempfile);
+    mutt_perror ("mutt_mktempfile");
     goto bye;
   }
   unlink (tempfile);
--- mutt-1.4.2.1/pop.c.orig	Thu Apr 25 13:30:49 2002
+++ mutt-1.4.2.1/pop.c	Thu Feb 12 14:32:44 2004
@@ -55,10 +55,9 @@
   char buf[LONG_STRING];
   char tempfile[_POSIX_PATH_MAX];
 
-  mutt_mktemp (tempfile);
-  if (!(f = safe_fopen (tempfile, "w+")))
+  if (!(f = mutt_mktempfile (tempfile, sizeof (tempfile), "w+")))
   {
-    mutt_perror (tempfile);
+    mutt_perror ("mutt_mktempfile");
     return -3;
   }
 
@@ -384,11 +383,10 @@
 
     mutt_message (m);
 
-    mutt_mktemp (path);
-    msg->fp = safe_fopen (path, "w+");
+    msg->fp = mutt_mktempfile (path, sizeof (path), "w+");
     if (!msg->fp)
     {
-      mutt_perror (path);
+      mutt_perror ("mutt_mktempfile");
       mutt_sleep (2);
       return -1;
     }
--- mutt-1.4.2.1/postpone.c.orig	Wed Oct 31 09:20:38 2001
+++ mutt-1.4.2.1/postpone.c	Thu Feb 12 14:32:44 2004
@@ -599,8 +599,7 @@
       mutt_delete_parameter ("x-mutt-noconv", &b->parameter);
     }
 
-    mutt_adv_mktemp (file, sizeof(file));
-    if ((s.fpout = safe_fopen (file, "w")) == NULL)
+    if ((s.fpout = mutt_adv_mktempfile (file, sizeof (file), "w")) == NULL)
       goto bail;
 
     
--- mutt-1.4.2.1/protos.h.orig	Mon Apr 29 17:12:18 2002
+++ mutt-1.4.2.1/protos.h	Thu Feb 12 14:32:44 2004
@@ -141,6 +141,7 @@
 void mutt_account_hook (const char* url);
 void mutt_add_to_reference_headers (ENVELOPE *env, ENVELOPE *curenv, LIST ***pp, LIST ***qq);
 void mutt_adv_mktemp (char *, size_t);
+FILE *mutt_adv_mktempfile (char *, size_t, const char *);
 void mutt_alias_menu (char *, size_t, ALIAS *);
 void mutt_allow_interrupt (int);
 void mutt_attach_init (BODY *);
@@ -191,7 +192,7 @@
 void mutt_make_misc_reply_headers (ENVELOPE *env, CONTEXT *ctx, HEADER *cur, ENVELOPE *curenv);
 void mutt_make_post_indent (CONTEXT *ctx, HEADER *cur, FILE *out);
 void mutt_message_to_7bit (BODY *, FILE *);
-void mutt_mktemp (char *);
+FILE *mutt_mktempfile(char *, size_t, const char *);
 void mutt_normalize_time (struct tm *);
 void mutt_paddstr (int, const char *);
 void mutt_parse_mime_message (CONTEXT *ctx, HEADER *);
@@ -252,7 +253,7 @@
 int mutt_complete (char *, size_t);
 int mutt_compose_attachment (BODY *a);
 int mutt_copy_body (FILE *, BODY **, BODY *);
-int mutt_decode_save_attachment (FILE *, BODY *, char *, int, int);
+int mutt_decode_save_attachment_file (FILE *, BODY *, FILE *, int, int);
 int mutt_display_message (HEADER *h);
 int mutt_edit_attachment(BODY *);
 int mutt_edit_message (CONTEXT *, HEADER *);
@@ -304,10 +305,11 @@
 int mutt_parse_unscore (BUFFER *, BUFFER *, unsigned long, BUFFER *);
 int mutt_parse_unhook (BUFFER *, BUFFER *, unsigned long, BUFFER *);
 int mutt_pattern_func (int, char *);
-int mutt_pipe_attachment (FILE *, BODY *, const char *, char *); 
+int mutt_pipe_attachment (FILE *, BODY *, const char *, FILE *);
 int mutt_print_attachment (FILE *, BODY *);
 int mutt_query_complete (char *, size_t);
 int mutt_save_attachment (FILE *, BODY *, char *, int, HEADER *);
+int mutt_save_attachment_file (FILE *, BODY *, FILE *, int);
 void _mutt_save_message (HEADER *, CONTEXT *, int, int, int);
 int mutt_save_message (HEADER *, int, int, int, int *);
 int mutt_search_command (int, int);
--- mutt-1.4.2.1/recvattach.c.orig	Wed Sep 26 10:33:09 2001
+++ mutt-1.4.2.1/recvattach.c	Thu Feb 12 14:32:44 2004
@@ -484,6 +484,7 @@
 {
   char tfile[_POSIX_PATH_MAX];
   char warning[STRING+_POSIX_PATH_MAX];
+  FILE *tmpf;
 
   if (filter)
   {
@@ -494,24 +495,34 @@
       CLEARLINE (LINES-1);
       return;
     }
-    mutt_mktemp (tfile);
+    if ((tmpf = mutt_mktempfile (tfile, sizeof (tfile), "w")) == NULL)
+    {
+      mutt_perror("mutt_mktempfile");
+      return;
+    }
+  }
+  else {
+    tmpf = NULL;
   }
-  else
-    tfile[0] = 0;
 
-  if (mutt_pipe_attachment (fp, body, command, tfile))
+  if (mutt_pipe_attachment (fp, body, command, tmpf))
   {
     if (filter)
     {
+	/* XXX: mutt_rename_file RACE */
       mutt_unlink (body->filename);
-      mutt_rename_file (tfile, body->filename);
+      if (mutt_rename_file (tfile, body->filename))
+      {
+        mutt_error ("Failure writing attachment. Content in %s", tfile);
+        return;
+      }
       mutt_update_encoding (body);
       mutt_message _("Attachment filtered.");
     }
   }
   else
   {
-    if (filter && tfile[0])
+    if (filter && tmpf)
       mutt_unlink (tfile);
   }
 }
@@ -643,9 +654,13 @@
 
 	  char newfile[_POSIX_PATH_MAX] = "";
 	  FILE *ifp;
+	  FILE *tmpf;
+	  int unlink_newfile = 0;
+
+	  if ((tmpf = mutt_mktempfile(newfile, sizeof (newfile), "w")))
+		unlink_newfile = 1;
 
-	  mutt_mktemp (newfile);
-	  if (mutt_decode_save_attachment (fp, top, newfile, M_PRINTING, 0) == 0)
+	  if (mutt_decode_save_attachment_file (fp, top, tmpf, M_PRINTING, 0) == 0)
 	  {
 	    if ((ifp = fopen (newfile, "r")) != NULL)
 	    {
@@ -655,7 +670,8 @@
 		state_puts (AttachSep, state);
 	    }
 	  }
-	  mutt_unlink (newfile);
+	  if (unlink_newfile)
+		mutt_unlink (newfile);
 	}
       }
       else
--- mutt-1.4.2.1/recvcmd.c.orig	Wed Jan  2 09:33:38 2002
+++ mutt-1.4.2.1/recvcmd.c	Thu Feb 12 14:32:44 2004
@@ -368,8 +368,7 @@
   tmphdr->env = mutt_new_envelope ();
   mutt_make_forward_subject (tmphdr->env, Context, parent);
 
-  mutt_mktemp (tmpbody);
-  if ((tmpfp = safe_fopen (tmpbody, "w")) == NULL)
+  if ((tmpfp = mutt_mktempfile (tmpbody, sizeof (tmpbody), "w")) == NULL)
   {
     mutt_error (_("Can't open temporary file %s."), tmpbody);
     return;
@@ -546,8 +545,7 @@
     
     /* no MIME encapsulation */
     
-    mutt_mktemp (tmpbody);
-    if (!(tmpfp = safe_fopen (tmpbody, "w")))
+    if (!(tmpfp = mutt_mktempfile (tmpbody, sizeof (tmpbody), "w")))
     {
       mutt_error (_("Can't create %s."), tmpbody);
       mutt_free_header (&tmphdr);
@@ -796,8 +794,7 @@
     return;
   }
   
-  mutt_mktemp (tmpbody);
-  if ((tmpfp = safe_fopen (tmpbody, "w")) == NULL)
+  if ((tmpfp = mutt_mktempfile (tmpbody, sizeof (tmpbody), "w")) == NULL)
   {
     mutt_error (_("Can't create %s."), tmpbody);
     mutt_free_header (&tmphdr);
--- mutt-1.4.2.1/rfc1524.c.orig	Tue May 15 07:23:49 2001
+++ mutt-1.4.2.1/rfc1524.c	Thu Feb 12 14:32:44 2004
@@ -438,10 +438,10 @@
   strfcpy(d, s, len);
 }
 
-int rfc1524_expand_filename (char *nametemplate,
+int rfc1524_expand_tofile (char *nametemplate,
 			     char *oldfile, 
 			     char *newfile,
-			     size_t nflen)
+			     size_t nflen, FILE **tmpf, const char *openmode)
 {
   int i, j, k, ps, r;
   char *s;
@@ -541,8 +541,11 @@
       strfcpy(newfile, nametemplate, nflen);
     }
   }
-  
-  mutt_adv_mktemp(newfile, nflen);
+
+  if (tmpf && openmode)
+    *tmpf = mutt_adv_mktempfile(newfile, nflen, openmode);
+  else
+    mutt_adv_mktemp(newfile, nflen);
 
   if(rmatch && lmatch)
     return 0;
@@ -550,6 +553,15 @@
     return 1;
   
 }
+
+int rfc1524_expand_filename (char *nametemplate,
+			     char *oldfile,
+			     char *newfile,
+			     size_t nflen)
+{
+  return rfc1524_expand_tofile (nametemplate, oldfile, newfile, nflen,
+		  NULL, NULL);
+}	
 
 /* If rfc1524_expand_command() is used on a recv'd message, then
  * the filename doesn't exist yet, but if its used while sending a message,
--- mutt-1.4.2.1/rfc1524.h.orig	Fri Mar  3 10:10:13 2000
+++ mutt-1.4.2.1/rfc1524.h	Thu Feb 12 14:32:44 2004
@@ -38,6 +38,7 @@
 void rfc1524_free_entry (rfc1524_entry **);
 int rfc1524_expand_command (BODY *, char *, char *, char *, int);
 int rfc1524_expand_filename (char *, char *, char *, size_t);
+int rfc1524_expand_tofile (char *, char *, char *, size_t, FILE **, const char *);
 int rfc1524_mailcap_lookup (BODY *, char *, rfc1524_entry *, int);
 int mutt_rename_file (char *, char *);
 
--- mutt-1.4.2.1/send.c.orig	Wed Jan 30 22:50:59 2002
+++ mutt-1.4.2.1/send.c	Thu Feb 12 14:32:44 2004
@@ -942,8 +942,7 @@
   int i;
   
   /* Write out the message in MIME form. */
-  mutt_mktemp (tempfile);
-  if ((tempfp = safe_fopen (tempfile, "w")) == NULL)
+  if ((tempfp = mutt_mktempfile (tempfile, sizeof (tempfile), "w")) == NULL)
     return (-1);
 
 #ifdef MIXMASTER
@@ -1146,8 +1145,7 @@
     
     if (!tempfile)
     {
-      mutt_mktemp (buffer);
-      tempfp = safe_fopen (buffer, "w+");
+      tempfp = mutt_mktempfile (buffer, sizeof (buffer), "w+");
       msg->content->filename = safe_strdup (buffer);
     }
     else
--- mutt-1.4.2.1/sendlib.c.orig	Fri May 31 16:59:39 2002
+++ mutt-1.4.2.1/sendlib.c	Thu Feb 12 14:32:44 2004
@@ -1092,10 +1092,9 @@
     a->length = sb.st_size;
   }
 
-  mutt_mktemp (temp);
-  if (!(fpout = safe_fopen (temp, "w+")))
+  if (!(fpout = mutt_mktempfile (temp, sizeof (temp), "w+")))
   {
-    mutt_perror ("fopen");
+    mutt_perror ("mutt_mktempfile");
     goto cleanup;
   }
 
@@ -1160,10 +1159,9 @@
     }
     else 
     {
-      mutt_mktemp (buff);
-      if ((s.fpout = safe_fopen (buff, "w")) == NULL) 
+      if ((s.fpout = mutt_mktempfile (buff, sizeof (buff), "w")) == NULL)
       {
-	mutt_perror ("fopen");
+	mutt_perror ("mutt_mktempfile");
 	return;
       }
       s.fpin = fpin;
@@ -1300,8 +1298,7 @@
     return (NULL);
 #endif /* HAVE_PGP */
 
-  mutt_mktemp (buffer);
-  if ((fp = safe_fopen (buffer, "w+")) == NULL)
+  if ((fp = mutt_mktempfile (buffer, sizeof (buffer), "w+")) == NULL)
     return NULL;
 
   body = mutt_new_body ();
@@ -1775,6 +1772,8 @@
   sigset_t set;
   int fd, st;
   pid_t pid, ppid;
+  FILE *tmpf = NULL;
+  int tmpfd = -1;
 
   mutt_block_signals_system ();
 
@@ -1787,7 +1786,14 @@
   {
     char tmp[_POSIX_PATH_MAX];
 
-    mutt_mktemp (tmp);
+    if ((tmpf = mutt_mktempfile (tmp, sizeof (tmp), "w")) == NULL ||
+			(tmpfd = fileno (tmpf)) < 0)
+    {
+      mutt_perror ("mutt_mktempfile");
+      sigprocmask (SIG_UNBLOCK, &set, NULL);
+      mutt_unblock_signals_system (1);
+      return S_ERR;
+    }
     *tempfile = safe_strdup (tmp);
   }
 
@@ -1802,14 +1808,24 @@
      * so we put ourselves into another session right away
      */
     setsid ();
-  
+
+    if (SendmailWait >=0 && tmpfd >= 0 && tmpfd < 3)
+      if ((tmpfd = dup2 (tmpfd, 3)) < 0) {
+        unlink (msg);
+        close (tmpfd);
+        safe_free ((void **) tempfile);
+        _exit (S_ERR);
+      }
+
     /* next we close all open files */
 #if defined(OPEN_MAX)
     for (fd = 0; fd < OPEN_MAX; fd++)
-      close (fd);
+      if (tmpfd != fd)
+        close (fd);
 #elif defined(_POSIX_OPEN_MAX)
     for (fd = 0; fd < _POSIX_OPEN_MAX; fd++)
-      close (fd);
+      if (tmpfd != fd)
+        close (fd);
 #else
     close (0);
     close (1);
@@ -1830,11 +1846,12 @@
       if (SendmailWait >= 0)
       {
 	/* *tempfile will be opened as stdout */
-	if (open (*tempfile, O_WRONLY | O_APPEND | O_CREAT | O_EXCL, 0600) < 0)
+	if (dup2 (tmpfd, 1) < 0)
 	  _exit (S_ERR);
 	/* redirect stderr to *tempfile too */
-	if (dup (1) < 0)
+	if (dup2 (tmpfd, 2) < 0)
 	  _exit (S_ERR);
+	close (tmpfd);
       }
       else 
       {
@@ -1909,6 +1926,9 @@
     _exit (st);
   }
 
+  if (SendmailWait >= 0 && tmpf)
+    fclose (tmpf);
+
   sigprocmask (SIG_UNBLOCK, &set, NULL);
 
   if (pid != -1 && waitpid (pid, &st, 0) > 0)
@@ -2192,8 +2212,7 @@
 
   if (!fp) fp = msg->fp;
 
-  mutt_mktemp (tempfile);
-  if ((f = safe_fopen (tempfile, "w")) != NULL)
+  if ((f = mutt_mktempfile (tempfile, sizeof (tempfile), "w")) != NULL)
   {
     int ch_flags = CH_XMIT | CH_NONEWLINE;
     
@@ -2319,10 +2338,9 @@
    */
   if (f.magic == M_MMDF || f.magic == M_MBOX || f.magic == M_KENDRA)
   {
-    mutt_mktemp (tempfile);
-    if ((tempfp = safe_fopen (tempfile, "w+")) == NULL)
+    if ((tempfp = mutt_mktempfile (tempfile, sizeof (tempfile), "w+")) == NULL)
     {
-      mutt_perror (tempfile);
+      mutt_perror ("mutt_mktempfile");
       mx_close_mailbox (&f, NULL);
       return (-1);
     }
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin