]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
master: login dir was created with wrong group.
authorTimo Sirainen <tss@iki.fi>
Tue, 16 Mar 2010 12:39:02 +0000 (14:39 +0200)
committerTimo Sirainen <tss@iki.fi>
Tue, 16 Mar 2010 12:39:02 +0000 (14:39 +0200)
--HG--
branch : HEAD

src/master/master-settings.c
src/master/service.c

index acd2dc1aabed8d01a0c5cc9fcc384a49bf0ef6cf..9b46e58576db04a9713ac430935d666d9ec73e63 100644 (file)
@@ -234,12 +234,25 @@ const struct setting_parser_info master_setting_parser_info = {
 };
 
 /* <settings checks> */
-static void fix_file_listener_paths(ARRAY_TYPE(file_listener_settings) *l,
-                                   pool_t pool, const char *base_dir,
-                                   ARRAY_TYPE(const_string) *all_listeners)
+static void
+expand_user(const char **user, const struct master_settings *set)
+{
+       /* $variable expansion is typically done by doveconf, but these
+          variables can come from built-in settings, so we need to expand
+          them here */
+       if (strcmp(*user, "$default_internal_user") == 0)
+               *user = set->default_internal_user;
+       else if (strcmp(*user, "$default_login_user") == 0)
+               *user = set->default_login_user;
+}
+
+static void
+fix_file_listener_paths(ARRAY_TYPE(file_listener_settings) *l,
+                       pool_t pool, const struct master_settings *master_set,
+                       ARRAY_TYPE(const_string) *all_listeners)
 {
        struct file_listener_settings *const *sets;
-       unsigned int base_dir_len = strlen(base_dir);
+       unsigned int base_dir_len = strlen(master_set->base_dir);
 
        if (!array_is_created(l))
                return;
@@ -247,10 +260,12 @@ static void fix_file_listener_paths(ARRAY_TYPE(file_listener_settings) *l,
        array_foreach(l, sets) {
                struct file_listener_settings *set = *sets;
 
+               expand_user(&set->user, master_set);
                if (*set->path != '/') {
-                       set->path = p_strconcat(pool, base_dir, "/",
+                       set->path = p_strconcat(pool, master_set->base_dir, "/",
                                                set->path, NULL);
-               } else if (strncmp(set->path, base_dir, base_dir_len) == 0 &&
+               } else if (strncmp(set->path, master_set->base_dir,
+                                  base_dir_len) == 0 &&
                           set->path[base_dir_len] == '/') {
                        i_warning("You should remove base_dir prefix from "
                                  "unix_listener: %s", set->path);
@@ -372,6 +387,7 @@ master_settings_verify(void *_set, pool_t pool, const char **error_r)
                                return FALSE;
                        }
                }
+               expand_user(&service->user, set);
                service_set_login_dump_core(service);
        }
 
@@ -411,9 +427,9 @@ master_settings_verify(void *_set, pool_t pool, const char **error_r)
                        return FALSE;
                }
                fix_file_listener_paths(&service->unix_listeners,
-                                       pool, set->base_dir, &all_listeners);
+                                       pool, set, &all_listeners);
                fix_file_listener_paths(&service->fifo_listeners,
-                                       pool, set->base_dir, &all_listeners);
+                                       pool, set, &all_listeners);
                add_inet_listeners(&service->inet_listeners, &all_listeners);
        }
 
index f9da62b9581c150ed1286e689501776ef5c9c472..c6a467cc624da0c4d9fbdbf094ef1e8d77d1b67e 100644 (file)
@@ -31,20 +31,6 @@ void service_error(struct service *service, const char *format, ...)
        va_end(args);
 }
 
-static int
-get_uidgid_expanded(const char *user, const struct master_settings *set,
-                   uid_t *uid_r, gid_t *gid_r, const char **error_r)
-{
-       /* $variable expansion is typically done by doveconf, but these
-          variables can come from built-in settings, so we need to expand
-          them here */
-       if (strcmp(user, "$default_internal_user") == 0)
-               user = set->default_internal_user;
-       else if (strcmp(user, "$default_login_user") == 0)
-               user = set->default_login_user;
-       return get_uidgid(user, uid_r, gid_r, error_r);
-}
-
 static struct service_listener *
 service_create_file_listener(struct service *service,
                             enum service_listener_type type,
@@ -60,8 +46,7 @@ service_create_file_listener(struct service *service,
        l->fd = -1;
        l->set.fileset.set = set;
 
-       if (get_uidgid_expanded(set->user, service->set->master_set,
-                               &l->set.fileset.uid, &gid, error_r) < 0)
+       if (get_uidgid(set->user, &l->set.fileset.uid, &gid, error_r) < 0)
                return NULL;
        if (get_gid(set->group, &l->set.fileset.gid, error_r) < 0)
                return NULL;
@@ -216,8 +201,7 @@ service_create(pool_t pool, const struct service_settings *set,
        }
 
        /* default gid to user's primary group */
-       if (get_uidgid_expanded(set->user, set->master_set, &service->uid,
-                               &service->gid, error_r) < 0)
+       if (get_uidgid(set->user, &service->uid, &service->gid, error_r) < 0)
                return NULL;
        if (*set->group != '\0') {
                if (get_gid(set->group, &service->gid, error_r) < 0)