diff --git a/src/lib-sieve/plugins/include/ext-include-common.c b/src/lib-sieve/plugins/include/ext-include-common.c index f9eac908c8704da14347059fabff2d9a9de0da09..479ae5687b5dddf6268f31111fcb7531183453d4 100644 --- a/src/lib-sieve/plugins/include/ext-include-common.c +++ b/src/lib-sieve/plugins/include/ext-include-common.c @@ -142,11 +142,11 @@ ext_include_get_script_storage(const struct sieve_extension *ext, switch (location) { case EXT_INCLUDE_LOCATION_PERSONAL: - if (ctx->personal_storage == NULL) { - ctx->personal_storage = - sieve_storage_create_personal(svinst, NULL, 0, - error_code_r); - } + if (ctx->personal_storage == NULL && + sieve_storage_create_personal(svinst, NULL, 0, + &ctx->personal_storage, + error_code_r) < 0) + return NULL; return ctx->personal_storage; case EXT_INCLUDE_LOCATION_GLOBAL: if (ctx->global_location == NULL) { diff --git a/src/lib-sieve/sieve-storage.c b/src/lib-sieve/sieve-storage.c index 9db3a4ade61890b21edd234ad3ef41e2c5211893..8c3588ca95e5cbbac02085ab1fdc5e1d97bfe2d5 100644 --- a/src/lib-sieve/sieve-storage.c +++ b/src/lib-sieve/sieve-storage.c @@ -398,10 +398,11 @@ int sieve_storage_create(struct sieve_instance *svinst, const char *location, storage_r, error_code_r); } -static struct sieve_storage * +static int sieve_storage_do_create_personal(struct sieve_instance *svinst, struct mail_user *user, enum sieve_storage_flags flags, + struct sieve_storage **storage_r, enum sieve_error *error_code_r) { struct sieve_storage *storage = NULL; @@ -421,14 +422,14 @@ sieve_storage_do_create_personal(struct sieve_instance *svinst, e_debug(svinst->event, "storage: " "Personal storage is disabled (sieve=\"\")"); *error_code_r = SIEVE_ERROR_NOT_FOUND; - return NULL; + return -1; } data = set_sieve; if ((ret = sieve_storage_driver_parse(svinst, &data, &sieve_class)) < 0) { *error_code_r = SIEVE_ERROR_TEMP_FAILURE; - return NULL; + return -1; } if (ret > 0) { @@ -436,7 +437,7 @@ sieve_storage_do_create_personal(struct sieve_instance *svinst, if (sieve_storage_init(svinst, sieve_class, data, flags, TRUE, &storage, error_code_r) < 0) - return NULL; + return -1; } /* No driver name */ @@ -445,12 +446,12 @@ sieve_storage_do_create_personal(struct sieve_instance *svinst, if (storage == NULL) { if (sieve_file_storage_init_default(svinst, set_sieve, flags, &storage, error_code_r) < 0) - return NULL; + return -1; i_assert(storage != NULL); } if (storage == NULL) - return NULL; + return -1; (void)sieve_storage_sync_init(storage, user); @@ -478,19 +479,22 @@ sieve_storage_do_create_personal(struct sieve_instance *svinst, "Script count limit: %llu scripts", (unsigned long long int) storage->max_scripts); } - return storage; + *storage_r = storage; + return 0; } -struct sieve_storage * -sieve_storage_create_personal(struct sieve_instance *svinst, - struct mail_user *user, - enum sieve_storage_flags flags, - enum sieve_error *error_code_r) +int sieve_storage_create_personal(struct sieve_instance *svinst, + struct mail_user *user, + enum sieve_storage_flags flags, + struct sieve_storage **storage_r, + enum sieve_error *error_code_r) { - struct sieve_storage *storage; + struct sieve_storage *storage = NULL; const char *set_enabled, *set_default, *set_default_name; enum sieve_error error_code; + int ret; + *storage_r = NULL; if (error_code_r != NULL) *error_code_r = SIEVE_ERROR_NONE; else @@ -502,16 +506,16 @@ sieve_storage_create_personal(struct sieve_instance *svinst, e_debug(svinst->event, "Sieve is disabled for this user"); *error_code_r = SIEVE_ERROR_NOT_POSSIBLE; - return NULL; + return -1; } /* Determine location for default script */ set_default = sieve_setting_get(svinst, "sieve_default"); /* Attempt to locate user's main storage */ - storage = sieve_storage_do_create_personal(svinst, user, flags, - error_code_r); - if (storage != NULL) { + ret = sieve_storage_do_create_personal(svinst, user, flags, + &storage, error_code_r); + if (ret == 0) { /* Success; record default script location for later use */ storage->default_location = p_strdup_empty(storage->pool, set_default); @@ -548,8 +552,9 @@ sieve_storage_create_personal(struct sieve_instance *svinst, "Trying default script location '%s'", set_default); - if (sieve_storage_create(svinst, set_default, 0, - &storage, error_code_r) < 0) { + ret = sieve_storage_create(svinst, set_default, 0, + &storage, error_code_r); + if (ret < 0) { switch (*error_code_r) { case SIEVE_ERROR_NOT_FOUND: e_debug(svinst->event, "storage: " @@ -573,7 +578,8 @@ sieve_storage_create_personal(struct sieve_instance *svinst, if (storage != NULL) storage->is_default = TRUE; } - return storage; + *storage_r = storage; + return ret; } void sieve_storage_ref(struct sieve_storage *storage) diff --git a/src/lib-sieve/sieve-storage.h b/src/lib-sieve/sieve-storage.h index a4ad973460f513974f9fc43ae520357604e0c95c..ffb25a0861ade4871cc591106eea094150ce9fbf 100644 --- a/src/lib-sieve/sieve-storage.h +++ b/src/lib-sieve/sieve-storage.h @@ -29,11 +29,11 @@ int sieve_storage_create(struct sieve_instance *svinst, const char *location, enum sieve_storage_flags flags, struct sieve_storage **storage_r, enum sieve_error *error_code_r); -struct sieve_storage * -sieve_storage_create_personal(struct sieve_instance *svinst, - struct mail_user *user, - enum sieve_storage_flags flags, - enum sieve_error *error_code_r); +int sieve_storage_create_personal(struct sieve_instance *svinst, + struct mail_user *user, + enum sieve_storage_flags flags, + struct sieve_storage **storage_r, + enum sieve_error *error_code_r); void sieve_storage_ref(struct sieve_storage *storage); void sieve_storage_unref(struct sieve_storage **_storage); diff --git a/src/managesieve/managesieve-client.c b/src/managesieve/managesieve-client.c index f6627d8acceee04b712786c73ca06e2805d2cdd6..3a23226fbeb23bab2305c1004b6341979c36bb38 100644 --- a/src/managesieve/managesieve-client.c +++ b/src/managesieve/managesieve-client.c @@ -71,10 +71,9 @@ client_get_storage(struct sieve_instance *svinst, struct event *event, /* Open personal script storage */ - storage = sieve_storage_create_personal(svinst, user, - SIEVE_STORAGE_FLAG_READWRITE, - &error_code); - if (storage == NULL) { + if (sieve_storage_create_personal(svinst, user, + SIEVE_STORAGE_FLAG_READWRITE, + &storage, &error_code) < 0) { switch (error_code) { case SIEVE_ERROR_NOT_POSSIBLE: byemsg = "BYE \"Sieve processing is disabled for this user.\"\r\n"; diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c b/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c index c851e5f28e0c847cbd702f4c5c2a7273ec4b51ba..7d98d1e02a52faf55125212950c203e90b67632d 100644 --- a/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c +++ b/src/plugins/doveadm-sieve/doveadm-sieve-cmd.c @@ -116,9 +116,9 @@ doveadm_sieve_cmd_run(struct doveadm_mail_cmd_context *_ctx, user->set->mail_debug, &ctx->svinst) < 0) return -1; - ctx->storage = sieve_storage_create_personal( - ctx->svinst, user, SIEVE_STORAGE_FLAG_READWRITE, &error_code); - if (ctx->storage == NULL) { + if (sieve_storage_create_personal(ctx->svinst, user, + SIEVE_STORAGE_FLAG_READWRITE, + &ctx->storage, &error_code) < 0) { switch (error_code) { case SIEVE_ERROR_NOT_POSSIBLE: error_code = SIEVE_ERROR_NOT_FOUND; diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-sync.c b/src/plugins/doveadm-sieve/doveadm-sieve-sync.c index 3d23e8e7602f1915abfa8c900e06c44e0c49bd9f..64c4d326e252d2ecca0308320df6b2cee1aa839b 100644 --- a/src/plugins/doveadm-sieve/doveadm-sieve-sync.c +++ b/src/plugins/doveadm-sieve/doveadm-sieve-sync.c @@ -98,10 +98,9 @@ mail_sieve_user_init(struct mail_user *user, struct sieve_storage **svstorage_r) user->set->mail_debug, &suser->svinst) < 0) return -1; - suser->sieve_storage = - sieve_storage_create_personal(suser->svinst, user, - storage_flags, &error_code); - if (suser->sieve_storage == NULL) { + if (sieve_storage_create_personal(suser->svinst, user, storage_flags, + &suser->sieve_storage, + &error_code) < 0) { switch (error_code) { /* Sieve disabled for user */ case SIEVE_ERROR_NOT_POSSIBLE: diff --git a/src/plugins/imap-filter-sieve/imap-filter-sieve.c b/src/plugins/imap-filter-sieve/imap-filter-sieve.c index c77220e21e2babdd2a052b71f345de322e189ba9..eb2c9caa04c5172d8cdf47f3707ac8ff8a0a0b8b 100644 --- a/src/plugins/imap-filter-sieve/imap-filter-sieve.c +++ b/src/plugins/imap-filter-sieve/imap-filter-sieve.c @@ -189,10 +189,9 @@ imap_filter_sieve_get_personal_storage(struct imap_filter_sieve_context *sctx, return -1; } - ifsuser->storage = sieve_storage_create_personal(svinst, user, - storage_flags, - &error_code); - if (ifsuser->storage != NULL) { + if (sieve_storage_create_personal(svinst, user, storage_flags, + &ifsuser->storage, + &error_code) == 0) { *storage_r = ifsuser->storage; return 0; } diff --git a/src/plugins/imapsieve/imap-sieve.c b/src/plugins/imapsieve/imap-sieve.c index 935a6f89745e187ab43a70563cfff2d332d316e9..54631d7012d4c680a0e9113775e26e48f74f5e70 100644 --- a/src/plugins/imapsieve/imap-sieve.c +++ b/src/plugins/imapsieve/imap-sieve.c @@ -143,10 +143,8 @@ imap_sieve_get_storage(struct imap_sieve *isieve, return -1; } - isieve->storage = sieve_storage_create_personal(isieve->svinst, user, - storage_flags, - &error_code); - if (isieve->storage == NULL) { + if (sieve_storage_create_personal(isieve->svinst, user, storage_flags, + &isieve->storage, &error_code) < 0) { if (error_code == SIEVE_ERROR_TEMP_FAILURE) return -1; return 0; diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c index 3695574d1b85c482569882d20f14718c22e1277b..8dba440d953181efc6c292ace76e5afc93176165 100644 --- a/src/plugins/lda-sieve/lda-sieve-plugin.c +++ b/src/plugins/lda-sieve/lda-sieve-plugin.c @@ -256,9 +256,8 @@ lda_sieve_get_personal_storage(struct sieve_instance *svinst, struct sieve_storage **storage_r, enum sieve_error *error_code_r) { - *storage_r = sieve_storage_create_personal(svinst, user, 0, - error_code_r); - if (*storage_r == NULL) { + if (sieve_storage_create_personal(svinst, user, 0, + storage_r, error_code_r) < 0) { switch (*error_code_r) { case SIEVE_ERROR_NOT_POSSIBLE: case SIEVE_ERROR_NOT_FOUND: