diff --git a/src/lib-sieve/sieve-binary-file.c b/src/lib-sieve/sieve-binary-file.c index 9936965bd14f8b5299748ccc764bb419ddaf5c0f..a28f36a6f4b84b306c45b688248253b9ba3f00f7 100644 --- a/src/lib-sieve/sieve-binary-file.c +++ b/src/lib-sieve/sieve-binary-file.c @@ -909,9 +909,9 @@ _sieve_binary_open(struct sieve_binary *sbin, enum sieve_error *error_code_r) return TRUE; } -struct sieve_binary * -sieve_binary_open(struct sieve_instance *svinst, const char *path, - struct sieve_script *script, enum sieve_error *error_code_r) +int sieve_binary_open(struct sieve_instance *svinst, const char *path, + struct sieve_script *script, struct sieve_binary **sbin_r, + enum sieve_error *error_code_r) { struct sieve_binary_extension_reg *const *regs; unsigned int ext_count, i; @@ -919,6 +919,7 @@ sieve_binary_open(struct sieve_instance *svinst, const char *path, struct sieve_binary_file *file; i_assert(script == NULL || sieve_script_svinst(script) == svinst); + *sbin_r = NULL; /* Create binary object */ sbin = sieve_binary_create(svinst, script); @@ -926,7 +927,7 @@ sieve_binary_open(struct sieve_instance *svinst, const char *path, if (sieve_binary_file_open(sbin, path, &file, error_code_r) < 0) { sieve_binary_unref(&sbin); - return NULL; + return -1; } sbin->file = file; @@ -937,7 +938,7 @@ sieve_binary_open(struct sieve_instance *svinst, const char *path, if (!_sieve_binary_open(sbin, error_code_r)) { sieve_binary_unref(&sbin); - return NULL; + return -1; } sieve_binary_activate(sbin); @@ -954,10 +955,12 @@ sieve_binary_open(struct sieve_instance *svinst, const char *path, if (error_code_r != NULL) *error_code_r = SIEVE_ERROR_NOT_VALID; sieve_binary_unref(&sbin); - return NULL; + return -1; } } - return sbin; + + *sbin_r = sbin; + return 0; } int sieve_binary_check_executable(struct sieve_binary *sbin, diff --git a/src/lib-sieve/sieve-binary.h b/src/lib-sieve/sieve-binary.h index adff6c5c789d450a38245dead6256959b7226e7c..e9397b58e9dd5801e2f284358f109e38113a287f 100644 --- a/src/lib-sieve/sieve-binary.h +++ b/src/lib-sieve/sieve-binary.h @@ -79,9 +79,9 @@ int sieve_binary_save(struct sieve_binary *sbin, const char *path, bool update, * Loading the binary */ -struct sieve_binary * -sieve_binary_open(struct sieve_instance *svinst, const char *path, - struct sieve_script *script, enum sieve_error *error_code_r); +int sieve_binary_open(struct sieve_instance *svinst, const char *path, + struct sieve_script *script, struct sieve_binary **sbin_r, + enum sieve_error *error_code_r); bool sieve_binary_up_to_date(struct sieve_binary *sbin, enum sieve_compile_flags cpflags); diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c index 6d61a0eef053c59c154d27e89e0a57808df2119a..1e8cd09cb5f259ae01c109a39edf95bf1f5f2299 100644 --- a/src/lib-sieve/sieve.c +++ b/src/lib-sieve/sieve.c @@ -375,7 +375,11 @@ struct sieve_binary * sieve_load(struct sieve_instance *svinst, const char *bin_path, enum sieve_error *error_code_r) { - return sieve_binary_open(svinst, bin_path, NULL, error_code_r); + struct sieve_binary *sbin; + + if (sieve_binary_open(svinst, bin_path, NULL, &sbin, error_code_r) < 0) + return NULL; + return sbin; } static struct sieve_binary * diff --git a/src/lib-sieve/storage/dict/sieve-dict-script.c b/src/lib-sieve/storage/dict/sieve-dict-script.c index e60fc783315a5c40c31b3c3a41d73be1d10943f1..9ea88710c5b12b518adc39ce997d4ad6345b4664 100644 --- a/src/lib-sieve/storage/dict/sieve-dict-script.c +++ b/src/lib-sieve/storage/dict/sieve-dict-script.c @@ -230,12 +230,15 @@ sieve_dict_script_binary_load(struct sieve_script *script, { struct sieve_dict_script *dscript = container_of(script, struct sieve_dict_script, script); + struct sieve_binary *sbin; if (sieve_dict_script_get_binpath(dscript) == NULL) return NULL; - return sieve_binary_open(script->storage->svinst, dscript->binpath, - script, error_code_r); + if (sieve_binary_open(script->storage->svinst, dscript->binpath, + script, &sbin, error_code_r) < 0) + return NULL; + return sbin; } static int diff --git a/src/lib-sieve/storage/file/sieve-file-script.c b/src/lib-sieve/storage/file/sieve-file-script.c index c76c84844762c56079a0e8be282064851e655807..910cb7354b40778ca1b40cce4ae75e87fe9cdd87 100644 --- a/src/lib-sieve/storage/file/sieve-file-script.c +++ b/src/lib-sieve/storage/file/sieve-file-script.c @@ -538,9 +538,12 @@ sieve_file_script_binary_load(struct sieve_script *script, struct sieve_file_script *fscript = container_of(script, struct sieve_file_script, script); struct sieve_instance *svinst = script->storage->svinst; + struct sieve_binary *sbin; - return sieve_binary_open(svinst, fscript->binpath, script, - error_code_r); + if (sieve_binary_open(svinst, fscript->binpath, script, + &sbin, error_code_r) < 0) + return NULL; + return sbin; } static int diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-script.c b/src/lib-sieve/storage/ldap/sieve-ldap-script.c index d8020cd18995ce02c224befae041fc7dd15cecb5..027e0f21ca746e53455f0d890bf16f657c30207b 100644 --- a/src/lib-sieve/storage/ldap/sieve-ldap-script.c +++ b/src/lib-sieve/storage/ldap/sieve-ldap-script.c @@ -253,12 +253,15 @@ sieve_ldap_script_binary_load(struct sieve_script *script, struct sieve_storage *storage = script->storage; struct sieve_ldap_script *lscript = container_of(script, struct sieve_ldap_script, script); + struct sieve_binary *sbin; if (sieve_ldap_script_get_binpath(lscript) == NULL) return NULL; - return sieve_binary_open(storage->svinst, lscript->binpath, script, - error_code_r); + if (sieve_binary_open(storage->svinst, lscript->binpath, script, + &sbin, error_code_r) < 0) + return NULL; + return sbin; } static int