]> granicus.if.org Git - mutt/commitdiff
Use a different flag in mx_open_mailbox_append() when mailbox doesn't exist.
authorKevin McCarthy <kevin@8t8.us>
Tue, 2 Aug 2016 01:25:28 +0000 (18:25 -0700)
committerKevin McCarthy <kevin@8t8.us>
Tue, 2 Aug 2016 01:25:28 +0000 (18:25 -0700)
The previous commit re-used MUTT_NEWFOLDER, but the meaning of that
flag is slightly different: it causes mbox to use fopen with mode "w",
and is used only for the case of a brand-new mktemp-generated mbox.

Setting it for other non-existing mbox files leads to a race condition
between the stat and the fopen/lock, and so could end up truncating an
existing mailbox created in-between!

Create a different flag, MUTT_APPENDNEW to notify the open_append()
functions that the mailbox doesn't exist.  Change maildir and mh to
check for that flag to create their directory structures.

mailbox.h
mh.c
mx.c

index 1fb1efe0da632d33675feb55b5239c8094e7615e..35fb6013c3d02c570647c486470612e0c99bfeed 100644 (file)
--- a/mailbox.h
+++ b/mailbox.h
 #define MUTT_READONLY   (1<<2) /* open in read-only mode */
 #define MUTT_QUIET      (1<<3) /* do not print any messages */
 #define MUTT_NEWFOLDER  (1<<4) /* create a new folder - same as MUTT_APPEND, but uses
-                                * safe_fopen() for mbox-style folders. */
+                                * safe_fopen() with mode "w" for mbox-style folders.
+                                * This will truncate an existing file. */
 #define MUTT_PEEK       (1<<5) /* revert atime back after taking a look (if applicable) */
+#define MUTT_APPENDNEW  (1<<6) /* set in mx_open_mailbox_append if the mailbox doesn't
+                                * exist. used by maildir/mh to create the mailbox. */
 
 /* mx_open_new_message() */
 #define MUTT_ADD_FROM   (1<<0)  /* add a From_ line */
diff --git a/mh.c b/mh.c
index 3d969f628ebeeb336ed2a48075fc55ac45c0f2e9..f7ce25fc4c9f0f1ae909d23e166a2eabd894510b 100644 (file)
--- a/mh.c
+++ b/mh.c
@@ -1294,7 +1294,7 @@ static int maildir_open_mailbox_append (CONTEXT *ctx, int flags)
 {
   char tmp[_POSIX_PATH_MAX];
 
-  if (flags & MUTT_NEWFOLDER)
+  if (flags & MUTT_APPENDNEW)
   {
     if (mkdir (ctx->path, S_IRWXU))
     {
@@ -1346,7 +1346,7 @@ static int mh_open_mailbox_append (CONTEXT *ctx, int flags)
   char tmp[_POSIX_PATH_MAX];
   int i;
 
-  if (flags & MUTT_NEWFOLDER)
+  if (flags & MUTT_APPENDNEW)
   {
     if (mkdir (ctx->path, S_IRWXU))
     {
diff --git a/mx.c b/mx.c
index 5b08eb8673443b52a05b5dddf7f6d3296e833aa5..7ffe0321e06251509589ce98ef27838874c04897 100644 (file)
--- a/mx.c
+++ b/mx.c
@@ -495,7 +495,7 @@ static int mx_open_mailbox_append (CONTEXT *ctx, int flags)
       if (errno == ENOENT)
       {
         ctx->magic = DefaultMagic;
-        flags |= MUTT_NEWFOLDER;
+        flags |= MUTT_APPENDNEW;
       }
       else
       {