summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--attach.c19
-rw-r--r--globals.h1
-rw-r--r--init.c10
-rw-r--r--init.h6
-rw-r--r--lib.c4
-rw-r--r--mh.c4
-rw-r--r--mx.c39
7 files changed, 59 insertions, 24 deletions
diff --git a/attach.c b/attach.c
index 8c3edf2e..609525d7 100644
--- a/attach.c
+++ b/attach.c
@@ -736,12 +736,21 @@ bail:
static FILE *
mutt_save_attachment_open (char *path, int flags)
{
+ mode_t omask;
+ FILE *fp = NULL;
+
+ omask = umask(Umask);
+
if (flags == M_SAVE_APPEND)
- return fopen (path, "a");
- if (flags == M_SAVE_OVERWRITE)
- return fopen (path, "w"); /* __FOPEN_CHECKED__ */
-
- return safe_fopen (path, "w");
+ fp = fopen (path, "a");
+ else if (flags == M_SAVE_OVERWRITE)
+ fp = fopen (path, "w"); /* __FOPEN_CHECKED__ */
+ else
+ fp = safe_fopen (path, "w");
+
+ umask(omask);
+
+ return fp;
}
/* returns 0 on success, -1 on error */
diff --git a/globals.h b/globals.h
index 0d025dfe..6c9a16c5 100644
--- a/globals.h
+++ b/globals.h
@@ -200,6 +200,7 @@ WHERE short SaveHist;
WHERE short SendmailWait;
WHERE short SleepTime INITVAL (1);
WHERE short Timeout;
+WHERE short Umask;
WHERE short Wrap;
WHERE short WriteInc;
diff --git a/init.c b/init.c
index 0008ab7f..26fed943 100644
--- a/init.c
+++ b/init.c
@@ -1980,7 +1980,10 @@ static int parse_set (BUFFER *tmp, BUFFER *s, unsigned long data, BUFFER *err)
val = *ptr < 0 ? -*ptr : 0;
/* user requested the value of this variable */
- snprintf (err->data, err->dsize, "%s=%d", MuttVars[idx].option, val);
+ if (mutt_strcmp (MuttVars[idx].option, "umask") == 0)
+ snprintf (err->data, err->dsize, "%s=0%o", MuttVars[idx].option, val);
+ else
+ snprintf (err->data, err->dsize, "%s=%d", MuttVars[idx].option, val);
break;
}
@@ -2566,7 +2569,10 @@ static int var_to_string (int idx, char* val, size_t len)
if (mutt_strcmp (MuttVars[idx].option, "wrapmargin") == 0)
sval = sval > 0 ? 0 : -sval;
- snprintf (tmp, sizeof (tmp), "%d", sval);
+ if (mutt_strcmp (MuttVars[idx].option, "umask") == 0)
+ snprintf (tmp, sizeof (tmp), "0%o", sval);
+ else
+ snprintf (tmp, sizeof (tmp), "%d", sval);
}
else if (DTYPE (MuttVars[idx].type) == DT_SORT)
{
diff --git a/init.h b/init.h
index 0aab36bb..b940b32a 100644
--- a/init.h
+++ b/init.h
@@ -2909,6 +2909,12 @@ struct option_t MuttVars[] = {
** machine without having to enter a password.
*/
#endif
+ { "umask", DT_NUM, R_NONE, &Umask, 0077 },
+ /*
+ ** .pp
+ ** Sets the umask to use when creating mailboxes or saving attachments.
+ */
+
{ "use_8bitmime", DT_BOOL, R_NONE, OPTUSE8BITMIME, 0 },
/*
** .pp
diff --git a/lib.c b/lib.c
index e6e80c2e..070311c7 100644
--- a/lib.c
+++ b/lib.c
@@ -570,7 +570,7 @@ int safe_open (const char *path, int flags)
safe_dir, sizeof (safe_dir)) == -1)
return -1;
- if ((fd = open (safe_file, flags, 0600)) < 0)
+ if ((fd = open (safe_file, flags, 0666)) < 0)
{
rmdir (safe_dir);
return fd;
@@ -584,7 +584,7 @@ int safe_open (const char *path, int flags)
}
else
{
- if ((fd = open (path, flags, 0600)) < 0)
+ if ((fd = open (path, flags, 0666)) < 0)
return fd;
}
diff --git a/mh.c b/mh.c
index 1447d142..7a15833b 100644
--- a/mh.c
+++ b/mh.c
@@ -207,7 +207,7 @@ static int mh_mkstemp (CONTEXT * dest, FILE ** fp, char **tgt)
{
snprintf (path, _POSIX_PATH_MAX, "%s/.mutt-%s-%d-%d",
dest->path, NONULL (Hostname), (int) getpid (), Counter++);
- if ((fd = open (path, O_WRONLY | O_EXCL | O_CREAT, 0600)) == -1)
+ if ((fd = open (path, O_WRONLY | O_EXCL | O_CREAT, 0666)) == -1)
{
if (errno != EEXIST)
{
@@ -1145,7 +1145,7 @@ int maildir_open_new_message (MESSAGE * msg, CONTEXT * dest, HEADER * hdr)
dprint (2, (debugfile, "maildir_open_new_message (): Trying %s.\n",
path));
- if ((fd = open (path, O_WRONLY | O_EXCL | O_CREAT, 0600)) == -1)
+ if ((fd = open (path, O_WRONLY | O_EXCL | O_CREAT, 0666)) == -1)
{
if (errno != EEXIST)
{
diff --git a/mx.c b/mx.c
index 87c15b84..7e8c7a23 100644
--- a/mx.c
+++ b/mx.c
@@ -492,6 +492,7 @@ int mx_access (const char* path, int flags)
static int mx_open_mailbox_append (CONTEXT *ctx, int flags)
{
struct stat sb;
+ mode_t omask;
ctx->append = 1;
@@ -502,6 +503,8 @@ static int mx_open_mailbox_append (CONTEXT *ctx, int flags)
#endif
+ omask = umask(Umask);
+
if(stat(ctx->path, &sb) == 0)
{
ctx->magic = mx_get_magic (ctx->path);
@@ -523,33 +526,33 @@ static int mx_open_mailbox_append (CONTEXT *ctx, int flags)
{
char tmp[_POSIX_PATH_MAX];
- if (mkdir (ctx->path, S_IRWXU))
+ if (mkdir (ctx->path, S_IRWXU|S_IRWXG|S_IRWXO))
{
mutt_perror (ctx->path);
- return (-1);
+ goto err_umask;
}
if (ctx->magic == M_MAILDIR)
{
snprintf (tmp, sizeof (tmp), "%s/cur", ctx->path);
- if (mkdir (tmp, S_IRWXU))
+ if (mkdir (tmp, S_IRWXU|S_IRWXG|S_IRWXO))
{
mutt_perror (tmp);
rmdir (ctx->path);
- return (-1);
+ goto err_umask;
}
snprintf (tmp, sizeof (tmp), "%s/new", ctx->path);
- if (mkdir (tmp, S_IRWXU))
+ if (mkdir (tmp, S_IRWXU|S_IRWXG|S_IRWXO))
{
mutt_perror (tmp);
snprintf (tmp, sizeof (tmp), "%s/cur", ctx->path);
rmdir (tmp);
rmdir (ctx->path);
- return (-1);
+ goto err_umask;
}
snprintf (tmp, sizeof (tmp), "%s/tmp", ctx->path);
- if (mkdir (tmp, S_IRWXU))
+ if (mkdir (tmp, S_IRWXU|S_IRWXG|S_IRWXO))
{
mutt_perror (tmp);
snprintf (tmp, sizeof (tmp), "%s/cur", ctx->path);
@@ -557,7 +560,7 @@ static int mx_open_mailbox_append (CONTEXT *ctx, int flags)
snprintf (tmp, sizeof (tmp), "%s/new", ctx->path);
rmdir (tmp);
rmdir (ctx->path);
- return (-1);
+ goto err_umask;
}
}
else
@@ -565,11 +568,11 @@ static int mx_open_mailbox_append (CONTEXT *ctx, int flags)
int i;
snprintf (tmp, sizeof (tmp), "%s/.mh_sequences", ctx->path);
- if ((i = creat (tmp, S_IRWXU)) == -1)
+ if ((i = creat (tmp, S_IRWXU|S_IRWXG|S_IRWXO)) == -1)
{
mutt_perror (tmp);
rmdir (ctx->path);
- return (-1);
+ goto err_umask;
}
close (i);
}
@@ -578,7 +581,7 @@ static int mx_open_mailbox_append (CONTEXT *ctx, int flags)
else
{
mutt_perror (ctx->path);
- return (-1);
+ goto err_umask;
}
switch (ctx->magic)
@@ -595,7 +598,7 @@ static int mx_open_mailbox_append (CONTEXT *ctx, int flags)
mutt_error (_("Couldn't lock %s\n"), ctx->path);
safe_fclose (&ctx->fp);
}
- return (-1);
+ goto err_umask;
}
fseek (ctx->fp, 0, 2);
break;
@@ -606,10 +609,15 @@ static int mx_open_mailbox_append (CONTEXT *ctx, int flags)
break;
default:
- return (-1);
+ goto err_umask;
}
+ umask(omask);
return 0;
+
+ err_umask:
+ umask(omask);
+ return -1;
}
/*
@@ -1258,6 +1266,7 @@ MESSAGE *mx_open_new_message (CONTEXT *dest, HEADER *hdr, int flags)
MESSAGE *msg;
int (*func) (MESSAGE *, CONTEXT *, HEADER *);
ADDRESS *p = NULL;
+ mode_t omask;
switch (dest->magic)
{
@@ -1296,6 +1305,8 @@ MESSAGE *mx_open_new_message (CONTEXT *dest, HEADER *hdr, int flags)
if(msg->received == 0)
time(&msg->received);
+
+ omask = umask(Umask);
if (func (msg, dest, hdr) == 0)
{
@@ -1321,6 +1332,8 @@ MESSAGE *mx_open_new_message (CONTEXT *dest, HEADER *hdr, int flags)
else
FREE (&msg);
+ umask(omask);
+
return msg;
}