* bug#8836: mktemp-related race condition in movemail
@ 2011-06-10 17:46 Paul Eggert
[not found] ` <handler.8836.B.130772803530913.ack@debbugs.gnu.org>
0 siblings, 1 reply; 2+ messages in thread
From: Paul Eggert @ 2011-06-10 17:46 UTC (permalink / raw)
To: 8836
There is a race condition in lib-src/movemail.c, and some
related bugs. I plan to commit the following patch.
This one has security implications, so I'm filing a bug
report to give others a bigger heads-up.
I found this one via GCC 4.6.0's static analysis.
* movemail.c: Fix race condition and related bugs.
(main) [!MAIL_USE_SYSTEM_LOCK]: Prefer mkstemp to mktemp, as this
fixes some race conditions. Report mkstemp/mktemp errno rather
than a possibly-garbage errno. Reinitialize the template each
time through the loop, as earlier mkstemp/mktemp calls could have
trashed it. Pass 0600 (not 0666) to mktemp, for consistency
with mkstemp; the permissions don't matter anyway.
=== modified file 'lib-src/movemail.c'
--- lib-src/movemail.c 2011-04-16 21:20:25 +0000
+++ lib-src/movemail.c 2011-06-10 17:30:52 +0000
@@ -168,8 +168,9 @@
#ifndef MAIL_USE_SYSTEM_LOCK
struct stat st;
int tem;
- char *lockname, *p;
+ char *lockname;
char *tempname;
+ size_t inname_dirlen;
int desc;
#endif /* not MAIL_USE_SYSTEM_LOCK */
@@ -298,26 +299,38 @@
to bug-gnu-emacs@prep.ai.mit.edu so we can fix it. */
lockname = concat (inname, ".lock", "");
- tempname = (char *) xmalloc (strlen (inname) + strlen ("EXXXXXX") + 1);
- strcpy (tempname, inname);
- p = tempname + strlen (tempname);
- while (p != tempname && !IS_DIRECTORY_SEP (p[-1]))
- p--;
- *p = 0;
- strcpy (p, "EXXXXXX");
- mktemp (tempname);
- unlink (tempname);
+ for (inname_dirlen = strlen (inname);
+ inname_dirlen && !IS_DIRECTORY_SEP (inname[inname_dirlen - 1]);
+ inname_dirlen--)
+ continue;
+ tempname = (char *) xmalloc (inname_dirlen + sizeof "EXXXXXX");
while (1)
{
/* Create the lock file, but not under the lock file name. */
/* Give up if cannot do that. */
- desc = open (tempname, O_WRONLY | O_CREAT | O_EXCL, 0666);
+
+ memcpy (tempname, inname, inname_dirlen);
+ strcpy (tempname + inname_dirlen, "EXXXXXX");
+#ifdef HAVE_MKSTEMP
+ desc = mkstemp (tempname);
+#else
+ mktemp (tempname);
+ if (!*tempname)
+ desc = -1;
+ else
+ {
+ unlink (tempname);
+ desc = open (tempname, O_WRONLY | O_CREAT | O_EXCL, 0600);
+ }
+#endif
if (desc < 0)
{
+ int mkstemp_errno = errno;
char *message = (char *) xmalloc (strlen (tempname) + 50);
sprintf (message, "creating %s, which would become the lock file",
tempname);
+ errno = mkstemp_errno;
pfatal_with_name (message);
}
close (desc);
^ permalink raw reply [flat|nested] 2+ messages in thread
* bug#8836: Acknowledgement (mktemp-related race condition in movemail)
[not found] ` <handler.8836.B.130772803530913.ack@debbugs.gnu.org>
@ 2011-06-10 17:50 ` Paul Eggert
0 siblings, 0 replies; 2+ messages in thread
From: Paul Eggert @ 2011-06-10 17:50 UTC (permalink / raw)
To: 8836-done
I committed the fix in bzr 104555 on the trunk.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2011-06-10 17:50 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-06-10 17:46 bug#8836: mktemp-related race condition in movemail Paul Eggert
[not found] ` <handler.8836.B.130772803530913.ack@debbugs.gnu.org>
2011-06-10 17:50 ` bug#8836: Acknowledgement (mktemp-related race condition in movemail) Paul Eggert
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).