From: Timo Sirainen Date: Tue, 16 Mar 2010 12:39:02 +0000 (+0200) Subject: master: login dir was created with wrong group. X-Git-Tag: 2.0.beta4~53 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=15e7d6a8bfdded94a283a55af8b436117311c4e8;p=thirdparty%2Fdovecot%2Fcore.git master: login dir was created with wrong group. --HG-- branch : HEAD --- diff --git a/src/master/master-settings.c b/src/master/master-settings.c index acd2dc1aab..9b46e58576 100644 --- a/src/master/master-settings.c +++ b/src/master/master-settings.c @@ -234,12 +234,25 @@ const struct setting_parser_info master_setting_parser_info = { }; /* */ -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); } diff --git a/src/master/service.c b/src/master/service.c index f9da62b958..c6a467cc62 100644 --- a/src/master/service.c +++ b/src/master/service.c @@ -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)