From 93cb5802efc43873297d8310603e65a31ebfa019 Mon Sep 17 00:00:00 2001 From: Aki Tuomi Date: Tue, 11 Jul 2017 10:45:16 +0300 Subject: [PATCH] lib-storage: Remove user namespaces on hook error If there is a hook error during namespaces added remove the namespaces from user. This avoids attempts to use the namespaces later on without proper initialization. --- src/lib-storage/mail-namespace.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/lib-storage/mail-namespace.c b/src/lib-storage/mail-namespace.c index c1a8f68eef..26bc961c42 100644 --- a/src/lib-storage/mail-namespace.c +++ b/src/lib-storage/mail-namespace.c @@ -370,26 +370,30 @@ int mail_namespaces_init_finish(struct mail_namespace *namespaces, if (namespaces->user->autocreated) { /* e.g. raw user - don't check namespaces' validity */ } else if (!namespaces_check(namespaces, error_r)) { - *error_r = t_strconcat("namespace configuration error: ", - *error_r, NULL); - while (namespaces != NULL) { - ns = namespaces; - namespaces = ns->next; - mail_namespace_free(ns); - } - return -1; + namespaces->user->error = + t_strconcat("namespace configuration error: ", + *error_r, NULL); } - mail_user_add_namespace(namespaces->user, &namespaces); - T_BEGIN { - hook_mail_namespaces_created(namespaces); - } T_END; + if (namespaces->user->error == NULL) { + mail_user_add_namespace(namespaces->user, &namespaces); + T_BEGIN { + hook_mail_namespaces_created(namespaces); + } T_END; + } /* allow namespace hooks to return failure via the user error */ if (namespaces->user->error != NULL) { + namespaces->user->namespaces = NULL; *error_r = t_strdup(namespaces->user->error); + while (namespaces != NULL) { + ns = namespaces; + namespaces = ns->next; + mail_namespace_free(ns); + } return -1; } + namespaces->user->namespaces_created = TRUE; return 0; }