diff --git a/src/managesieve/main.c b/src/managesieve/main.c index 186f107c42bf9e3072de5c3f31477d2c90f7952a..25fe6bc2462d4d57fcf3fc496c9fab74ca22b2dc 100644 --- a/src/managesieve/main.c +++ b/src/managesieve/main.c @@ -178,7 +178,7 @@ client_create_from_input(const struct mail_storage_service_input *input, verbose_proctitle = TRUE; if (client_create(fd_in, fd_out, input->session_id, - event, mail_user, set, &client) < 0) { + event, mail_user, set, &client, error_r) < 0) { settings_free(set); mail_user_unref(&mail_user); event_unref(&event); diff --git a/src/managesieve/managesieve-client.c b/src/managesieve/managesieve-client.c index 5989413340f5a74a56181a4404dc3f3b35f1a70c..2c07afea6624fab5c24336ad4b9d54b53718fd1f 100644 --- a/src/managesieve/managesieve-client.c +++ b/src/managesieve/managesieve-client.c @@ -105,7 +105,7 @@ client_get_storage(struct sieve_instance *svinst, struct event *event, int client_create(int fd_in, int fd_out, const char *session_id, struct event *event, struct mail_user *user, const struct managesieve_settings *set, - struct client **client_r) + struct client **client_r, const char **error_r) { struct client *client; struct sieve_environment svenv; @@ -113,6 +113,9 @@ int client_create(int fd_in, int fd_out, const char *session_id, struct sieve_storage *storage; pool_t pool; + *client_r = NULL; + *error_r = NULL; + /* Initialize Sieve */ i_zero(&svenv); @@ -124,6 +127,10 @@ int client_create(int fd_in, int fd_out, const char *session_id, svinst = sieve_init(&svenv, &managesieve_sieve_callbacks, (void *) user, set->mail_debug); + if (svinst == NULL) { + *error_r = "Failed to initialize Sieve interpreter"; + return -1; + } /* Get Sieve storage */ diff --git a/src/managesieve/managesieve-client.h b/src/managesieve/managesieve-client.h index 4dad8b82ba7e80c28718e3d4cbe46f1c6475b71d..c06ccb50fd59480fb560e84994ee75e1bc716b63 100644 --- a/src/managesieve/managesieve-client.h +++ b/src/managesieve/managesieve-client.h @@ -94,7 +94,7 @@ extern unsigned int managesieve_client_count; int client_create(int fd_in, int fd_out, const char *session_id, struct event *event, struct mail_user *user, const struct managesieve_settings *set, - struct client **client_r); + struct client **client_r, const char **error_r); void client_create_finish(struct client *client); void client_destroy(struct client *client, const char *reason);