diff src/lib-imap/imap-bodystructure.c @ 898:0d5be52d7131 HEAD

Use unsigned char* when accessing non-NUL terminating strings. Compiler warnings would then notify about accidentally passing them to functions which require them NUL-terminated. Changed a few functions to use void* to avoid unneeded casting.
author Timo Sirainen <tss@iki.fi>
date Sat, 04 Jan 2003 19:26:29 +0200
parents e27267f227e6
children fd8888f6f037
line wrap: on
line diff
--- a/src/lib-imap/imap-bodystructure.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-imap/imap-bodystructure.c	Sat Jan 04 19:26:29 2003 +0200
@@ -33,7 +33,7 @@
 static void part_write_bodystructure(MessagePart *part, String *str,
 				     int extended);
 
-static void parse_content_type(const char *value, size_t value_len,
+static void parse_content_type(const unsigned char *value, size_t value_len,
 			       void *context)
 {
         MessagePartBodyData *data = context;
@@ -57,8 +57,8 @@
 	}
 }
 
-static void parse_save_params_list(const char *name, size_t name_len,
-				   const char *value, size_t value_len,
+static void parse_save_params_list(const unsigned char *name, size_t name_len,
+				   const unsigned char *value, size_t value_len,
 				   int value_quoted __attr_unused__,
 				   void *context)
 {
@@ -76,8 +76,8 @@
 	str_append_c(data->str, '"');
 }
 
-static void parse_content_transfer_encoding(const char *value, size_t value_len,
-					    void *context)
+static void parse_content_transfer_encoding(const unsigned char *value,
+					    size_t value_len, void *context)
 {
         MessagePartBodyData *data = context;
 
@@ -85,8 +85,8 @@
 		imap_quote_value(data->pool, value, value_len);
 }
 
-static void parse_content_disposition(const char *value, size_t value_len,
-				      void *context)
+static void parse_content_disposition(const unsigned char *value,
+				      size_t value_len, void *context)
 {
         MessagePartBodyData *data = context;
 
@@ -94,7 +94,7 @@
 		imap_quote_value(data->pool, value, value_len);
 }
 
-static void parse_content_language(const char *value, size_t value_len,
+static void parse_content_language(const unsigned char *value, size_t value_len,
 				   MessagePartBodyData *data)
 {
 	Rfc822TokenizeContext *ctx;
@@ -149,8 +149,8 @@
 }
 
 static void parse_header(MessagePart *part,
-			 const char *name, size_t name_len,
-			 const char *value, size_t value_len,
+			 const unsigned char *name, size_t name_len,
+			 const unsigned char *value, size_t value_len,
 			 void *context)
 {
 	Pool pool = context;
@@ -160,7 +160,7 @@
 	parent_rfc822 = part->parent != NULL &&
 		(part->parent->flags & MESSAGE_PART_FLAG_MESSAGE_RFC822);
 	if (!parent_rfc822 && (name_len <= 8 ||
-			       strncasecmp(name, "Content-", 8) != 0))
+			       memcasecmp(name, "Content-", 8) != 0))
 		return;
 
 	if (part->context == NULL) {
@@ -173,48 +173,74 @@
 
 	t_push();
 
-	/* fix the name to be \0-terminated */
-	name = t_strndup(name, name_len);
+	switch (name_len) {
+	case 10:
+		if (memcasecmp(name, "Content-ID", 10) == 0 &&
+		    part_data->content_id == NULL) {
+			part_data->content_id =
+				imap_quote_value(pool, value, value_len);
+		}
+		break;
 
-	if (strcasecmp(name, "Content-Type") == 0 &&
-	    part_data->content_type == NULL) {
+	case 11:
+		if (memcasecmp(name, "Content-MD5", 11) == 0 &&
+		    part_data->content_md5 == NULL) {
+			part_data->content_md5 =
+				imap_quote_value(pool, value, value_len);
+		}
+		break;
+
+	case 12:
+		if (memcasecmp(name, "Content-Type", 12) != 0 ||
+		    part_data->content_type != NULL)
+			break;
+
 		part_data->str = t_str_new(256);
 		message_content_parse_header(value, value_len,
 					     parse_content_type,
 					     parse_save_params_list, part_data);
 		part_data->content_type_params =
 			p_strdup_empty(pool, str_c(part_data->str));
-	} else if (strcasecmp(name, "Content-Transfer-Encoding") == 0 &&
-		   part_data->content_transfer_encoding == NULL) {
+		break;
+
+	case 16:
+		if (memcasecmp(name, "Content-Language", 16) == 0)
+			parse_content_language(value, value_len, part_data);
+		break;
+
+	case 19:
+		if (memcasecmp(name, "Content-Description", 19) == 0 &&
+		    part_data->content_description == NULL) {
+			part_data->content_description =
+				imap_quote_value(pool, value, value_len);
+		}
+		if (memcasecmp(name, "Content-Disposition", 19) == 0 &&
+		    part_data->content_disposition_params == NULL) {
+			part_data->str = t_str_new(256);
+			message_content_parse_header(value, value_len,
+						     parse_content_disposition,
+						     parse_save_params_list,
+						     part_data);
+			part_data->content_disposition_params =
+				p_strdup_empty(pool, str_c(part_data->str));
+		}
+		break;
+
+	case 25:
+		if (memcasecmp(name, "Content-Transfer-Encoding", 25) != 0 ||
+		    part_data->content_transfer_encoding != NULL)
+			break;
+
 		message_content_parse_header(value, value_len,
 					     parse_content_transfer_encoding,
 					     NULL, part_data);
-	} else if (strcasecmp(name, "Content-ID") == 0 &&
-		   part_data->content_id == NULL) {
-		part_data->content_id =
-			imap_quote_value(pool, value, value_len);
-	} else if (strcasecmp(name, "Content-Description") == 0 &&
-		   part_data->content_description == NULL) {
-		part_data->content_description =
-			imap_quote_value(pool, value, value_len);
-	} else if (strcasecmp(name, "Content-Disposition") == 0 &&
-		   part_data->content_disposition_params == NULL) {
-		part_data->str = t_str_new(256);
-		message_content_parse_header(value, value_len,
-					     parse_content_disposition,
-					     parse_save_params_list, part_data);
-		part_data->content_disposition_params =
-			p_strdup_empty(pool, str_c(part_data->str));
-	} else if (strcasecmp(name, "Content-Language") == 0) {
-		parse_content_language(value, value_len, part_data);
-	} else if (strcasecmp(name, "Content-MD5") == 0 &&
-		   part_data->content_md5 == NULL) {
-		part_data->content_md5 =
-			imap_quote_value(pool, value, value_len);
-	} else if (parent_rfc822) {
+		break;
+	}
+
+	if (parent_rfc822) {
 		/* message/rfc822, we need the envelope */
 		imap_envelope_parse_header(pool, &part_data->envelope,
-					   name, value, value_len);
+					   name, name_len, value, value_len);
 	}
 	t_pop();
 }