dovecot-1.2: Whenever file's group changing fails, show the grou...
dovecot at dovecot.org
dovecot at dovecot.org
Sun Jun 28 03:40:04 EEST 2009
details: http://hg.dovecot.org/dovecot-1.2/rev/2bbf175bb6d3
changeset: 9168:2bbf175bb6d3
user: Timo Sirainen <tss at iki.fi>
date: Sat Jun 27 20:39:30 2009 -0400
description:
Whenever file's group changing fails, show the group origin in the error message.
diffstat:
32 files changed, 393 insertions(+), 147 deletions(-)
src/deliver/deliver.c | 5 -
src/lib-index/mail-index-private.h | 1
src/lib-index/mail-index-strmap.c | 5 -
src/lib-index/mail-index.c | 14 +++-
src/lib-index/mail-index.h | 2
src/lib-storage/index/cydir/cydir-storage.c | 6 +
src/lib-storage/index/dbox/dbox-storage.c | 6 +
src/lib-storage/index/index-storage.c | 21 +++---
src/lib-storage/index/maildir/maildir-keywords.c | 19 ++++-
src/lib-storage/index/maildir/maildir-save.c | 13 +++
src/lib-storage/index/maildir/maildir-storage.c | 72 +++++++++++++-------
src/lib-storage/index/maildir/maildir-uidlist.c | 10 ++
src/lib-storage/index/maildir/maildir-util.c | 13 ++-
src/lib-storage/index/mbox/mbox-storage.c | 6 -
src/lib-storage/list/mailbox-list-fs.c | 7 +-
src/lib-storage/list/subscription-file.c | 16 ++--
src/lib-storage/mail-storage-private.h | 2
src/lib-storage/mailbox-list-private.h | 2
src/lib-storage/mailbox-list.c | 25 +++++--
src/lib-storage/mailbox-list.h | 9 +-
src/lib/eacces-error.c | 30 ++++++++
src/lib/eacces-error.h | 5 +
src/lib/file-dotlock.c | 64 +++++++++++++-----
src/lib/file-dotlock.h | 4 +
src/lib/mkdir-parents.c | 76 +++++++++++++++++++---
src/lib/mkdir-parents.h | 9 ++
src/lib/safe-mkstemp.c | 39 +++++++++--
src/lib/safe-mkstemp.h | 4 +
src/plugins/acl/acl-backend-vfile-acllist.c | 6 -
src/plugins/acl/acl-backend-vfile.c | 10 +-
src/plugins/lazy-expunge/lazy-expunge-plugin.c | 7 +-
src/plugins/quota/quota-maildir.c | 32 ++++-----
diffs (truncated from 1298 to 300 lines):
diff -r 5379a940d62a -r 2bbf175bb6d3 src/deliver/deliver.c
--- a/src/deliver/deliver.c Sat Jun 27 19:55:17 2009 -0400
+++ b/src/deliver/deliver.c Sat Jun 27 20:39:30 2009 -0400
@@ -616,6 +616,7 @@ static int deliver_create_dir(struct mai
static int deliver_create_dir(struct mail_user *user, const char *dir)
{
struct mail_namespace *ns;
+ const char *origin;
mode_t mode;
gid_t gid;
@@ -623,8 +624,8 @@ static int deliver_create_dir(struct mai
if (ns == NULL)
ns = user->namespaces;
- mailbox_list_get_dir_permissions(ns->list, NULL, &mode, &gid);
- if (mkdir_parents_chown(dir, mode, (uid_t)-1, gid) == 0) {
+ mailbox_list_get_dir_permissions(ns->list, NULL, &mode, &gid, &origin);
+ if (mkdir_parents_chgrp(dir, mode, gid, origin) == 0) {
return 0;
} else if (errno == EACCES) {
i_error("%s", eacces_error_get_creating("mkdir_parents_chown",
diff -r 5379a940d62a -r 2bbf175bb6d3 src/lib-index/mail-index-private.h
--- a/src/lib-index/mail-index-private.h Sat Jun 27 19:55:17 2009 -0400
+++ b/src/lib-index/mail-index-private.h Sat Jun 27 20:39:30 2009 -0400
@@ -174,6 +174,7 @@ struct mail_index {
enum mail_index_sync_type fsync_mask;
mode_t mode;
gid_t gid;
+ char *gid_origin;
pool_t extension_pool;
ARRAY_DEFINE(extensions, struct mail_index_registered_ext);
diff -r 5379a940d62a -r 2bbf175bb6d3 src/lib-index/mail-index-strmap.c
--- a/src/lib-index/mail-index-strmap.c Sat Jun 27 19:55:17 2009 -0400
+++ b/src/lib-index/mail-index-strmap.c Sat Jun 27 20:39:30 2009 -0400
@@ -997,8 +997,9 @@ static int mail_index_strmap_recreate(st
str = t_str_new(256);
str_append(str, strmap->path);
- fd = safe_mkstemp_hostpid(str, view->view->index->mode,
- (uid_t)-1, view->view->index->gid);
+ fd = safe_mkstemp_hostpid_group(str, view->view->index->mode,
+ view->view->index->gid,
+ view->view->index->gid_origin);
temp_path = str_c(str);
if (fd == -1) {
diff -r 5379a940d62a -r 2bbf175bb6d3 src/lib-index/mail-index.c
--- a/src/lib-index/mail-index.c Sat Jun 27 19:55:17 2009 -0400
+++ b/src/lib-index/mail-index.c Sat Jun 27 20:39:30 2009 -0400
@@ -73,6 +73,7 @@ void mail_index_free(struct mail_index *
array_free(&index->keywords);
array_free(&index->module_contexts);
+ i_free(index->gid_origin);
i_free(index->error);
i_free(index->dir);
i_free(index->prefix);
@@ -86,10 +87,13 @@ void mail_index_set_fsync_types(struct m
}
void mail_index_set_permissions(struct mail_index *index,
- mode_t mode, gid_t gid)
+ mode_t mode, gid_t gid, const char *gid_origin)
{
index->mode = mode & 0666;
index->gid = gid;
+
+ i_free(index->gid_origin);
+ index->gid_origin = i_strdup(gid_origin);
}
uint32_t mail_index_ext_register(struct mail_index *index, const char *name,
@@ -644,7 +648,13 @@ void mail_index_fchown(struct mail_index
really matter. ignore silently. */
return;
}
- mail_index_file_set_syscall_error(index, path, "fchown()");
+ if (errno != EACCES)
+ mail_index_file_set_syscall_error(index, path, "fchown()");
+ else {
+ mail_index_set_error(index, "%s",
+ eperm_error_get_chgrp("fchown", path, index->gid,
+ index->gid_origin));
+ }
/* continue, but change permissions so that only the common
subset of group and world is used. this makes sure no one
diff -r 5379a940d62a -r 2bbf175bb6d3 src/lib-index/mail-index.h
--- a/src/lib-index/mail-index.h Sat Jun 27 19:55:17 2009 -0400
+++ b/src/lib-index/mail-index.h Sat Jun 27 20:39:30 2009 -0400
@@ -185,7 +185,7 @@ void mail_index_set_fsync_types(struct m
void mail_index_set_fsync_types(struct mail_index *index,
enum mail_index_sync_type fsync_mask);
void mail_index_set_permissions(struct mail_index *index,
- mode_t mode, gid_t gid);
+ mode_t mode, gid_t gid, const char *gid_origin);
int mail_index_open(struct mail_index *index, enum mail_index_open_flags flags,
enum file_lock_method lock_method);
diff -r 5379a940d62a -r 2bbf175bb6d3 src/lib-storage/index/cydir/cydir-storage.c
--- a/src/lib-storage/index/cydir/cydir-storage.c Sat Jun 27 19:55:17 2009 -0400
+++ b/src/lib-storage/index/cydir/cydir-storage.c Sat Jun 27 20:39:30 2009 -0400
@@ -132,11 +132,13 @@ static int cydir_create(struct mail_stor
static int create_cydir(struct mail_storage *storage, const char *path)
{
+ const char *origin;
mode_t mode;
gid_t gid;
- mailbox_list_get_dir_permissions(storage->list, NULL, &mode, &gid);
- if (mkdir_parents_chown(path, mode, (uid_t)-1, gid) < 0 &&
+ mailbox_list_get_dir_permissions(storage->list, NULL,
+ &mode, &gid, &origin);
+ if (mkdir_parents_chgrp(path, mode, gid, origin) < 0 &&
errno != EEXIST) {
if (!mail_storage_set_error_from_errno(storage)) {
mail_storage_set_critical(storage,
diff -r 5379a940d62a -r 2bbf175bb6d3 src/lib-storage/index/dbox/dbox-storage.c
--- a/src/lib-storage/index/dbox/dbox-storage.c Sat Jun 27 19:55:17 2009 -0400
+++ b/src/lib-storage/index/dbox/dbox-storage.c Sat Jun 27 20:39:30 2009 -0400
@@ -160,11 +160,13 @@ static int dbox_create(struct mail_stora
static int create_dbox(struct mail_storage *storage, const char *path)
{
+ const char *origin;
mode_t mode;
gid_t gid;
- mailbox_list_get_dir_permissions(storage->list, NULL, &mode, &gid);
- if (mkdir_parents_chown(path, mode, (uid_t)-1, gid) < 0 &&
+ mailbox_list_get_dir_permissions(storage->list, NULL,
+ &mode, &gid, &origin);
+ if (mkdir_parents_chgrp(path, mode, gid, origin) < 0 &&
errno != EEXIST) {
if (!mail_storage_set_error_from_errno(storage)) {
mail_storage_set_critical(storage,
diff -r 5379a940d62a -r 2bbf175bb6d3 src/lib-storage/index/index-storage.c
--- a/src/lib-storage/index/index-storage.c Sat Jun 27 19:55:17 2009 -0400
+++ b/src/lib-storage/index/index-storage.c Sat Jun 27 20:39:30 2009 -0400
@@ -70,6 +70,7 @@ static int create_index_dir(struct mail_
static int create_index_dir(struct mail_storage *storage, const char *name)
{
const char *root_dir, *index_dir, *p, *parent_dir;
+ const char *origin, *parent_origin;
mode_t mode, parent_mode;
gid_t gid, parent_gid;
int n = 0;
@@ -81,8 +82,9 @@ static int create_index_dir(struct mail_
if (strcmp(index_dir, root_dir) == 0 || *index_dir == '\0')
return 0;
- mailbox_list_get_dir_permissions(storage->list, name, &mode, &gid);
- while (mkdir_chown(index_dir, mode, (uid_t)-1, gid) < 0) {
+ mailbox_list_get_dir_permissions(storage->list, name,
+ &mode, &gid, &origin);
+ while (mkdir_chgrp(index_dir, mode, gid, origin) < 0) {
if (errno == EEXIST)
break;
@@ -94,10 +96,11 @@ static int create_index_dir(struct mail_
}
/* create the parent directory first */
mailbox_list_get_dir_permissions(storage->list, NULL,
- &parent_mode, &parent_gid);
+ &parent_mode, &parent_gid,
+ &parent_origin);
parent_dir = t_strdup_until(index_dir, p);
- if (mkdir_parents_chown(parent_dir, parent_mode,
- (uid_t)-1, parent_gid) < 0 &&
+ if (mkdir_parents_chgrp(parent_dir, parent_mode,
+ parent_gid, parent_origin) < 0 &&
errno != EEXIST) {
mail_storage_set_critical(storage,
"mkdir(%s) failed: %m", parent_dir);
@@ -435,6 +438,7 @@ void index_storage_mailbox_init(struct i
struct mail_storage *storage = ibox->storage;
struct mailbox *box = &ibox->box;
gid_t dir_gid;
+ const char *origin, *dir_origin;
i_assert(name != NULL);
@@ -444,12 +448,13 @@ void index_storage_mailbox_init(struct i
if (box->file_create_mode == 0) {
mailbox_list_get_permissions(box->storage->list, name,
&box->file_create_mode,
- &box->file_create_gid);
+ &box->file_create_gid, &origin);
+ box->file_create_gid_origin = p_strdup(box->pool, origin);
mailbox_list_get_dir_permissions(box->storage->list, name,
&box->dir_create_mode,
- &dir_gid);
+ &dir_gid, &dir_origin);
mail_index_set_permissions(ibox->index, box->file_create_mode,
- box->file_create_gid);
+ box->file_create_gid, origin);
}
p_array_init(&box->search_results, box->pool, 16);
diff -r 5379a940d62a -r 2bbf175bb6d3 src/lib-storage/index/maildir/maildir-keywords.c
--- a/src/lib-storage/index/maildir/maildir-keywords.c Sat Jun 27 19:55:17 2009 -0400
+++ b/src/lib-storage/index/maildir/maildir-keywords.c Sat Jun 27 20:39:30 2009 -0400
@@ -10,6 +10,7 @@
#include "hash.h"
#include "str.h"
#include "istream.h"
+#include "eacces-error.h"
#include "file-dotlock.h"
#include "write-full.h"
#include "nfs-workarounds.h"
@@ -285,6 +286,7 @@ static int maildir_keywords_write_fd(str
const char *path, int fd)
{
struct maildir_mailbox *mbox = mk->mbox;
+ struct mailbox *box = &mbox->ibox.box;
const char *const *keywords;
unsigned int i, count;
string_t *str;
@@ -308,11 +310,18 @@ static int maildir_keywords_write_fd(str
return -1;
}
- if (st.st_gid != mbox->ibox.box.file_create_gid &&
- mbox->ibox.box.file_create_gid != (gid_t)-1) {
- if (fchown(fd, (uid_t)-1, mbox->ibox.box.file_create_gid) < 0) {
- mail_storage_set_critical(mk->storage,
- "fchown(%s) failed: %m", path);
+ if (st.st_gid != box->file_create_gid &&
+ box->file_create_gid != (gid_t)-1) {
+ if (fchown(fd, (uid_t)-1, box->file_create_gid) < 0) {
+ if (errno == EPERM) {
+ mail_storage_set_critical(mk->storage, "%s",
+ eperm_error_get_chgrp("fchown", path,
+ box->file_create_gid,
+ box->file_create_gid_origin));
+ } else {
+ mail_storage_set_critical(mk->storage,
+ "fchown(%s) failed: %m", path);
+ }
}
}
diff -r 5379a940d62a -r 2bbf175bb6d3 src/lib-storage/index/maildir/maildir-save.c
--- a/src/lib-storage/index/maildir/maildir-save.c Sat Jun 27 19:55:17 2009 -0400
+++ b/src/lib-storage/index/maildir/maildir-save.c Sat Jun 27 20:39:30 2009 -0400
@@ -8,6 +8,7 @@
#include "istream-crlf.h"
#include "ostream.h"
#include "fdatasync-path.h"
+#include "eacces-error.h"
#include "str.h"
#include "index-mail.h"
#include "maildir-storage.h"
@@ -338,8 +339,16 @@ static int maildir_create_tmp(struct mai
}
} else if (box->file_create_gid != (gid_t)-1) {
if (fchown(fd, (uid_t)-1, box->file_create_gid) < 0) {
- mail_storage_set_critical(box->storage,
- "fchown(%s) failed: %m", str_c(path));
+ if (errno == EPERM) {
+ mail_storage_set_critical(box->storage, "%s",
+ eperm_error_get_chgrp("fchown",
+ str_c(path),
+ box->file_create_gid,
+ box->file_create_gid_origin));
+ } else {
+ mail_storage_set_critical(box->storage,
+ "fchown(%s) failed: %m", str_c(path));
+ }
}
}
diff -r 5379a940d62a -r 2bbf175bb6d3 src/lib-storage/index/maildir/maildir-storage.c
--- a/src/lib-storage/index/maildir/maildir-storage.c Sat Jun 27 19:55:17 2009 -0400
+++ b/src/lib-storage/index/maildir/maildir-storage.c Sat Jun 27 20:39:30 2009 -0400
@@ -6,6 +6,7 @@
#include "hostpid.h"
#include "str.h"
#include "mkdir-parents.h"
+#include "eacces-error.h"
#include "unlink-directory.h"
#include "unlink-old-files.h"
#include "mailbox-uidvalidity.h"
@@ -298,8 +299,9 @@ static bool maildir_autodetect(const cha
return TRUE;
}
-static int mkdir_verify(struct mail_storage *storage,
- const char *dir, mode_t mode, gid_t gid, bool verify)
+static int mkdir_verify(struct mail_storage *storage, const char *dir,
+ mode_t mode, gid_t gid, const char *gid_origin,
+ bool verify)
{
struct stat st;
@@ -314,7 +316,7 @@ static int mkdir_verify(struct mail_stor
}
More information about the dovecot-cvs
mailing list