From 002179a890bf4f1942cad6463787719eaa9fd6c0 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Tue, 16 Nov 2010 19:51:46 +0000 Subject: [PATCH] Fixed home=/home/./user style chrooting to work again. --- src/lib-storage/mail-storage-service.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/lib-storage/mail-storage-service.c b/src/lib-storage/mail-storage-service.c index 49f618c7a3..cd99f50d75 100644 --- a/src/lib-storage/mail-storage-service.c +++ b/src/lib-storage/mail-storage-service.c @@ -167,7 +167,9 @@ user_reply_handle(struct mail_storage_service_ctx *ctx, const struct auth_user_reply *reply, const char **error_r) { - const char *const *str, *line; + const char *home = reply->home; + const char *chroot = reply->chroot; + const char *const *str, *line, *p; unsigned int i, count; int ret = 0; @@ -181,18 +183,26 @@ user_reply_handle(struct mail_storage_service_ctx *ctx, if (reply->gid != (uid_t)-1) set_keyval(ctx, user, "mail_gid", dec2str(reply->gid)); - if (reply->home != NULL) + if (home != NULL && chroot == NULL && + *user->user_set->valid_chroot_dirs != '\0' && + (p = strstr(home, "/./")) != NULL) { + /* wu-ftpd like /./ - check only if there's even + a possibility of using them (non-empty valid_chroot_dirs) */ + chroot = t_strdup_until(home, p); + home = p + 2; + } + + if (home != NULL) set_keyval(ctx, user, "mail_home", reply->home); - if (reply->chroot != NULL) { - if (!validate_chroot(user->user_set, reply->chroot)) { + if (chroot != NULL) { + if (!validate_chroot(user->user_set, chroot)) { *error_r = t_strdup_printf( "userdb returned invalid chroot directory: %s " - "(see valid_chroot_dirs setting)", - reply->chroot); + "(see valid_chroot_dirs setting)", chroot); return -1; } - set_keyval(ctx, user, "mail_chroot", reply->chroot); + set_keyval(ctx, user, "mail_chroot", chroot); } str = array_get(&reply->extra_fields, &count); -- 2.47.3