if (mutt_yesorno (_("Can't match nametemplate, continue?"), M_YES) != M_YES)
goto bailout;
}
- unlink_newfile = 1;
+ else
+ unlink_newfile = 1;
}
else
strfcpy(newfile, a->filename, sizeof(newfile));
fclose (fp);
fclose (tfp);
mutt_unlink (a->filename);
- mutt_rename_file (tempfile, a->filename);
+ if (mutt_rename_file (tempfile, a->filename) != 0)
+ {
+ mutt_perror _("Failure to rename file.");
+ goto bailout;
+ }
mutt_free_body (&b);
}
if (mutt_yesorno (_("Can't match nametemplate, continue?"), M_YES) != M_YES)
goto bailout;
}
- unlink_newfile = 1;
+ else
+ unlink_newfile = 1;
}
else
strfcpy(newfile, a->filename, sizeof(newfile));
rc = mutt_do_pager (descrip, pagerfile,
M_PAGER_ATTACHMENT | (is_message ? M_PAGER_MESSAGE : 0), &info);
+ *pagerfile = '\0';
}
else
rc = 0;
void mutt_unlink (const char *s)
{
+ int fd;
+ int flags;
FILE *f;
struct stat sb;
char buf[2048];
+
+ /* Defend against symlink attacks */
+
+#ifdef O_NOFOLLOW
+ flags = O_RDWR | O_NOFOLLOW;
+#else
+ flags = O_RDWR;
+#endif
if (stat (s, &sb) == 0)
{
- if ((f = fopen (s, "r+")))
+ if ((fd = open (s, flags)) < 0)
+ return;
+ if ((f = fdopen (fd, "r+")))
{
unlink (s);
memset (buf, 0, sizeof (buf));