X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/3c51463e961cb96df8f624420f833c65505bb451..c2f669a4994192344613569e198c7b503d46d45e:/src/src/mime.c diff --git a/src/src/mime.c b/src/src/mime.c index 7b1fa387d..0339295f3 100644 --- a/src/src/mime.c +++ b/src/src/mime.c @@ -2,8 +2,10 @@ * Exim - an Internet mail transport agent * *************************************************/ -/* Copyright (c) Tom Kistner 2004, 2015 */ -/* License: GPL */ +/* Copyright (c) Tom Kistner 2004, 2015 + * License: GPL + * Copyright (c) The Exim Maintainers 2016 + */ #include "exim.h" #ifdef WITH_CONTENT_SCAN /* entire file */ @@ -12,7 +14,16 @@ FILE *mime_stream = NULL; uschar *mime_current_boundary = NULL; -static int mime_header_list_size = sizeof(mime_header_list)/sizeof(mime_header); + +static mime_header mime_header_list[] = { + { US"content-type:", 13, &mime_content_type }, + { US"content-disposition:", 20, &mime_content_disposition }, + { US"content-transfer-encoding:", 26, &mime_content_transfer_encoding }, + { US"content-id:", 11, &mime_content_id }, + { US"content-description:", 20, &mime_content_description } +}; + +static int mime_header_list_size = nelem(mime_header_list); static mime_parameter mime_parameter_list[] = { { US"name=", 5, &mime_filename }, @@ -295,7 +306,8 @@ decode_function = size_counter = decode_function(mime_stream, decode_file, mime_current_boundary); clearerr(mime_stream); -fseek(mime_stream, f_pos, SEEK_SET); +if (fseek(mime_stream, f_pos, SEEK_SET)) + return DEFER; if (fclose(decode_file) != 0 || size_counter < 0) return DEFER; @@ -453,11 +465,11 @@ while (*s && *s != ';') /* ; terminates */ { s++; /* skip opening " */ while (*s && *s != '"') /* " protects ; */ - val = string_cat(val, &size, &ptr, s++, 1); + val = string_catn(val, &size, &ptr, s++, 1); if (*s) s++; /* skip closing " */ } else - val = string_cat(val, &size, &ptr, s++, 1); + val = string_catn(val, &size, &ptr, s++, 1); if (val) val[ptr] = '\0'; *sp = s; return val; @@ -484,24 +496,24 @@ static uschar * rfc2231_to_2047(const uschar * fname, const uschar * charset, int * len) { int size = 0, ptr = 0; -uschar * val = string_cat(NULL, &size, &ptr, US"=?", 2); +uschar * val = string_catn(NULL, &size, &ptr, US"=?", 2); uschar c; if (charset) - val = string_cat(val, &size, &ptr, charset, Ustrlen(charset)); -val = string_cat(val, &size, &ptr, US"?Q?", 3); + val = string_cat(val, &size, &ptr, charset); +val = string_catn(val, &size, &ptr, US"?Q?", 3); while ((c = *fname)) if (c == '%' && isxdigit(fname[1]) && isxdigit(fname[2])) { - val = string_cat(val, &size, &ptr, US"=", 1); - val = string_cat(val, &size, &ptr, ++fname, 2); + val = string_catn(val, &size, &ptr, US"=", 1); + val = string_catn(val, &size, &ptr, ++fname, 2); fname += 2; } else - val = string_cat(val, &size, &ptr, fname++, 1); + val = string_catn(val, &size, &ptr, fname++, 1); -val = string_cat(val, &size, &ptr, US"?=", 2); +val = string_catn(val, &size, &ptr, US"?=", 2); val[*len = ptr] = '\0'; return val; }