X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilcmime.c;h=c0817ec0f594d1eaed43c27d1f88fac673929116;hb=52e57c880aba9c5e89f59d962eb9af75670b76e0;hp=211b36c3b8dfecb858f85805c225fcfcffd2480b;hpb=3a4359b248742c4d08d00c06badcb346d4a19528;p=silc.git diff --git a/lib/silcutil/silcmime.c b/lib/silcutil/silcmime.c index 211b36c3..c0817ec0 100644 --- a/lib/silcutil/silcmime.c +++ b/lib/silcutil/silcmime.c @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 2005 - 2006 Pekka Riikonen + Copyright (C) 2005 - 2007 Pekka Riikonen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -198,6 +198,7 @@ SilcMime silc_mime_decode(SilcMime mime, const unsigned char *data, if (field && strstr(field, "multipart")) { char b[1024]; SilcMime p; + unsigned int len; mime->multiparts = silc_dlist_init(); if (!mime->multiparts) @@ -213,7 +214,10 @@ SilcMime silc_mime_decode(SilcMime mime, const unsigned char *data, if (!strchr(field, ';')) goto err; memset(b, 0, sizeof(b)); - strncat(b, value, strchr(field, ';') - value); + len = (unsigned int)(strchr(field, ';') - value); + if (len > sizeof(b) - 1) + goto err; + strncpy(b, value, len); if (strchr(b, '"')) *strchr(b, '"') = '\0'; mime->multitype = silc_memdup(b, strlen(b)); @@ -229,10 +233,10 @@ SilcMime silc_mime_decode(SilcMime mime, const unsigned char *data, line = strdup(value); if (strrchr(line, '"')) { *strrchr(line, '"') = '\0'; - snprintf(b, sizeof(b) - 1, "--%s", line + 1); + silc_snprintf(b, sizeof(b) - 1, "--%s", line + 1); mime->boundary = strdup(line + 1); } else { - snprintf(b, sizeof(b) - 1, "--%s", line); + silc_snprintf(b, sizeof(b) - 1, "--%s", line); mime->boundary = strdup(line); } silc_free(line); @@ -282,11 +286,14 @@ SilcMime silc_mime_decode(SilcMime mime, const unsigned char *data, } } } else { - /* Get data area */ - if (i >= data_len) + /* Get data area. If we are at the end and we have fields present + there is no data area present, but, if fields are not present we + only have data area. */ + if (i >= data_len && !silc_hash_table_count(mime->fields)) i = 0; SILC_LOG_DEBUG(("Data len %d", data_len - i)); - silc_mime_add_data(mime, tmp + i, data_len - i); + if (data_len - i) + silc_mime_add_data(mime, tmp + i, data_len - i); } return mime; @@ -319,10 +326,10 @@ unsigned char *silc_mime_encode(SilcMime mime, SilcUInt32 *encoded_len) /* Encode the headers. Order doesn't matter */ i = 0; silc_hash_table_list(mime->fields, &htl); - while (silc_hash_table_get(&htl, (void **)&field, (void **)&value)) { + while (silc_hash_table_get(&htl, (void *)&field, (void *)&value)) { memset(tmp, 0, sizeof(tmp)); SILC_LOG_DEBUG(("Header %s: %s", field, value)); - snprintf(tmp, sizeof(tmp) - 1, "%s: %s\r\n", field, value); + silc_snprintf(tmp, sizeof(tmp) - 1, "%s: %s\r\n", field, value); silc_buffer_strformat(&buf, tmp, SILC_STRFMT_END); i++; } @@ -339,6 +346,7 @@ unsigned char *silc_mime_encode(SilcMime mime, SilcUInt32 *encoded_len) if (silc_buffer_len(&buf)) { silc_buffer_put(buffer, buf.head, silc_buffer_len(&buf)); silc_buffer_pull(buffer, silc_buffer_len(&buf)); + silc_buffer_purge(&buf); } /* Add data */ @@ -367,8 +375,8 @@ unsigned char *silc_mime_encode(SilcMime mime, SilcUInt32 *encoded_len) /* If fields are not present, add extra CRLF */ if (!silc_hash_table_count(part->fields)) - snprintf(tmp2, sizeof(tmp2) - 1, "\r\n"); - snprintf(tmp, sizeof(tmp) - 1, "%s--%s\r\n%s", + silc_snprintf(tmp2, sizeof(tmp2) - 1, "\r\n"); + silc_snprintf(tmp, sizeof(tmp) - 1, "%s--%s\r\n%s", i != 0 ? "\r\n" : "", mime->boundary, tmp2); i = 1; @@ -384,7 +392,7 @@ unsigned char *silc_mime_encode(SilcMime mime, SilcUInt32 *encoded_len) } memset(tmp, 0, sizeof(tmp)); - snprintf(tmp, sizeof(tmp) - 1, "\r\n--%s--\r\n", mime->boundary); + silc_snprintf(tmp, sizeof(tmp) - 1, "\r\n--%s--\r\n", mime->boundary); buffer = silc_buffer_realloc(buffer, silc_buffer_truelen(buffer) + strlen(tmp)); if (!buffer) @@ -458,7 +466,7 @@ SilcMime silc_mime_assemble(SilcMimeAssembler assembler, SilcMime partial) /* Find fragments with this ID. */ if (!silc_hash_table_find(assembler->fragments, (void *)id, - NULL, (void **)&f)) { + NULL, (void *)&f)) { /* This is new fragment to new message. Add to hash table and return. */ f = silc_hash_table_alloc(0, silc_hash_uint, NULL, NULL, NULL, silc_mime_assemble_dest, NULL, TRUE); @@ -503,7 +511,7 @@ SilcMime silc_mime_assemble(SilcMimeAssembler assembler, SilcMime partial) /* Assemble the complete MIME message now. We get them in order from the hash table. */ for (i = 1; i <= total; i++) { - if (!silc_hash_table_find(f, SILC_32_TO_PTR(i), NULL, (void **)&p)) + if (!silc_hash_table_find(f, SILC_32_TO_PTR(i), NULL, (void *)&p)) goto err; /* The fragment is in the data portion of the partial message */ @@ -575,7 +583,7 @@ SilcDList silc_mime_encode_partial(SilcMime mime, int max_size) memset(type, 0, sizeof(type)); gethostname(type, sizeof(type) - 1); srand((time(NULL) + buf_len) ^ rand()); - snprintf(id, sizeof(id) - 1, "%X%X%X%s", + silc_snprintf(id, sizeof(id) - 1, "%X%X%X%s", (unsigned int)rand(), (unsigned int)time(NULL), (unsigned int)buf_len, type); @@ -587,7 +595,7 @@ SilcDList silc_mime_encode_partial(SilcMime mime, int max_size) silc_mime_add_field(partial, "MIME-Version", "1.0"); memset(type, 0, sizeof(type)); - snprintf(type, sizeof(type) - 1, + silc_snprintf(type, sizeof(type) - 1, "message/partial; id=\"%s\"; number=1", id); silc_mime_add_field(partial, "Content-Type", type); silc_mime_add_data(partial, buf, max_size); @@ -617,14 +625,14 @@ SilcDList silc_mime_encode_partial(SilcMime mime, int max_size) silc_mime_add_field(partial, "MIME-Version", "1.0"); if (len > max_size) { - snprintf(type, sizeof(type) - 1, + silc_snprintf(type, sizeof(type) - 1, "message/partial; id=\"%s\"; number=%d", id, num++); silc_mime_add_data(partial, buf + off, max_size); off += max_size; len -= max_size; } else { - snprintf(type, sizeof(type) - 1, + silc_snprintf(type, sizeof(type) - 1, "message/partial; id=\"%s\"; number=%d; total=%d", id, num, num); silc_mime_add_data(partial, buf + off, len); @@ -695,7 +703,7 @@ const char *silc_mime_get_field(SilcMime mime, const char *field) return NULL; if (!silc_hash_table_find(mime->fields, (void *)field, - NULL, (void **)&value)) + NULL, (void *)&value)) return NULL; return (const char *)value; @@ -774,7 +782,7 @@ void silc_mime_set_multipart(SilcMime mime, const char *type, return; memset(tmp, 0, sizeof(tmp)); - snprintf(tmp, sizeof(tmp) - 1, "multipart/%s; boundary=%s", type, boundary); + silc_snprintf(tmp, sizeof(tmp) - 1, "multipart/%s; boundary=%s", type, boundary); silc_mime_add_field(mime, "Content-Type", tmp); silc_free(mime->boundary); mime->boundary = strdup(boundary);