# HG changeset patch # User Timo Sirainen # Date 1041701189 -7200 # Node ID 0d5be52d71315a2606d568510b7b8b9ff3ac259d # Parent e27267f227e653506b61aecac77e1827b6f73498 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. diff -r e27267f227e6 -r 0d5be52d7131 src/lib-charset/charset-iconv.c --- a/src/lib-charset/charset-iconv.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-charset/charset-iconv.c Sat Jan 04 19:26:29 2003 +0200 @@ -134,7 +134,7 @@ if (!ucase) { if (utf8_size_r != NULL) *utf8_size_r = size; - return t_strndup((const char *) data, size); + return t_strndup(data, size); } return _charset_utf8_ucase_strdup(data, size, utf8_size_r); diff -r e27267f227e6 -r 0d5be52d7131 src/lib-charset/charset-utf8.c --- a/src/lib-charset/charset-utf8.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-charset/charset-utf8.c Sat Jan 04 19:26:29 2003 +0200 @@ -98,7 +98,7 @@ *unknown_charset = FALSE; if (utf8_size_r != NULL) *utf8_size_r = size; - return t_strndup((const char *) data, size); + return t_strndup(data, size); } else { if (unknown_charset != NULL) *unknown_charset = TRUE; diff -r e27267f227e6 -r 0d5be52d7131 src/lib-imap/imap-base-subject.c --- a/src/lib-imap/imap-base-subject.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-imap/imap-base-subject.c Sat Jan 04 19:26:29 2003 +0200 @@ -224,7 +224,8 @@ /* (1) Convert any RFC 2047 encoded-words in the subject to UTF-8. Convert all tabs and continuations to space. Convert all multiple spaces to a single space. */ - message_header_decode(subject, subject_len, header_decode, buf); + message_header_decode((const unsigned char *) subject, subject_len, + header_decode, buf); buffer_append_c(buf, '\0'); pack_whitespace(buf); diff -r e27267f227e6 -r 0d5be52d7131 src/lib-imap/imap-bodystructure.c --- 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(); } diff -r e27267f227e6 -r 0d5be52d7131 src/lib-imap/imap-envelope.c --- a/src/lib-imap/imap-envelope.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-imap/imap-envelope.c Sat Jan 04 19:26:29 2003 +0200 @@ -18,15 +18,15 @@ char *in_reply_to, *message_id; }; -static Rfc822Address *parse_address(Pool pool, const char *value, +static Rfc822Address *parse_address(Pool pool, const unsigned char *value, size_t value_len) { - return rfc822_address_parse(pool, t_strndup(value, value_len)); + return rfc822_address_parse(pool, value, value_len); } void imap_envelope_parse_header(Pool pool, MessagePartEnvelopeData **data, - const char *name, - const char *value, size_t value_len) + const unsigned char *name, size_t name_len, + const unsigned char *value, size_t value_len) { if (*data == NULL) { *data = p_new(pool, MessagePartEnvelopeData, 1); @@ -35,28 +35,60 @@ t_push(); - if (strcasecmp(name, "Date") == 0 && (*data)->date == NULL) - (*data)->date = imap_quote_value(pool, value, value_len); - else if (strcasecmp(name, "Subject") == 0 && (*data)->subject == NULL) - (*data)->subject = imap_quote_value(pool, value, value_len); - else if (strcasecmp(name, "From") == 0 && (*data)->from == NULL) - (*data)->from = parse_address(pool, value, value_len); - else if (strcasecmp(name, "Sender") == 0 && (*data)->sender == NULL) - (*data)->sender = parse_address(pool, value, value_len); - else if (strcasecmp(name, "Reply-To") == 0 && (*data)->reply_to == NULL) - (*data)->reply_to = parse_address(pool, value, value_len); - else if (strcasecmp(name, "To") == 0 && (*data)->to == NULL) - (*data)->to = parse_address(pool, value, value_len); - else if (strcasecmp(name, "Cc") == 0 && (*data)->cc == NULL) - (*data)->cc = parse_address(pool, value, value_len); - else if (strcasecmp(name, "Bcc") == 0 && (*data)->bcc == NULL) - (*data)->bcc = parse_address(pool, value, value_len); - else if (strcasecmp(name, "In-Reply-To") == 0 && - (*data)->in_reply_to == NULL) - (*data)->in_reply_to = imap_quote_value(pool, value, value_len); - else if (strcasecmp(name, "Message-Id") == 0 && - (*data)->message_id == NULL) - (*data)->message_id = imap_quote_value(pool, value, value_len); + switch (name_len) { + case 2: + if (memcasecmp(name, "To", 2) == 0 && (*data)->to == NULL) + (*data)->to = parse_address(pool, value, value_len); + else if (memcasecmp(name, "Cc", 2) == 0 && (*data)->cc == NULL) + (*data)->cc = parse_address(pool, value, value_len); + break; + case 3: + if (memcasecmp(name, "Bcc", 3) == 0 && (*data)->bcc == NULL) + (*data)->bcc = parse_address(pool, value, value_len); + break; + case 4: + if (memcasecmp(name, "From", 4) == 0 && (*data)->from == NULL) + (*data)->from = parse_address(pool, value, value_len); + else if (memcasecmp(name, "Date", 4) == 0 && + (*data)->date == NULL) { + (*data)->date = imap_quote_value(pool, value, + value_len); + } + break; + case 6: + if (memcasecmp(name, "Sender", 6) == 0 && + (*data)->sender == NULL) + (*data)->sender = parse_address(pool, value, value_len); + break; + case 7: + if (memcasecmp(name, "Subject", 7) == 0 && + (*data)->subject == NULL) { + (*data)->subject = imap_quote_value(pool, value, + value_len); + } + break; + case 8: + if (memcasecmp(name, "Reply-To", 8) == 0 && + (*data)->reply_to == NULL) { + (*data)->reply_to = parse_address(pool, value, + value_len); + } + break; + case 10: + if (memcasecmp(name, "Message-Id", 10) == 0 && + (*data)->message_id == NULL) { + (*data)->message_id = imap_quote_value(pool, value, + value_len); + } + break; + case 11: + if (memcasecmp(name, "In-Reply-To", 11) == 0 && + (*data)->in_reply_to == NULL) { + (*data)->in_reply_to = imap_quote_value(pool, value, + value_len); + } + break; + } t_pop(); } diff -r e27267f227e6 -r 0d5be52d7131 src/lib-imap/imap-envelope.h --- a/src/lib-imap/imap-envelope.h Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-imap/imap-envelope.h Sat Jan 04 19:26:29 2003 +0200 @@ -26,8 +26,8 @@ /* Update envelope data based from given header field */ void imap_envelope_parse_header(Pool pool, MessagePartEnvelopeData **data, - const char *name, - const char *value, size_t value_len); + const unsigned char *name, size_t name_len, + const unsigned char *value, size_t value_len); /* Write envelope to given string */ void imap_envelope_write_part_data(MessagePartEnvelopeData *data, diff -r e27267f227e6 -r 0d5be52d7131 src/lib-imap/imap-message-cache.c --- a/src/lib-imap/imap-message-cache.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-imap/imap-message-cache.c Sat Jan 04 19:26:29 2003 +0200 @@ -147,8 +147,8 @@ } static void parse_envelope_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) { CachedMessage *msg = context; @@ -156,8 +156,7 @@ if (part == NULL || part->parent == NULL) { /* parse envelope headers if we're at the root message part */ imap_envelope_parse_header(msg->pool, &msg->envelope, - t_strndup(name, name_len), - value, value_len); + name, name_len, value, value_len); } } diff -r e27267f227e6 -r 0d5be52d7131 src/lib-imap/imap-parser.c --- a/src/lib-imap/imap-parser.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-imap/imap-parser.c Sat Jan 04 19:26:29 2003 +0200 @@ -113,7 +113,8 @@ } /* skip over everything parsed so far, plus the following whitespace */ -static int imap_parser_skip_to_next(ImapParser *parser, const char **data, +static int imap_parser_skip_to_next(ImapParser *parser, + const unsigned char **data, size_t *data_size) { size_t i; @@ -187,8 +188,8 @@ return TRUE; } -static void imap_parser_save_arg(ImapParser *parser, const char *data, - size_t lastpos) +static void imap_parser_save_arg(ImapParser *parser, const unsigned char *data, + size_t size) { ImapArg *arg; @@ -196,21 +197,21 @@ switch (parser->cur_type) { case ARG_PARSE_ATOM: - if (lastpos == 3 && strncmp(data, "NIL", 3) == 0) { + if (size == 3 && memcmp(data, "NIL", 3) == 0) { /* NIL argument */ arg->type = IMAP_ARG_NIL; } else { /* simply save the string */ arg->type = IMAP_ARG_ATOM; - arg->_data.str = p_strndup(parser->pool, data, lastpos); + arg->_data.str = p_strndup(parser->pool, data, size); } break; case ARG_PARSE_STRING: /* data is quoted and may contain escapes. */ - i_assert(lastpos > 0); + i_assert(size > 0); arg->type = IMAP_ARG_STRING; - arg->_data.str = p_strndup(parser->pool, data+1, lastpos-1); + arg->_data.str = p_strndup(parser->pool, data+1, size-1); /* remove the escapes */ if (parser->str_first_escape >= 0 && @@ -224,7 +225,7 @@ if ((parser->flags & IMAP_PARSE_FLAG_LITERAL_SIZE) == 0) { /* simply save the string */ arg->type = IMAP_ARG_STRING; - arg->_data.str = p_strndup(parser->pool, data, lastpos); + arg->_data.str = p_strndup(parser->pool, data, size); } else { /* save literal size */ arg->type = IMAP_ARG_LITERAL_SIZE; @@ -238,7 +239,7 @@ parser->cur_type = ARG_PARSE_NONE; } -static int imap_parser_read_atom(ImapParser *parser, const char *data, +static int imap_parser_read_atom(ImapParser *parser, const unsigned char *data, size_t data_size) { size_t i; @@ -275,8 +276,8 @@ return parser->cur_type == ARG_PARSE_NONE; } -static int imap_parser_read_string(ImapParser *parser, const char *data, - size_t data_size) +static int imap_parser_read_string(ImapParser *parser, + const unsigned char *data, size_t data_size) { size_t i; @@ -339,7 +340,8 @@ return TRUE; } -static int imap_parser_read_literal(ImapParser *parser, const char *data, +static int imap_parser_read_literal(ImapParser *parser, + const unsigned char *data, size_t data_size) { size_t i, prev_size; @@ -370,7 +372,8 @@ return FALSE; } -static int imap_parser_read_literal_data(ImapParser *parser, const char *data, +static int imap_parser_read_literal_data(ImapParser *parser, + const unsigned char *data, size_t data_size) { if (parser->literal_skip_crlf) { @@ -419,10 +422,10 @@ an argument inside a list was processed. */ static int imap_parser_read_arg(ImapParser *parser) { - const char *data; + const unsigned char *data; size_t data_size; - data = (const char *) i_stream_get_data(parser->input, &data_size); + data = i_stream_get_data(parser->input, &data_size); if (data_size == 0) return FALSE; @@ -485,8 +488,7 @@ /* pass through to parsing data. since input->skip was modified, we need to get the data start position again. */ - data = (const char *) i_stream_get_data(parser->input, - &data_size); + data = i_stream_get_data(parser->input, &data_size); /* fall through */ case ARG_PARSE_LITERAL_DATA: @@ -551,10 +553,10 @@ const char *imap_parser_read_word(ImapParser *parser) { - const char *data; + const unsigned char *data; size_t i, data_size; - data = (const char *) i_stream_get_data(parser->input, &data_size); + data = i_stream_get_data(parser->input, &data_size); for (i = 0; i < data_size; i++) { if (data[i] == ' ' || data[i] == '\r' || data[i] == '\n') @@ -571,10 +573,10 @@ const char *imap_parser_read_line(ImapParser *parser) { - const char *data; + const unsigned char *data; size_t i, data_size; - data = (const char *) i_stream_get_data(parser->input, &data_size); + data = i_stream_get_data(parser->input, &data_size); for (i = 0; i < data_size; i++) { if (data[i] == '\r' || data[i] == '\n') diff -r e27267f227e6 -r 0d5be52d7131 src/lib-imap/imap-quote.c --- a/src/lib-imap/imap-quote.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-imap/imap-quote.c Sat Jan 04 19:26:29 2003 +0200 @@ -13,7 +13,7 @@ #define IS_BREAK_OR_CRLF_CHAR(c) \ (IS_BREAK_CHAR(c) || (c) == '\r' || (c) == '\n') -static size_t next_token_quoted(const char *value, size_t len, +static size_t next_token_quoted(const unsigned char *value, size_t len, int *need_qp, int *quoted) { size_t i; @@ -22,7 +22,7 @@ *quoted = TRUE; for (i = *quoted ? 0 : 1; i < len; i++) { - if ((unsigned char)value[i] & 0x80) + if (value[i] & 0x80) *need_qp = TRUE; if (value[i] == '"' || value[i] == '\r' || value[i] == '\n') { @@ -35,7 +35,7 @@ return i; } -static size_t next_token(const char *value, size_t len, +static size_t next_token(const unsigned char *value, size_t len, int *need_qp, int *quoted, int qp_on) { size_t i = 0; @@ -68,7 +68,7 @@ /* then stop at break-char */ for (; i < len; i++) { - if ((unsigned char)value[i] & 0x80) + if (value[i] & 0x80) *need_qp = TRUE; if (IS_BREAK_OR_CRLF_CHAR(value[i])) @@ -78,7 +78,8 @@ return i; } -static void append_quoted_qp(String *str, const char *value, size_t len) +static void append_quoted_qp(String *str, const unsigned char *value, + size_t len) { size_t i; unsigned char c; @@ -96,15 +97,15 @@ str_append_c(str, value[i]); } else { str_append_c(str, '='); - c = (unsigned char)value[i] >> 4; + c = value[i] >> 4; str_append_c(str, c < 10 ? (c+'0') : (c-10+'A')); - c = (unsigned char)value[i] & 0x0f; + c = value[i] & 0x0f; str_append_c(str, c < 10 ? (c+'0') : (c-10+'A')); } } } -static void append_quoted(String *str, const char *value, size_t len) +static void append_quoted(String *str, const unsigned char *value, size_t len) { size_t i; @@ -116,7 +117,7 @@ } /* does two things: 1) escape '\' and '"' characters, 2) 8bit text -> QP */ -static String *get_quoted_str(const char *value, size_t value_len) +static String *get_quoted_str(const unsigned char *value, size_t value_len) { String *str; size_t token_len; @@ -165,13 +166,14 @@ const char *imap_quote_str_nil(const char *value) { return value == NULL ? "NIL" : - str_c(get_quoted_str(value, strlen(value))); + str_c(get_quoted_str((const unsigned char *) value, + strlen(value))); } -char *imap_quote_value(Pool pool, const char *value, size_t value_len) +char *imap_quote_value(Pool pool, const unsigned char *value, size_t value_len) { String *str; str = get_quoted_str(value, value_len); - return p_strndup(pool, str_c(str), str_len(str)); + return p_strndup(pool, str_data(str), str_len(str)); } diff -r e27267f227e6 -r 0d5be52d7131 src/lib-imap/imap-quote.h --- a/src/lib-imap/imap-quote.h Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-imap/imap-quote.h Sat Jan 04 19:26:29 2003 +0200 @@ -5,6 +5,6 @@ const char *imap_quote_str_nil(const char *value); /* Return value quoted and allocated from specified pool. */ -char *imap_quote_value(Pool pool, const char *value, size_t value_len); +char *imap_quote_value(Pool pool, const unsigned char *value, size_t value_len); #endif diff -r e27267f227e6 -r 0d5be52d7131 src/lib-imap/imap-util.h --- a/src/lib-imap/imap-util.h Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-imap/imap-util.h Sat Jan 04 19:26:29 2003 +0200 @@ -10,7 +10,10 @@ MAIL_RECENT = 0x0000020, /* rest of the bits are custom flags */ - MAIL_CUSTOM_FLAG_1 = 0x0000040 + MAIL_CUSTOM_FLAG_1 = 0x0000040, + + MAIL_SYSTEM_FLAGS_MASK = 0x000003f, + MAIL_CUSTOM_FLAGS_MASK = 0xfffffc0 } MailFlags; /* growing number of flags isn't very easy. biggest problem is that they're @@ -19,9 +22,6 @@ file name using 'a'..'z' letters which gets us exactly the needed 26 flags. if more is added, the current code breaks. */ enum { - MAIL_SYSTEM_FLAGS_MASK = 0x000003f, - MAIL_CUSTOM_FLAGS_MASK = 0xfffffc0, - MAIL_CUSTOM_FLAG_1_BIT = 6, MAIL_CUSTOM_FLAGS_COUNT = 26, diff -r e27267f227e6 -r 0d5be52d7131 src/lib-index/mail-index-update.c --- a/src/lib-index/mail-index-update.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-index/mail-index-update.c Sat Jan 04 19:26:29 2003 +0200 @@ -372,8 +372,8 @@ } HeaderUpdateContext; static void update_header_func(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) { HeaderUpdateContext *ctx = context; @@ -387,12 +387,8 @@ ctx->envelope_pool = pool_alloconly_create("index envelope", 2048); } - t_push(); - imap_envelope_parse_header(ctx->envelope_pool, - &ctx->envelope, - t_strndup(name, name_len), - value, value_len); - t_pop(); + imap_envelope_parse_header(ctx->envelope_pool, &ctx->envelope, + name, name_len, value, value_len); } if (ctx->header_func != NULL) { diff -r e27267f227e6 -r 0d5be52d7131 src/lib-index/mbox/mbox-append.c --- a/src/lib-index/mbox/mbox-append.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-index/mbox/mbox-append.c Sat Jan 04 19:26:29 2003 +0200 @@ -44,7 +44,7 @@ } /* parse the From-line */ - internal_date = mbox_from_parse_date((const char *) data + 5, size - 5); + internal_date = mbox_from_parse_date(data + 5, size - 5); if (internal_date == (time_t)-1) internal_date = ioloop_time; diff -r e27267f227e6 -r 0d5be52d7131 src/lib-index/mbox/mbox-from.c --- a/src/lib-index/mbox/mbox-from.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-index/mbox/mbox-from.c Sat Jan 04 19:26:29 2003 +0200 @@ -16,9 +16,9 @@ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; -time_t mbox_from_parse_date(const char *msg, size_t size) +time_t mbox_from_parse_date(const unsigned char *msg, size_t size) { - const char *msg_end; + const unsigned char *msg_end; struct tm tm; int i; @@ -41,7 +41,7 @@ /* month */ for (i = 0; i < 12; i++) { - if (strncasecmp(months[i], msg, 3) == 0) { + if (memcasecmp(months[i], msg, 3) == 0) { tm.tm_mon = i; break; } diff -r e27267f227e6 -r 0d5be52d7131 src/lib-index/mbox/mbox-index.c --- a/src/lib-index/mbox/mbox-index.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-index/mbox/mbox-index.c Sat Jan 04 19:26:29 2003 +0200 @@ -139,7 +139,7 @@ { } -static MailFlags mbox_get_status_flags(const char *value, size_t len) +static MailFlags mbox_get_status_flags(const unsigned char *value, size_t len) { MailFlags flags; size_t i; @@ -168,7 +168,7 @@ return flags; } -static void mbox_update_custom_flags(const char *value __attr_unused__, +static void mbox_update_custom_flags(const unsigned char *value __attr_unused__, size_t len __attr_unused__, int index, void *context) { @@ -179,7 +179,7 @@ } static MailFlags -mbox_get_keyword_flags(const char *value, size_t len, +mbox_get_keyword_flags(const unsigned char *value, size_t len, const char *custom_flags[MAIL_CUSTOM_FLAGS_COUNT]) { MailFlags flags; @@ -190,7 +190,7 @@ return flags; } -static int mbox_parse_imapbase(const char *value, size_t len, +static int mbox_parse_imapbase(const unsigned char *value, size_t len, MboxHeaderContext *ctx) { const char **flag; @@ -247,8 +247,8 @@ } void mbox_header_func(MessagePart *part __attr_unused__, - 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) { MboxHeaderContext *ctx = context; @@ -256,12 +256,10 @@ size_t i; int fixed = FALSE; - /* Pretty much copy&pasted from popa3d by Solar Designer */ - switch (*name) { - case '\0': + if (name_len == 0) { /* End of headers */ if (!ctx->set_read_limit) - break; + return; /* a) use Content-Length, b) search for "From "-line */ start_offset = ctx->input->v_offset; @@ -279,12 +277,15 @@ i_stream_seek(ctx->input, start_offset); i_stream_set_read_limit(ctx->input, end_offset); - break; + return; + } + /* Pretty much copy&pasted from popa3d by Solar Designer */ + switch (*name) { case 'R': case 'r': if (!ctx->received && name_len == 8 && - strncasecmp(name, "Received", 8) == 0) { + memcasecmp(name, "Received", 8) == 0) { ctx->received = TRUE; fixed = TRUE; } @@ -293,7 +294,7 @@ case 'C': case 'c': if (name_len == 14 && ctx->set_read_limit && - strncasecmp(name, "Content-Length", 14) == 0) { + memcasecmp(name, "Content-Length", 14) == 0) { /* manual parsing, so we can deal with uoff_t */ ctx->content_length = 0; for (i = 0; i < value_len; i++) { @@ -312,12 +313,12 @@ case 'D': case 'd': if (name_len == 12) - fixed = strncasecmp(name, "Delivered-To", 12) == 0; + fixed = memcasecmp(name, "Delivered-To", 12) == 0; else if (name_len == 4) { /* Received-header contains date too, and more trusted one */ fixed = !ctx->received && - strncasecmp(name, "Date", 4) == 0; + memcasecmp(name, "Date", 4) == 0; } break; @@ -327,13 +328,13 @@ /* Received-header contains unique ID too, and more trusted one */ fixed = !ctx->received && - strncasecmp(name, "Message-ID", 10) == 0; + memcasecmp(name, "Message-ID", 10) == 0; } break; case 'S': case 's': - if (name_len == 6 && strncasecmp(name, "Status", 6) == 0) { + if (name_len == 6 && memcasecmp(name, "Status", 6) == 0) { /* update message flags */ ctx->flags |= mbox_get_status_flags(value, value_len); } @@ -345,18 +346,18 @@ /* Let the local delivery agent help generate unique ID's but don't blindly trust this header alone as it could just as easily come from the remote. */ - fixed = strncasecmp(name, "X-Delivery-ID:", 13) == 0; + fixed = memcasecmp(name, "X-Delivery-ID:", 13) == 0; } else if (name_len == 8 && - strncasecmp(name, "X-Status", 8) == 0) { + memcasecmp(name, "X-Status", 8) == 0) { /* update message flags */ ctx->flags |= mbox_get_status_flags(value, value_len); } else if (name_len == 10 && - strncasecmp(name, "X-Keywords", 10) == 0) { + memcasecmp(name, "X-Keywords", 10) == 0) { /* update custom message flags */ ctx->flags |= mbox_get_keyword_flags(value, value_len, ctx->custom_flags); } else if (name_len == 10 && - strncasecmp(name, "X-IMAPbase", 10) == 0) { + memcasecmp(name, "X-IMAPbase", 10) == 0) { /* update list of custom message flags */ (void)mbox_parse_imapbase(value, value_len, ctx); } @@ -367,9 +368,10 @@ md5_update(&ctx->md5, value, value_len); } -void mbox_keywords_parse(const char *value, size_t len, +void mbox_keywords_parse(const unsigned char *value, size_t len, const char *custom_flags[MAIL_CUSTOM_FLAGS_COUNT], - void (*func)(const char *, size_t, int, void *), + void (*func)(const unsigned char *, size_t, + int, void *), void *context) { size_t custom_len[MAIL_CUSTOM_FLAGS_COUNT]; @@ -409,7 +411,7 @@ /* check if it's found */ for (i = 0; i < MAIL_CUSTOM_FLAGS_COUNT; i++) { if (custom_len[i] == item_len && - strncasecmp(custom_flags[i], value, item_len) == 0) + memcasecmp(custom_flags[i], value, item_len) == 0) break; } @@ -484,8 +486,8 @@ if (msg[i] == '\n') { msg += startpos; i -= startpos; - return mbox_from_parse_date((const char *) msg, - size) != (time_t)-1; + return mbox_from_parse_date(msg, size) != + (time_t)-1; } } } diff -r e27267f227e6 -r 0d5be52d7131 src/lib-index/mbox/mbox-index.h --- a/src/lib-index/mbox/mbox-index.h Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-index/mbox/mbox-index.h Sat Jan 04 19:26:29 2003 +0200 @@ -31,12 +31,13 @@ IStream *input); void mbox_header_free_context(MboxHeaderContext *ctx); void mbox_header_func(MessagePart *part __attr_unused__, - 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); -void mbox_keywords_parse(const char *value, size_t len, +void mbox_keywords_parse(const unsigned char *value, size_t len, const char *custom_flags[MAIL_CUSTOM_FLAGS_COUNT], - void (*func)(const char *, size_t, int, void *), + void (*func)(const unsigned char *, size_t, + int, void *), void *context); int mbox_skip_crlf(IStream *input); void mbox_skip_empty_lines(IStream *input); @@ -55,7 +56,7 @@ int mbox_index_append(MailIndex *index, IStream *input); -time_t mbox_from_parse_date(const char *msg, size_t size); +time_t mbox_from_parse_date(const unsigned char *msg, size_t size); const char *mbox_from_create(const char *sender, time_t time); int mbox_index_rewrite(MailIndex *index); diff -r e27267f227e6 -r 0d5be52d7131 src/lib-index/mbox/mbox-rewrite.c --- a/src/lib-index/mbox/mbox-rewrite.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-index/mbox/mbox-rewrite.c Sat Jan 04 19:26:29 2003 +0200 @@ -196,7 +196,7 @@ return TRUE; } -static const char *strip_chars(const char *value, size_t value_len, +static const char *strip_chars(const unsigned char *value, size_t value_len, const char *list) { /* @UNSAFE: leave only unknown flags, very likely none */ @@ -216,7 +216,7 @@ return ret; } -static void update_stripped_custom_flags(const char *value, size_t len, +static void update_stripped_custom_flags(const unsigned char *value, size_t len, int index, void *context) { String *str = context; @@ -229,7 +229,7 @@ } } -static const char *strip_custom_flags(const char *value, size_t len, +static const char *strip_custom_flags(const unsigned char *value, size_t len, MboxRewriteContext *ctx) { String *str; @@ -241,8 +241,8 @@ } static void header_func(MessagePart *part __attr_unused__, - 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) { MboxRewriteContext *ctx = context; @@ -252,25 +252,27 @@ if (ctx->failed) return; - if (name_len == 6 && strncasecmp(name, "Status", 6) == 0) { + if (name_len == 6 && memcasecmp(name, "Status", 6) == 0) { ctx->status_found = TRUE; str = strip_chars(value, value_len, "RO"); (void)mbox_write_status(ctx, str); - } else if (name_len == 8 && strncasecmp(name, "X-Status", 8) == 0) { + } else if (name_len == 8 && memcasecmp(name, "X-Status", 8) == 0) { ctx->xstatus_found = TRUE; str = strip_chars(value, value_len, "ADFT"); (void)mbox_write_xstatus(ctx, str); - } else if (name_len == 10 && strncasecmp(name, "X-Keywords", 10) == 0) { + } else if (name_len == 10 && memcasecmp(name, "X-Keywords", 10) == 0) { ctx->ximapbase_found = TRUE; str = strip_custom_flags(value, value_len, ctx); (void)mbox_write_xkeywords(ctx, str); - } else if (name_len == 10 && strncasecmp(name, "X-IMAPbase", 10) == 0) { + } else if (name_len == 10 && memcasecmp(name, "X-IMAPbase", 10) == 0) { if (ctx->seq == 1) { /* temporarily copy the value to make sure we don't overflow it */ + const char *str; + t_push(); - value = t_strndup(value, value_len); - ctx->uid_validity = strtoul(value, &end, 10); + str = t_strndup(value, value_len); + ctx->uid_validity = strtoul(str, &end, 10); while (*end == ' ') end++; ctx->uid_last = strtoul(end, &end, 10); t_pop(); @@ -279,7 +281,7 @@ (void)mbox_write_ximapbase(ctx); } } else if (name_len == 14 && - strncasecmp(name, "Content-Length", 14) == 0) { + memcasecmp(name, "Content-Length", 14) == 0) { ctx->content_length_found = TRUE; (void)mbox_write_content_length(ctx); } else if (name_len > 0) { diff -r e27267f227e6 -r 0d5be52d7131 src/lib-mail/message-body-search.c --- a/src/lib-mail/message-body-search.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-mail/message-body-search.c Sat Jan 04 19:26:29 2003 +0200 @@ -45,7 +45,7 @@ unsigned int found:1; } PartSearchContext; -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) { PartSearchContext *ctx = context; @@ -58,38 +58,39 @@ } } -static void parse_content_type_param(const char *name, size_t name_len, - const char *value, size_t value_len, - int value_quoted, void *context) +static void +parse_content_type_param(const unsigned char *name, size_t name_len, + const unsigned char *value, size_t value_len, + int value_quoted, void *context) { PartSearchContext *ctx = context; - if (name_len == 7 && strncasecmp(name, "charset", 7) == 0 && + if (name_len == 7 && memcasecmp(name, "charset", 7) == 0 && ctx->content_charset == NULL) { ctx->content_charset = i_strndup(value, value_len); if (value_quoted) str_unescape(ctx->content_charset); } } -static void parse_content_encoding(const char *value, size_t value_len, +static void parse_content_encoding(const unsigned char *value, size_t value_len, void *context) { PartSearchContext *ctx = context; switch (value_len) { case 4: - if (strncasecmp(value, "7bit", 4) != 0 && - strncasecmp(value, "8bit", 4) != 0) + if (memcasecmp(value, "7bit", 4) != 0 && + memcasecmp(value, "8bit", 4) != 0) ctx->content_unknown = TRUE; break; case 6: - if (strncasecmp(value, "base64", 6) == 0) + if (memcasecmp(value, "base64", 6) == 0) ctx->content_base64 = TRUE; - else if (strncasecmp(value, "binary", 6) != 0) + else if (memcasecmp(value, "binary", 6) != 0) ctx->content_unknown = TRUE; break; case 16: - if (strncasecmp(value, "quoted-printable", 16) == 0) + if (memcasecmp(value, "quoted-printable", 16) == 0) ctx->content_qp = TRUE; else ctx->content_unknown = TRUE; @@ -101,8 +102,9 @@ } static void header_find(MessagePart *part __attr_unused__, - const char *name, size_t name_len, - const char *value, size_t value_len, void *context) + const unsigned char *name, size_t name_len, + const unsigned char *value, size_t value_len, + void *context) { PartSearchContext *ctx = context; @@ -114,13 +116,13 @@ ctx->hdr_search_ctx); } - if (name_len == 12 && strncasecmp(name, "Content-Type", 12) == 0) { + if (name_len == 12 && memcasecmp(name, "Content-Type", 12) == 0) { message_content_parse_header(value, value_len, parse_content_type, parse_content_type_param, ctx); } else if (name_len == 25 && - strncasecmp(name, "Content-Transfer-Encoding", 25) == 0) { + memcasecmp(name, "Content-Transfer-Encoding", 25) == 0) { message_content_parse_header(value, value_len, parse_content_encoding, NULL, ctx); @@ -344,7 +346,8 @@ /* get the key uppercased */ key = charset_to_ucase_utf8_string(charset, unknown_charset, - key, strlen(key), &key_len); + (const unsigned char *) key, + strlen(key), &key_len); if (key == NULL) return FALSE; diff -r e27267f227e6 -r 0d5be52d7131 src/lib-mail/message-content-parser.c --- a/src/lib-mail/message-content-parser.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-mail/message-content-parser.c Sat Jan 04 19:26:29 2003 +0200 @@ -5,7 +5,7 @@ #include "rfc822-tokenize.h" #include "message-content-parser.h" -void message_content_parse_header(const char *data, size_t size, +void message_content_parse_header(const unsigned char *data, size_t size, ParseContentFunc func, ParseContentParamFunc param_func, void *context) @@ -14,7 +14,7 @@ Rfc822TokenizeContext *ctx; Rfc822Token token; String *str; - const char *key, *value; + const unsigned char *key, *value; size_t key_len, value_len; ctx = rfc822_tokenize_init(data, size, NULL, NULL); @@ -27,7 +27,7 @@ rfc822_tokenize_get_string(ctx, str, NULL, stop_tokens); if (func != NULL) - func(str_c(str), str_len(str), context); + func(str_data(str), str_len(str), context); t_pop(); diff -r e27267f227e6 -r 0d5be52d7131 src/lib-mail/message-content-parser.h --- a/src/lib-mail/message-content-parser.h Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-mail/message-content-parser.h Sat Jan 04 19:26:29 2003 +0200 @@ -2,13 +2,15 @@ #define __MESSAGE_CONTENT_PARSER_H /* NOTE: name and value aren't \0-terminated. */ -typedef void (*ParseContentFunc)(const char *value, size_t value_len, +typedef void (*ParseContentFunc)(const unsigned char *value, size_t value_len, void *context); -typedef void (*ParseContentParamFunc)(const char *name, size_t name_len, - const char *value, size_t value_len, +typedef void (*ParseContentParamFunc)(const unsigned char *name, + size_t name_len, + const unsigned char *value, + size_t value_len, int value_quoted, void *context); -void message_content_parse_header(const char *data, size_t size, +void message_content_parse_header(const unsigned char *data, size_t size, ParseContentFunc func, ParseContentParamFunc param_func, void *context); diff -r e27267f227e6 -r 0d5be52d7131 src/lib-mail/message-header-search.c --- a/src/lib-mail/message-header-search.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-mail/message-header-search.c Sat Jan 04 19:26:29 2003 +0200 @@ -36,21 +36,22 @@ { HeaderSearchContext *ctx; size_t key_len; - const char *p; + const unsigned char *p; ctx = p_new(pool, HeaderSearchContext, 1); ctx->pool = pool; /* get the key uppercased */ key = charset_to_ucase_utf8_string(charset, unknown_charset, - key, strlen(key), &key_len); + (const unsigned char *) key, + strlen(key), &key_len); if (key == NULL) { /* invalid key */ return NULL; } - ctx->key = p_strdup(pool, key); + ctx->key = (unsigned char *) p_strdup(pool, key); ctx->key_len = key_len; ctx->key_charset = p_strdup(pool, charset); ctx->unknown_charset = charset == NULL; @@ -104,7 +105,7 @@ /* unknown character set, or invalid data */ } else { ctx->submatch = TRUE; - search_loop(utf8_data, utf8_size, ctx); + search_loop((const unsigned char *) utf8_data, utf8_size, ctx); ctx->submatch = FALSE; } } diff -r e27267f227e6 -r 0d5be52d7131 src/lib-mail/message-parser.c --- a/src/lib-mail/message-parser.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-mail/message-parser.c Sat Jan 04 19:26:29 2003 +0200 @@ -68,7 +68,7 @@ return part; } -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) { MessageParseContext *parse_ctx = context; @@ -94,14 +94,15 @@ } } -static void parse_content_type_param(const char *name, size_t name_len, - const char *value, size_t value_len, - int value_quoted, void *context) +static void +parse_content_type_param(const unsigned char *name, size_t name_len, + const unsigned char *value, size_t value_len, + int value_quoted, void *context) { MessageParseContext *parse_ctx = context; if ((parse_ctx->part->flags & MESSAGE_PART_FLAG_MULTIPART) == 0 || - name_len != 8 || strncasecmp(name, "boundary", 8) != 0) + name_len != 8 || memcasecmp(name, "boundary", 8) != 0) return; if (parse_ctx->last_boundary == NULL) { @@ -113,8 +114,8 @@ } static void parse_header_field(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) { MessageParseContext *parse_ctx = context; @@ -125,7 +126,7 @@ parse_ctx->context); } - if (name_len == 12 && strncasecmp(name, "Content-Type", 12) == 0) { + if (name_len == 12 && memcasecmp(name, "Content-Type", 12) == 0) { /* we need to know the boundary */ message_content_parse_header(value, value_len, parse_content_type, @@ -390,11 +391,9 @@ if (msg[i-1] == '\r') value_len--; /* and finally call the function */ - func(part, - (const char *) msg + line_start, - name_len, - (const char *) msg + colon_pos, - value_len, context); + func(part, msg + line_start, name_len, + msg + colon_pos, value_len, + context); } colon_pos = UINT_MAX; @@ -430,16 +429,16 @@ if (func != NULL) { /* "end of headers" notify */ - func(part, "", 0, "", 0, context); + func(part, NULL, 0, NULL, 0, context); } } static MessageBoundary *boundary_find(MessageBoundary *boundaries, - const char *msg, size_t len) + const unsigned char *msg, size_t len) { while (boundaries != NULL) { if (boundaries->len <= len && - strncmp(boundaries->boundary, msg, boundaries->len) == 0) + memcmp(boundaries->boundary, msg, boundaries->len) == 0) return boundaries; boundaries = boundaries->next; @@ -471,8 +470,8 @@ msg[line_start+1] == '-') { /* possible boundary */ boundary = boundary_find(boundaries, - (const char *) msg + line_start + 2, - i - line_start - 2); + msg + line_start + 2, + i - line_start - 2); if (boundary != NULL) break; } @@ -496,8 +495,8 @@ 70 chars without "--" or less. We allow a bit larger.. */ boundary = boundary_find(boundaries, - (const char *) msg + line_start + 2, - i - line_start - 2); + msg + line_start + 2, + i - line_start - 2); if (boundary != NULL) break; diff -r e27267f227e6 -r 0d5be52d7131 src/lib-mail/message-parser.h --- a/src/lib-mail/message-parser.h Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-mail/message-parser.h Sat Jan 04 19:26:29 2003 +0200 @@ -42,8 +42,8 @@ /* NOTE: name and value aren't \0-terminated. Also called once at end of headers with name_len = value_len = 0. */ typedef void (*MessageHeaderFunc)(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); /* func is called for each field in message header. */ diff -r e27267f227e6 -r 0d5be52d7131 src/lib-mail/rfc822-address.c --- a/src/lib-mail/rfc822-address.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-mail/rfc822-address.c Sat Jan 04 19:26:29 2003 +0200 @@ -17,7 +17,8 @@ return addr; } -Rfc822Address *rfc822_address_parse(Pool pool, const char *str) +Rfc822Address *rfc822_address_parse(Pool pool, const unsigned char *data, + size_t size) { static const Rfc822Token stop_tokens_init[] = { ',', '@', '<', ':', TOKEN_LAST }; @@ -46,7 +47,7 @@ size_t len; int ingroup, stop; - if (str == NULL || *str == '\0') + if (size == 0) return NULL; first_addr = NULL; @@ -59,7 +60,7 @@ ENVELOPE wants groups to be stored like (NIL, NIL, group, NIL), ..., (NIL, NIL, NIL, NIL) */ - ctx = rfc822_tokenize_init(str, (size_t)-1, NULL, NULL); + ctx = rfc822_tokenize_init(data, size, NULL, NULL); rfc822_tokenize_skip_comments(ctx, FALSE); t_push(); diff -r e27267f227e6 -r 0d5be52d7131 src/lib-mail/rfc822-address.h --- a/src/lib-mail/rfc822-address.h Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-mail/rfc822-address.h Sat Jan 04 19:26:29 2003 +0200 @@ -9,6 +9,7 @@ char *name, *route, *mailbox, *domain; }; -Rfc822Address *rfc822_address_parse(Pool pool, const char *str); +Rfc822Address *rfc822_address_parse(Pool pool, const unsigned char *data, + size_t size); #endif diff -r e27267f227e6 -r 0d5be52d7131 src/lib-mail/rfc822-date.c --- a/src/lib-mail/rfc822-date.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-mail/rfc822-date.c Sat Jan 04 19:26:29 2003 +0200 @@ -17,7 +17,7 @@ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; -static int parse_timezone(const char *str, size_t len) +static int parse_timezone(const unsigned char *str, size_t len) { int offset; char chr; @@ -87,7 +87,7 @@ } static Rfc822Token next_token(Rfc822TokenizeContext *ctx, - const char **value, size_t *value_len) + const unsigned char **value, size_t *value_len) { Rfc822Token token; @@ -102,7 +102,7 @@ { struct tm tm; Rfc822Token token; - const char *value; + const unsigned char *value; size_t i, len; /* [weekday_name "," ] dd month_name [yy]yy hh:mi[:ss] timezone */ @@ -135,7 +135,7 @@ return FALSE; for (i = 0; i < 12; i++) { - if (strncasecmp(month_names[i], value, 3) == 0) { + if (memcasecmp(month_names[i], value, 3) == 0) { tm.tm_mon = i; break; } @@ -214,7 +214,8 @@ if (data == NULL || *data == '\0') return FALSE; - ctx = rfc822_tokenize_init(data, (size_t)-1, NULL, NULL); + ctx = rfc822_tokenize_init((const unsigned char *) data, (size_t)-1, + NULL, NULL); ret = rfc822_parse_date_tokens(ctx, time, timezone_offset); rfc822_tokenize_deinit(ctx); diff -r e27267f227e6 -r 0d5be52d7131 src/lib-mail/rfc822-tokenize.c --- a/src/lib-mail/rfc822-tokenize.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-mail/rfc822-tokenize.c Sat Jan 04 19:26:29 2003 +0200 @@ -6,7 +6,7 @@ #include "rfc822-tokenize.h" struct _Rfc822TokenizeContext { - const char *data; + const unsigned char *data; size_t size; Rfc822TokenizeErrorFunc error_func; @@ -42,7 +42,7 @@ Rfc822TokenizeContext * -rfc822_tokenize_init(const char *data, size_t size, +rfc822_tokenize_init(const unsigned char *data, size_t size, Rfc822TokenizeErrorFunc error_func, void *error_context) { Rfc822TokenizeContext *ctx; @@ -79,7 +79,7 @@ Rfc822Token rfc822_tokenize_next(Rfc822TokenizeContext *ctx) { int token, level, last_atom; - const char *data; + const unsigned char *data; size_t i, size; if (ctx->token == TOKEN_LAST) @@ -275,8 +275,8 @@ return ctx->token; } -const char *rfc822_tokenize_get_value(const Rfc822TokenizeContext *ctx, - size_t *len) +const unsigned char * +rfc822_tokenize_get_value(const Rfc822TokenizeContext *ctx, size_t *len) { i_assert(IS_TOKEN_STRING(ctx->token)); @@ -289,7 +289,7 @@ const Rfc822Token *stop_tokens) { Rfc822Token token; - const char *value; + const unsigned char *value; size_t len; int i, token_str, last_str; diff -r e27267f227e6 -r 0d5be52d7131 src/lib-mail/rfc822-tokenize.h --- a/src/lib-mail/rfc822-tokenize.h Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-mail/rfc822-tokenize.h Sat Jan 04 19:26:29 2003 +0200 @@ -29,14 +29,14 @@ missing_char == '\0': unexpected character at str[pos] missing_char != '\0': missing character */ -typedef int (*Rfc822TokenizeErrorFunc)(const char *str, size_t pos, +typedef int (*Rfc822TokenizeErrorFunc)(const unsigned char *str, size_t pos, char missing_char, void *context); /* Tokenize the string. Returns NULL if string is empty. Memory for returned array is allocated from data stack. You don't have to use the tokens_count, since last token is always 0. */ Rfc822TokenizeContext * -rfc822_tokenize_init(const char *data, size_t size, +rfc822_tokenize_init(const unsigned char *data, size_t size, Rfc822TokenizeErrorFunc error_func, void *error_context); void rfc822_tokenize_deinit(Rfc822TokenizeContext *ctx); @@ -54,8 +54,8 @@ /* - not including enclosing "", () or [] - '\' isn't expanded - [CR+]LF+LWSP (continued header) isn't removed */ -const char *rfc822_tokenize_get_value(const Rfc822TokenizeContext *ctx, - size_t *len); +const unsigned char * +rfc822_tokenize_get_value(const Rfc822TokenizeContext *ctx, size_t *len); /* Read tokens as a string, all quoted strings will be unquoted. Reads until stop_token is found. */ diff -r e27267f227e6 -r 0d5be52d7131 src/lib-storage/index/index-fetch-section.c --- a/src/lib-storage/index/index-fetch-section.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-storage/index/index-fetch-section.c Sat Jan 04 19:26:29 2003 +0200 @@ -18,7 +18,7 @@ uoff_t skip, max_size; const char *const *fields; - int (*match_func) (const char *const *, const char *, size_t); + int (*match_func) (const char *const *, const unsigned char *, size_t); } FetchHeaderFieldContext; /* For FETCH[HEADER.FIELDS*] we need to modify the header data before sending @@ -97,9 +97,10 @@ } static int header_match(const char *const *fields, - const char *name, size_t size) + const unsigned char *name, size_t size) { - const char *field, *name_start, *name_end; + const unsigned char *name_start, *name_end; + const char *field; if (size == 0) return FALSE; @@ -131,25 +132,25 @@ } static int header_match_not(const char *const *fields, - const char *name, size_t size) + const unsigned char *name, size_t size) { return !header_match(fields, name, size); } static int header_match_mime(const char *const *fields __attr_unused__, - const char *name, size_t size) + const unsigned char *name, size_t size) { - if (size > 8 && strncasecmp(name, "Content-", 8) == 0) + if (size > 8 && memcasecmp(name, "Content-", 8) == 0) return TRUE; - if (size == 12 && strncasecmp(name, "Mime-Version", 13) == 0) + if (size == 12 && memcasecmp(name, "Mime-Version", 12) == 0) return TRUE; return FALSE; } static int fetch_header_append(FetchHeaderFieldContext *ctx, - const char *str, size_t size) + const unsigned char *str, size_t size) { if (ctx->skip > 0) { if (ctx->skip >= size) { @@ -179,13 +180,13 @@ } static void fetch_header_field(MessagePart *part __attr_unused__, - const char *name, size_t name_len, - const char *value __attr_unused__, + const unsigned char *name, size_t name_len, + const unsigned char *value __attr_unused__, size_t value_len __attr_unused__, void *context) { FetchHeaderFieldContext *ctx = context; - const char *field_start, *field_end, *cr, *p; + const unsigned char *field_start, *field_end, *cr, *p; /* see if we want this field. */ if (!ctx->match_func(ctx->fields, name, name_len)) diff -r e27267f227e6 -r 0d5be52d7131 src/lib-storage/index/index-search.c --- a/src/lib-storage/index/index-search.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-storage/index/index-search.c Sat Jan 04 19:26:29 2003 +0200 @@ -43,7 +43,7 @@ MailSearchArg *args; int custom_header; - const char *name, *value; + const unsigned char *name, *value; size_t name_len, value_len; } SearchHeaderContext; @@ -341,7 +341,6 @@ ImapEnvelopeField env_field; HeaderSearchContext *hdr_search_ctx; const char *envelope, *field; - size_t size; int ret; switch (arg->type) { @@ -417,9 +416,10 @@ break; } - size = strlen(field); - ret = message_header_search(field, size, - hdr_search_ctx) ? 1 : 0; + ret = message_header_search( + (const unsigned char *) field, + strlen(field), + hdr_search_ctx) ? 1 : 0; } } t_pop(); @@ -457,35 +457,31 @@ case SEARCH_SENTSINCE: /* date is handled differently than others */ if (ctx->name_len == 4 && - strncasecmp(ctx->name, "Date", 4) == 0) { + memcasecmp(ctx->name, "Date", 4) == 0) { search_sent(arg->type, arg->value.str, t_strndup(ctx->value, ctx->value_len)); } return; case SEARCH_FROM: - if (ctx->name_len != 4 || - strncasecmp(ctx->name, "From", 4) != 0) + if (ctx->name_len != 4 || memcasecmp(ctx->name, "From", 4) != 0) return; break; case SEARCH_TO: - if (ctx->name_len != 2 || - strncasecmp(ctx->name, "To", 2) != 0) + if (ctx->name_len != 2 || memcasecmp(ctx->name, "To", 2) != 0) return; break; case SEARCH_CC: - if (ctx->name_len != 2 || - strncasecmp(ctx->name, "Cc", 2) != 0) + if (ctx->name_len != 2 || memcasecmp(ctx->name, "Cc", 2) != 0) return; break; case SEARCH_BCC: - if (ctx->name_len != 3 || - strncasecmp(ctx->name, "Bcc", 3) != 0) + if (ctx->name_len != 3 || memcasecmp(ctx->name, "Bcc", 3) != 0) return; break; case SEARCH_SUBJECT: if (ctx->name_len != 7 || - strncasecmp(ctx->name, "Subject", 7) != 0) + memcasecmp(ctx->name, "Subject", 7) != 0) return; break; case SEARCH_HEADER: @@ -493,7 +489,7 @@ len = strlen(arg->hdr_field_name); if (ctx->name_len != len || - strncasecmp(ctx->name, arg->hdr_field_name, len) != 0) + memcasecmp(ctx->name, arg->hdr_field_name, len) != 0) return; case SEARCH_TEXT: /* TEXT goes through all headers */ @@ -525,19 +521,19 @@ } static void search_header(MessagePart *part __attr_unused__, - 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) { SearchHeaderContext *ctx = context; if ((name_len > 0 && ctx->custom_header) || - (name_len == 4 && strncasecmp(name, "Date", 4) == 0) || - (name_len == 4 && strncasecmp(name, "From", 4) == 0) || - (name_len == 2 && strncasecmp(name, "To", 2) == 0) || - (name_len == 2 && strncasecmp(name, "Cc", 2) == 0) || - (name_len == 3 && strncasecmp(name, "Bcc", 3) == 0) || - (name_len == 7 && strncasecmp(name, "Subject", 7) == 0)) { + (name_len == 4 && memcasecmp(name, "Date", 4) == 0) || + (name_len == 4 && memcasecmp(name, "From", 4) == 0) || + (name_len == 2 && memcasecmp(name, "To", 2) == 0) || + (name_len == 2 && memcasecmp(name, "Cc", 2) == 0) || + (name_len == 3 && memcasecmp(name, "Bcc", 3) == 0) || + (name_len == 7 && memcasecmp(name, "Subject", 7) == 0)) { ctx->name = name; ctx->value = value; ctx->name_len = name_len; diff -r e27267f227e6 -r 0d5be52d7131 src/lib-storage/mail-sort.c --- a/src/lib-storage/mail-sort.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib-storage/mail-sort.c Sat Jan 04 19:26:29 2003 +0200 @@ -61,7 +61,7 @@ static MailSortType mail_sort_get_common_mask(const MailSortType *input, - const MailSortType **output) + MailSortType **output) { MailSortType mask = 0; diff -r e27267f227e6 -r 0d5be52d7131 src/lib/imem.c --- a/src/lib/imem.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib/imem.c Sat Jan 04 19:26:29 2003 +0200 @@ -52,12 +52,12 @@ return p_strdup_empty(default_pool, str); } -char *i_strdup_until(const char *str, const char *end) +char *i_strdup_until(const void *str, const void *end) { return p_strdup_until(default_pool, str, end); } -char *i_strndup(const char *str, size_t max_chars) +char *i_strndup(const void *str, size_t max_chars) { return p_strndup(default_pool, str, max_chars); } diff -r e27267f227e6 -r 0d5be52d7131 src/lib/imem.h --- a/src/lib/imem.h Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib/imem.h Sat Jan 04 19:26:29 2003 +0200 @@ -13,8 +13,8 @@ /* string functions */ char *i_strdup(const char *str); char *i_strdup_empty(const char *str); /* like i_strdup(), but if str == "", return NULL */ -char *i_strdup_until(const char *str, const char *end); /* *end isn't included */ -char *i_strndup(const char *str, size_t max_chars); +char *i_strdup_until(const void *str, const void *end); /* *end isn't included */ +char *i_strndup(const void *str, size_t max_chars); char *i_strdup_printf(const char *format, ...) __attr_format__(1, 2); char *i_strdup_vprintf(const char *format, va_list args); diff -r e27267f227e6 -r 0d5be52d7131 src/lib/istream-data.c --- a/src/lib/istream-data.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib/istream-data.c Sat Jan 04 19:26:29 2003 +0200 @@ -63,8 +63,7 @@ stream->istream.v_offset += count; } -IStream *i_stream_create_from_data(Pool pool, const unsigned char *data, - size_t size) +IStream *i_stream_create_from_data(Pool pool, const void *data, size_t size) { _IStream *stream; diff -r e27267f227e6 -r 0d5be52d7131 src/lib/istream.h --- a/src/lib/istream.h Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib/istream.h Sat Jan 04 19:26:29 2003 +0200 @@ -16,8 +16,7 @@ IStream *i_stream_create_mmap(int fd, Pool pool, size_t block_size, uoff_t start_offset, uoff_t v_size, int autoclose_fd); -IStream *i_stream_create_from_data(Pool pool, const unsigned char *data, - size_t size); +IStream *i_stream_create_from_data(Pool pool, const void *data, size_t size); /* Reference counting. References start from 1, so calling i_stream_unref() destroys the stream if i_stream_ref() is never used. */ diff -r e27267f227e6 -r 0d5be52d7131 src/lib/str.c --- a/src/lib/str.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib/str.c Sat Jan 04 19:26:29 2003 +0200 @@ -67,6 +67,11 @@ return buffer_get_data(str, NULL); } +const unsigned char *str_data(const String *str) +{ + return buffer_get_data(str, NULL); +} + char *str_c_modifyable(String *str) { if (!str_add_nul(str)) @@ -85,12 +90,12 @@ buffer_append(str, cstr, strlen(cstr)); } -void str_append_n(String *str, const char *cstr, size_t max_len) +void str_append_n(String *str, const void *cstr, size_t max_len) { size_t len; len = 0; - while (len < max_len && cstr[len] != '\0') + while (len < max_len && ((const char *)cstr)[len] != '\0') len++; buffer_append(str, cstr, len); diff -r e27267f227e6 -r 0d5be52d7131 src/lib/str.h --- a/src/lib/str.h Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib/str.h Sat Jan 04 19:26:29 2003 +0200 @@ -5,12 +5,13 @@ String *t_str_new(size_t initial_size); const char *str_c(String *str); +const unsigned char *str_data(const String *str); char *str_c_modifyable(String *str); size_t str_len(const String *str); /* Append string/character */ void str_append(String *str, const char *cstr); -void str_append_n(String *str, const char *cstr, size_t max_len); +void str_append_n(String *str, const void *cstr, size_t max_len); void str_append_c(String *str, char chr); void str_append_str(String *dest, const String *src); diff -r e27267f227e6 -r 0d5be52d7131 src/lib/strescape.c --- a/src/lib/strescape.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib/strescape.c Sat Jan 04 19:26:29 2003 +0200 @@ -51,20 +51,21 @@ return ret; } -void str_append_unescaped(String *dest, const char *src, size_t src_size) +void str_append_unescaped(String *dest, const void *src, size_t src_size) { + const unsigned char *src_c = src; size_t start = 0, i = 0; while (i < src_size) { start = i; for (; i < src_size; i++) { - if (src[i] == '\\') + if (src_c[i] == '\\') break; } - str_append_n(dest, src + start, i-start); + str_append_n(dest, src_c + start, i-start); - if (src[i] == '\\') + if (src_c[i] == '\\') i++; start = i; } diff -r e27267f227e6 -r 0d5be52d7131 src/lib/strescape.h --- a/src/lib/strescape.h Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib/strescape.h Sat Jan 04 19:26:29 2003 +0200 @@ -7,7 +7,7 @@ const char *str_escape(const char *str); /* remove all '\' characters, append to given string */ -void str_append_unescaped(String *dest, const char *src, size_t src_size); +void str_append_unescaped(String *dest, const void *src, size_t src_size); /* remove all '\' characters */ void str_unescape(char *str); diff -r e27267f227e6 -r 0d5be52d7131 src/lib/strfuncs.c --- a/src/lib/strfuncs.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib/strfuncs.c Sat Jan 04 19:26:29 2003 +0200 @@ -167,21 +167,21 @@ return p_strdup(pool, str); } -char *p_strdup_until(Pool pool, const char *start, const char *end) +char *p_strdup_until(Pool pool, const void *start, const void *end) { size_t size; char *mem; - i_assert(start <= end); + i_assert((const char *) start <= (const char *) end); - size = (size_t) (end-start); + size = (size_t) ((const char *) end - (const char *) start); mem = p_malloc(pool, size + 1); memcpy(mem, start, size); return mem; } -char *p_strndup(Pool pool, const char *str, size_t max_chars) +char *p_strndup(Pool pool, const void *str, size_t max_chars) { char *mem; size_t len; @@ -192,7 +192,7 @@ return NULL; len = 0; - while (str[len] != '\0' && len < max_chars) + while (((const char *) str)[len] != '\0' && len < max_chars) len++; mem = pool->malloc(pool, len+1); @@ -316,12 +316,12 @@ return p_strdup_empty(data_stack_pool, str); } -const char *t_strdup_until(const char *start, const char *end) +const char *t_strdup_until(const void *start, const void *end) { return p_strdup_until(data_stack_pool, start, end); } -const char *t_strndup(const char *str, size_t max_chars) +const char *t_strndup(const void *str, size_t max_chars) { return p_strndup(data_stack_pool, str, max_chars); } @@ -462,6 +462,23 @@ return str; } +int memcasecmp(const void *p1, const void *p2, size_t size) +{ + const unsigned char *s1 = p1; + const unsigned char *s2 = p2; + int ret; + + while (size > 0) { + ret = i_toupper(*s1) - i_toupper(*s2); + if (ret != 0) + return ret; + + s1++; s2++; size--; + } + + return 0; +} + const char **t_strsplit(const char *data, const char *separators) { const char **array; diff -r e27267f227e6 -r 0d5be52d7131 src/lib/strfuncs.h --- a/src/lib/strfuncs.h Sat Jan 04 15:22:29 2003 +0200 +++ b/src/lib/strfuncs.h Sat Jan 04 19:26:29 2003 +0200 @@ -14,8 +14,8 @@ char *p_strdup(Pool pool, const char *str); char *p_strdup_empty(Pool pool, const char *str); /* return NULL if str = "" */ -char *p_strdup_until(Pool pool, const char *start, const char *end); /* *end isn't included */ -char *p_strndup(Pool pool, const char *str, size_t max_chars); +char *p_strdup_until(Pool pool, const void *start, const void *end); /* *end isn't included */ +char *p_strndup(Pool pool, const void *str, size_t max_chars); char *p_strdup_printf(Pool pool, const char *format, ...) __attr_format__(2, 3); char *p_strdup_vprintf(Pool pool, const char *format, va_list args); char *p_strconcat(Pool pool, const char *str1, ...); /* NULL terminated */ @@ -24,8 +24,8 @@ const char *t_strdup(const char *str); char *t_strdup_noconst(const char *str); const char *t_strdup_empty(const char *str); /* return NULL if str = "" */ -const char *t_strdup_until(const char *start, const char *end); /* *end isn't included */ -const char *t_strndup(const char *str, size_t max_chars); +const char *t_strdup_until(const void *start, const void *end); /* *end isn't included */ +const char *t_strndup(const void *str, size_t max_chars); const char *t_strdup_printf(const char *format, ...) __attr_format__(1, 2); const char *t_strdup_vprintf(const char *format, va_list args); const char *t_strconcat(const char *str1, ...); /* NULL terminated */ @@ -50,6 +50,8 @@ char *str_ucase(char *str); char *str_lcase(char *str); +int memcasecmp(const void *p1, const void *p2, size_t size); + /* seprators is an array of separator characters, not a separator string. */ const char **t_strsplit(const char *data, const char *separators); diff -r e27267f227e6 -r 0d5be52d7131 src/login/client-authenticate.c --- a/src/login/client-authenticate.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/login/client-authenticate.c Sat Jan 04 19:26:29 2003 +0200 @@ -251,7 +251,8 @@ linelen = strlen(line); buf = buffer_create_static_hard(data_stack_pool, linelen); - if (base64_decode(line, linelen, NULL, buf) <= 0) { + if (base64_decode((const unsigned char *) line, linelen, + NULL, buf) <= 0) { /* failed */ client_auth_abort(client, "NO Invalid base64 data"); } else if (client->auth_request == NULL) { diff -r e27267f227e6 -r 0d5be52d7131 src/login/ssl-proxy-gnutls.c --- a/src/login/ssl-proxy-gnutls.c Sat Jan 04 15:22:29 2003 +0200 +++ b/src/login/ssl-proxy-gnutls.c Sat Jan 04 19:26:29 2003 +0200 @@ -458,7 +458,7 @@ void ssl_proxy_init(void) { const char *certfile, *keyfile, *paramfile; - char buf[4]; + unsigned char buf[4]; int ret; certfile = getenv("SSL_CERT_FILE");