[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] /srv/bzr/emacs/trunk r104555: * movemail.c: Fix race condi
From: |
Paul Eggert |
Subject: |
[Emacs-diffs] /srv/bzr/emacs/trunk r104555: * movemail.c: Fix race condition and related bugs (Bug#8836). |
Date: |
Fri, 10 Jun 2011 10:50:07 -0700 |
User-agent: |
Bazaar (2.3.1) |
------------------------------------------------------------
revno: 104555
fixes bug(s): http://debbugs.gnu.org/8836
committer: Paul Eggert <address@hidden>
branch nick: trunk
timestamp: Fri 2011-06-10 10:50:07 -0700
message:
* movemail.c: Fix race condition and related bugs (Bug#8836).
(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:
lib-src/ChangeLog
lib-src/movemail.c
=== modified file 'lib-src/ChangeLog'
--- a/lib-src/ChangeLog 2011-06-01 17:15:27 +0000
+++ b/lib-src/ChangeLog 2011-06-10 17:50:07 +0000
@@ -1,3 +1,13 @@
+2011-06-10 Paul Eggert <address@hidden>
+
+ * movemail.c: Fix race condition and related bugs (Bug#8836).
+ (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.
+
2011-06-01 Dan Nicolaescu <address@hidden>
* emacsclient.c (socket_status): Use constant pointer.
=== modified file 'lib-src/movemail.c'
--- a/lib-src/movemail.c 2011-04-16 21:20:25 +0000
+++ b/lib-src/movemail.c 2011-06-10 17:50:07 +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 address@hidden 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);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] /srv/bzr/emacs/trunk r104555: * movemail.c: Fix race condition and related bugs (Bug#8836).,
Paul Eggert <=