From: Timo Sirainen Date: Mon, 22 Sep 2008 18:55:07 +0000 (+0300) Subject: Maildir++ quota: Create the missing directory using the correct permissions. X-Git-Tag: 1.2.alpha2~39 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=263457e5d159bd461d34ff4796ade7ba434f02b7;p=thirdparty%2Fdovecot%2Fcore.git Maildir++ quota: Create the missing directory using the correct permissions. --HG-- branch : HEAD --- diff --git a/src/plugins/quota/quota-maildir.c b/src/plugins/quota/quota-maildir.c index efd5e572ad..e7afb0f995 100644 --- a/src/plugins/quota/quota-maildir.c +++ b/src/plugins/quota/quota-maildir.c @@ -224,21 +224,23 @@ static int maildirsize_write(struct maildir_quota_root *root, const char *path) struct dotlock *dotlock; const char *p, *dir; string_t *str; - mode_t mode; - gid_t gid; + mode_t mode, dir_mode; + gid_t gid, dir_gid; int fd; i_assert(root->fd == -1); /* figure out what permissions we should use for maildirsize. use the inbox namespace's permissions if possible. */ - mode = 0600; - gid = (gid_t)-1; + mode = 0600; dir_mode = 0700; + gid = dir_gid = (gid_t)-1; storages = array_get(&root->root.quota->storages, &count); for (i = 0; i < count; i++) { if ((storages[i]->ns->flags & NAMESPACE_FLAG_INBOX) != 0) { mailbox_list_get_permissions(storages[i]->ns->list, &mode, &gid); + mailbox_list_get_dir_permissions(storages[i]->ns->list, + &dir_mode, &dir_gid); break; } } @@ -252,10 +254,16 @@ static int maildirsize_write(struct maildir_quota_root *root, const char *path) /* the control directory doesn't exist yet? create it */ p = strrchr(path, '/'); dir = t_strdup_until(path, p); - if (mkdir_parents(dir, 0700) < 0 && errno != EEXIST) { + if (mkdir_parents(dir, dir_mode) < 0 && errno != EEXIST) { i_error("mkdir_parents(%s) failed: %m", dir); return -1; } + if (dir_gid != (gid_t)-1) { + if (chown(dir, (uid_t)-1, dir_gid) < 0) { + i_error("chown(%s,-1,%ld) failed: %m", + dir, (long)dir_gid); + } + } fd = file_dotlock_open_mode(&dotlock_settings, path, DOTLOCK_CREATE_FLAG_NONBLOCK, mode, (uid_t)-1, gid, &dotlock);