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 ) {