From 2df6d4b548ab733087db4ee48eb869f30d1d367f Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan@rename-it.nl> Date: Sun, 24 Aug 2014 00:27:40 +0200 Subject: [PATCH] lib-sieve: Added version to script storage class. Updated binary version. --- src/lib-sieve/sieve-binary.h | 2 +- src/lib-sieve/sieve-script.c | 19 +++++++++++++++++++ src/lib-sieve/sieve-storage-private.h | 2 ++ .../storage/dict/sieve-dict-storage.c | 1 + .../storage/file/sieve-file-storage.c | 1 + .../storage/ldap/sieve-ldap-storage.c | 1 + 6 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/lib-sieve/sieve-binary.h b/src/lib-sieve/sieve-binary.h index b118a6c50..dce5e49e9 100644 --- a/src/lib-sieve/sieve-binary.h +++ b/src/lib-sieve/sieve-binary.h @@ -13,7 +13,7 @@ */ #define SIEVE_BINARY_VERSION_MAJOR 1 -#define SIEVE_BINARY_VERSION_MINOR 1 +#define SIEVE_BINARY_VERSION_MINOR 2 /* * Binary object diff --git a/src/lib-sieve/sieve-script.c b/src/lib-sieve/sieve-script.c index 142c35530..1f70cce50 100644 --- a/src/lib-sieve/sieve-script.c +++ b/src/lib-sieve/sieve-script.c @@ -338,6 +338,7 @@ int sieve_script_binary_read_metadata { struct sieve_binary *sbin = sieve_binary_block_get_binary(sblock); string_t *storage_class, *location; + unsigned int version; if ( sieve_binary_block_get_size(sblock) - *offset == 0 ) return 0; @@ -353,6 +354,23 @@ int sieve_script_binary_read_metadata if ( strcmp(str_c(storage_class), script->driver_name) != 0 ) return 0; + /* version */ + if ( !sieve_binary_read_unsigned(sblock, offset, &version) ) { + sieve_script_sys_error(script, + "Binary %s has invalid metadata for script %s: " + "Invalid version", + sieve_binary_path(sbin), sieve_script_location(script)); + return -1; + } + if ( script->storage->version != version ) { + sieve_script_sys_debug(script, + "Binary %s was compiled with different version " + "of the `%s' script storage class (compiled v%d, expected v%d;" + "automatically fixed when re-compiled)", sieve_binary_path(sbin), + script->driver_name, version, script->storage->version); + return 0; + } + /* location */ if ( !sieve_binary_read_string(sblock, offset, &location) ) { sieve_script_sys_error(script, @@ -376,6 +394,7 @@ void sieve_script_binary_write_metadata (struct sieve_script *script, struct sieve_binary_block *sblock) { sieve_binary_emit_cstring(sblock, script->driver_name); + sieve_binary_emit_unsigned(sblock, script->storage->version); sieve_binary_emit_cstring(sblock, ( script->location == NULL ? "" : script->location )); diff --git a/src/lib-sieve/sieve-storage-private.h b/src/lib-sieve/sieve-storage-private.h index 163528433..5fd7787a6 100644 --- a/src/lib-sieve/sieve-storage-private.h +++ b/src/lib-sieve/sieve-storage-private.h @@ -93,6 +93,8 @@ struct sieve_storage { struct sieve_instance *svinst; const char *driver_name; + unsigned int version; + const struct sieve_storage *storage_class; struct sieve_storage_vfuncs v; diff --git a/src/lib-sieve/storage/dict/sieve-dict-storage.c b/src/lib-sieve/storage/dict/sieve-dict-storage.c index c89bee0ed..c859214ed 100644 --- a/src/lib-sieve/storage/dict/sieve-dict-storage.c +++ b/src/lib-sieve/storage/dict/sieve-dict-storage.c @@ -166,6 +166,7 @@ int sieve_dict_storage_active_script_get_name const struct sieve_storage sieve_dict_storage = { .driver_name = SIEVE_DICT_STORAGE_DRIVER_NAME, + .version = 0, .v = { .alloc = sieve_dict_storage_alloc, .destroy = sieve_dict_storage_destroy, diff --git a/src/lib-sieve/storage/file/sieve-file-storage.c b/src/lib-sieve/storage/file/sieve-file-storage.c index 2b7bf7461..b4c382a09 100644 --- a/src/lib-sieve/storage/file/sieve-file-storage.c +++ b/src/lib-sieve/storage/file/sieve-file-storage.c @@ -640,6 +640,7 @@ static struct sieve_script *sieve_file_storage_get_script const struct sieve_storage sieve_file_storage = { .driver_name = SIEVE_FILE_STORAGE_DRIVER_NAME, + .version = 0, .allows_synchronization = TRUE, .v = { .alloc = sieve_file_storage_alloc, diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-storage.c b/src/lib-sieve/storage/ldap/sieve-ldap-storage.c index adc5076df..3b8474418 100644 --- a/src/lib-sieve/storage/ldap/sieve-ldap-storage.c +++ b/src/lib-sieve/storage/ldap/sieve-ldap-storage.c @@ -158,6 +158,7 @@ const struct sieve_storage sieve_ldap_storage = { const struct sieve_storage sieve_ldap_storage_plugin = { #endif .driver_name = SIEVE_LDAP_STORAGE_DRIVER_NAME, + .version = 0, .v = { .alloc = sieve_ldap_storage_alloc, .init = sieve_ldap_storage_init, -- GitLab