From: Jochen Eisinger Date: Thu, 30 Oct 2003 13:19:45 +0000 (+0000) Subject: Wed Oct 30 14:06:52 CET 2003 Jochen Eisinger X-Git-Tag: silc.client.0.9.15~12 X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=commitdiff_plain;h=acdafa5873fdd1e64f5284f7b095c2d663e503cc Wed Oct 30 14:06:52 CET 2003 Jochen Eisinger * Cleaned up the silc_mime_parse function and fixed detection of wrapped header lines. Affected file lib/silcutil/silcstrutil.c --- diff --git a/CHANGES b/CHANGES index 89bd16d8..f61e623f 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,17 @@ +Wed Oct 30 14:06:52 CET 2003 Jochen Eisinger + + * Finish the silc-mime.pl script. It now supports MIME type + guessing using magic files, signing data messages, executing + MIME handlers in background. Affected files + irssi/scripts/silc-mime.pl and irssi/docs/help/in/mmsg.in + + * Changed MIME signal handler to make things easier for the perl + script. Affected files irssi/src/silc/core/client_ops.c, + silc-servers.c, and irssi/docs/signals.txt + + * Cleaned up the silc_mime_parse function and fixed detection + of wrapped header lines. Affected file lib/silcutil/silcstrutil.c + Sun Oct 26 21:19:02 EET 2003 Pekka Riikonen * Resolve the IP for file transfer listener from the connection diff --git a/lib/silcutil/silcstrutil.c b/lib/silcutil/silcstrutil.c index 0d17d970..f84ea96b 100644 --- a/lib/silcutil/silcstrutil.c +++ b/lib/silcutil/silcstrutil.c @@ -532,16 +532,25 @@ bool silc_utf8_valid(const unsigned char *utf8, SilcUInt32 utf8_len) #define MIME_TRANSFER_ENCODING "Content-Transfer-Encoding: " #define MIME_TRANSFER_ENCODING_LEN 27 -#define MIME_GET_FIELD(header, mime, mime_len, field, field_len, \ +#define MIME_GET_FIELD(mime, mime_len, field, field_len, \ dest, dest_size) \ do { \ if (dest) { \ - char *f = strstr(header, field); \ + char *f = strstr(mime, field); \ if (f) { \ - f = (char *)mime + (f - header) + field_len; \ - for (i = 0; i < (mime_len - (f - (char *)mime)); i++) { \ + int parse_len; \ + f += field_len; \ + parse_len = (mime_len - (f - (char *)mime)); \ + for (i = 0; i < parse_len; i++) { \ if ((i == dest_size) || \ - (((f[i] == '\n') || (f[i] == '\r')) && !(f[i+1] == '\t'))) \ + ((f[i] == '\n') && \ + ((i == parse_len - 1) || \ + ((f[i+1] != ' ') && (f[i+1] != '\t')))) || \ + ((f[i] == '\r') && \ + ((i == parse_len - 1) || \ + ((f[i+1] != ' ') && (f[i+1] != '\n'))) && \ + ((i >= parse_len - 2) || \ + ((f[i+2] != ' ') && (f[i+2] != '\t'))))) \ break; \ dest[i] = f[i]; \ } \ @@ -558,8 +567,8 @@ silc_mime_parse(const unsigned char *mime, SilcUInt32 mime_len, char *transfer_encoding, SilcUInt32 transfer_encoding_size, unsigned char **mime_data_ptr, SilcUInt32 *mime_data_len) { - char *header; int i; + unsigned char *tmp; /* Get the pointer to the data area in the object */ for (i = 0; i < mime_len; i++) { @@ -579,28 +588,22 @@ silc_mime_parse(const unsigned char *mime, SilcUInt32 mime_len, if (mime_data_len) *mime_data_len = mime_len - (i + (mime[i] == '\n' ? 2 : 4)); - header = silc_calloc(i + 1, 1); - memcpy(header, mime, i); - /* Check for mandatory Content-Type field */ - if (!strstr(header, MIME_CONTENT_TYPE)) { - silc_free(header); + tmp = strstr(mime, MIME_CONTENT_TYPE); + if (!tmp || (tmp - mime) >= i) return FALSE; - } /* Get MIME version, Content-Type and Transfer Encoding fields */ - MIME_GET_FIELD(header, mime, mime_len, + MIME_GET_FIELD(mime, mime_len, MIME_VERSION, MIME_VERSION_LEN, version, version_size); - MIME_GET_FIELD(header, mime, mime_len, + MIME_GET_FIELD(mime, mime_len, MIME_CONTENT_TYPE, MIME_CONTENT_TYPE_LEN, content_type, content_type_size); - MIME_GET_FIELD(header, mime, mime_len, + MIME_GET_FIELD(mime, mime_len, MIME_TRANSFER_ENCODING, MIME_TRANSFER_ENCODING_LEN, transfer_encoding, transfer_encoding_size); - silc_free(header); - return TRUE; }