From 51cf7daaa80d476a526fb7eef7bb38bc85726b06 Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan@rename-it.nl> Date: Wed, 5 Aug 2009 13:18:08 +0200 Subject: [PATCH] Be explicit about signedness of data in binary code representation. Some architectures, like ARM, differ in this respect. --- src/lib-sieve/sieve-binary.c | 13 +++++++------ src/lib-sieve/sieve-binary.h | 2 +- src/lib-sieve/sieve-code.c | 2 +- src/lib-sieve/sieve-code.h | 3 ++- src/lib-sieve/sieve-interpreter.c | 2 +- 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/lib-sieve/sieve-binary.c b/src/lib-sieve/sieve-binary.c index bf321a120..9ae7465e5 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 f42b4481b..11f48f5e9 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 35d2c58d1..3bb370d7f 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 984a1bc6a..fde950862 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 3edc2f94b..155d92667 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 ) { -- GitLab