diff --git a/src/lib-sieve/sieve-binary.c b/src/lib-sieve/sieve-binary.c index bf321a1202b48feeac82302ff52d5675d75397b6..9ae7465e58412bbfce1d8d1354b6e7f0341c309b 100644 --- a/src/lib-sieve/sieve-binary.c +++ b/src/lib-sieve/sieve-binary.c @@ -158,7 +158,7 @@ struct sieve_binary { /* Current block buffer: all emit and read functions act upon this buffer */ buffer_t *data; - const char *code; + const signed char *code; size_t code_size; }; @@ -1612,9 +1612,10 @@ void sieve_binary_emit_extension_object * Code retrieval */ -#define ADDR_CODE_AT(binary, address) (binary->code[*address]) -#define ADDR_DATA_AT(binary, address) ((unsigned char) (binary->code[*address])) -#define ADDR_BYTES_LEFT(binary, address) (binary->code_size - (*address)) +#define ADDR_CODE_AT(binary, address) ((signed char) ((binary)->code[*address])) +#define ADDR_DATA_AT(binary, address) ((unsigned char) ((binary)->code[*address])) +#define ADDR_POINTER(binary, address) ((const char *) (&(binary)->code[*address])) +#define ADDR_BYTES_LEFT(binary, address) ((binary)->code_size - (*address)) #define ADDR_JUMP(address, offset) (*address) += offset /* Literals */ @@ -1635,7 +1636,7 @@ bool sieve_binary_read_byte } bool sieve_binary_read_code - (struct sieve_binary *binary, sieve_size_t *address, int *code_r) + (struct sieve_binary *binary, sieve_size_t *address, signed int *code_r) { if ( ADDR_BYTES_LEFT(binary, address) >= 1 ) { if ( code_r != NULL ) @@ -1713,7 +1714,7 @@ bool sieve_binary_read_string return FALSE; if ( str_r != NULL ) - *str_r = t_str_new_const(&ADDR_CODE_AT(binary, address), strlen); + *str_r = t_str_new_const(ADDR_POINTER(binary, address), strlen); ADDR_JUMP(address, strlen); if ( ADDR_CODE_AT(binary, address) != 0 ) diff --git a/src/lib-sieve/sieve-binary.h b/src/lib-sieve/sieve-binary.h index f42b4481b255b6f91b12b51bfd2214ab5ef48510..11f48f5e948e10a37ace9c98bbb842fd15f8e630 100644 --- a/src/lib-sieve/sieve-binary.h +++ b/src/lib-sieve/sieve-binary.h @@ -162,7 +162,7 @@ void sieve_binary_emit_extension_object bool sieve_binary_read_byte (struct sieve_binary *binary, sieve_size_t *address, unsigned int *byte_r); bool sieve_binary_read_code - (struct sieve_binary *binary, sieve_size_t *address, int *code_r); + (struct sieve_binary *binary, sieve_size_t *address, signed int *code_r); bool sieve_binary_read_offset (struct sieve_binary *binary, sieve_size_t *address, int *offset_r); bool sieve_binary_read_integer diff --git a/src/lib-sieve/sieve-code.c b/src/lib-sieve/sieve-code.c index 35d2c58d18889b50a4217899651a53f253279400..3bb370d7f4102ced533c389c4a593e0647858a1a 100644 --- a/src/lib-sieve/sieve-code.c +++ b/src/lib-sieve/sieve-code.c @@ -266,7 +266,7 @@ bool sieve_operand_optional_present } bool sieve_operand_optional_read -(struct sieve_binary *sbin, sieve_size_t *address, int *id_code) +(struct sieve_binary *sbin, sieve_size_t *address, signed int *id_code) { if ( sieve_binary_read_code(sbin, address, id_code) ) return TRUE; diff --git a/src/lib-sieve/sieve-code.h b/src/lib-sieve/sieve-code.h index 984a1bc6a72ec604a7fbe5f382b43c70e2c3d8f9..fde95086233578b2a855b37c6142ad937b2da631 100644 --- a/src/lib-sieve/sieve-code.h +++ b/src/lib-sieve/sieve-code.h @@ -70,7 +70,8 @@ const struct sieve_operand *sieve_operand_read bool sieve_operand_optional_present (struct sieve_binary *sbin, sieve_size_t *address); bool sieve_operand_optional_read - (struct sieve_binary *sbin, sieve_size_t *address, int *id_code); + (struct sieve_binary *sbin, sieve_size_t *address, + signed int *id_code); /* * Core operands diff --git a/src/lib-sieve/sieve-interpreter.c b/src/lib-sieve/sieve-interpreter.c index 3edc2f94b94feae9af6857bbd8f098003ff9f37d..155d92667df05a2c9cd2292b1a00723542f747fd 100644 --- a/src/lib-sieve/sieve-interpreter.c +++ b/src/lib-sieve/sieve-interpreter.c @@ -384,7 +384,7 @@ int sieve_interpreter_handle_optional_operands (const struct sieve_runtime_env *renv, sieve_size_t *address, struct sieve_side_effects_list **list) { - int opt_code = -1; + signed int opt_code = -1; if ( sieve_operand_optional_present(renv->sbin, address) ) { while ( opt_code != 0 ) {