X-Git-Url: https://git.hcoop.net/hcoop/debian/exim4.git/blobdiff_plain/7375d27e3d0ff85d8836e30742725b1e8e923ddc..50afd7598c8781f66e103d8421d69aed0d69f884:/src/mime.c diff --git a/src/mime.c b/src/mime.c index 821cb54..5dcbaa4 100644 --- a/src/mime.c +++ b/src/mime.c @@ -2,9 +2,9 @@ * Exim - an Internet mail transport agent * *************************************************/ -/* Copyright (c) Tom Kistner 2004, 2015 +/* Copyright (c) Tom Kistner 2004 - 2015 * License: GPL - * Copyright (c) The Exim Maintainers 2016 + * Copyright (c) The Exim Maintainers 2015 - 2018 */ #include "exim.h" @@ -16,6 +16,7 @@ FILE *mime_stream = NULL; uschar *mime_current_boundary = NULL; static mime_header mime_header_list[] = { + /* name namelen value */ { US"content-type:", 13, &mime_content_type }, { US"content-disposition:", 20, &mime_content_disposition }, { US"content-transfer-encoding:", 26, &mime_content_transfer_encoding }, @@ -26,6 +27,7 @@ static mime_header mime_header_list[] = { static int mime_header_list_size = nelem(mime_header_list); static mime_parameter mime_parameter_list[] = { + /* name namelen value */ { US"name=", 5, &mime_filename }, { US"filename=", 9, &mime_filename }, { US"charset=", 8, &mime_charset }, @@ -157,24 +159,16 @@ while (fgets(CS ibuf, MIME_MAX_LINE_LENGTH, in) != NULL) { /* Error from decoder. ipos is unchanged. */ mime_set_anomaly(MIME_ANOMALY_BROKEN_QP); - *opos = '='; - ++opos; + *opos++ = '='; ++ipos; } else if (decode_qp_result == -1) break; else if (decode_qp_result >= 0) - { - *opos = decode_qp_result; - ++opos; - } + *opos++ = decode_qp_result; } else - { - *opos = *ipos; - ++opos; - ++ipos; - } + *opos++ = *ipos++; } /* something to write? */ len = opos - obuf; @@ -225,9 +219,8 @@ mime_decode(const uschar **listptr) { int sep = 0; const uschar *list = *listptr; -uschar *option; -uschar option_buffer[1024]; -uschar decode_path[1024]; +uschar * option; +uschar * decode_path; FILE *decode_file = NULL; long f_pos = 0; ssize_t size_counter = 0; @@ -237,12 +230,10 @@ if (!mime_stream || (f_pos = ftell(mime_stream)) < 0) return FAIL; /* build default decode path (will exist since MBOX must be spooled up) */ -(void)string_format(decode_path,1024,"%s/scan/%s",spool_directory,message_id); +decode_path = string_sprintf("%s/scan/%s", spool_directory, message_id); /* try to find 1st option */ -if ((option = string_nextinlist(&list, &sep, - option_buffer, - sizeof(option_buffer))) != NULL) +if ((option = string_nextinlist(&list, &sep, NULL, 0))) { /* parse 1st option */ if ((Ustrcmp(option,"false") == 0) || (Ustrcmp(option,"0") == 0)) @@ -347,17 +338,16 @@ while(!done) if ( ((c == '\t') || (c == ' ')) && (header_value_mode == 1) ) continue; - /* we have hit a non-whitespace char, start copying value data */ - header_value_mode = 2; + /* we have hit a non-whitespace char, start copying value data */ + header_value_mode = 2; - if (c == '"') /* flip "quoted" mode */ - header_value_mode = header_value_mode==2 ? 3 : 2; + if (c == '"') /* flip "quoted" mode */ + header_value_mode = header_value_mode==2 ? 3 : 2; - /* leave value mode on unquoted ';' */ - if (header_value_mode == 2 && c == ';') { - header_value_mode = 0; - }; - /* -------------------------------- */ + /* leave value mode on unquoted ';' */ + if (header_value_mode == 2 && c == ';') + header_value_mode = 0; + /* -------------------------------- */ } else { @@ -443,8 +433,7 @@ static uschar * mime_param_val(uschar ** sp) { uschar * s = *sp; -uschar * val = NULL; -int size = 0, ptr = 0; +gstring * val = NULL; /* debug_printf_indent(" considering paramval '%s'\n", s); */ @@ -453,14 +442,13 @@ while (*s && *s != ';') /* ; terminates */ { s++; /* skip opening " */ while (*s && *s != '"') /* " protects ; */ - val = string_catn(val, &size, &ptr, s++, 1); + val = string_catn(val, s++, 1); if (*s) s++; /* skip closing " */ } else - val = string_catn(val, &size, &ptr, s++, 1); -if (val) val[ptr] = '\0'; + val = string_catn(val, s++, 1); *sp = s; -return val; +return string_from_gstring(val); } static uschar * @@ -483,27 +471,26 @@ return s; static uschar * rfc2231_to_2047(const uschar * fname, const uschar * charset, int * len) { -int size = 0, ptr = 0; -uschar * val = string_catn(NULL, &size, &ptr, US"=?", 2); +gstring * val = string_catn(NULL, US"=?", 2); uschar c; if (charset) - val = string_cat(val, &size, &ptr, charset); -val = string_catn(val, &size, &ptr, US"?Q?", 3); + val = string_cat(val, charset); +val = string_catn(val, US"?Q?", 3); while ((c = *fname)) if (c == '%' && isxdigit(fname[1]) && isxdigit(fname[2])) { - val = string_catn(val, &size, &ptr, US"=", 1); - val = string_catn(val, &size, &ptr, ++fname, 2); + val = string_catn(val, US"=", 1); + val = string_catn(val, ++fname, 2); fname += 2; } else - val = string_catn(val, &size, &ptr, fname++, 1); + val = string_catn(val, fname++, 1); -val = string_catn(val, &size, &ptr, US"?=", 2); -val[*len = ptr] = '\0'; -return val; +val = string_catn(val, US"?=", 2); +*len = val->ptr; +return string_from_gstring(val); } @@ -659,9 +646,7 @@ while(1) NULL, &err_msg); DEBUG(D_acl) debug_printf_indent("MIME: plain-name %s\n", temp_string); - size = Ustrlen(temp_string); - - if (size == slen) + if (!temp_string || (size = Ustrlen(temp_string)) == slen) decoding_failed = TRUE; else /* build up a decoded filename over successive