emacs-diffs
[Top][All Lists]
Advanced

[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);


reply via email to

[Prev in Thread] Current Thread [Next in Thread]