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