Added SilcStack support to SILC Hash Table API.
[silc.git] / lib / silcutil / silcmime.c
index d4407dfe4ed1a210b95afdfb6051ee1da5e510b1..6afc48f9be17d658cff6bf8a3c4be1276b93d9b0 100644 (file)
@@ -59,7 +59,7 @@ SilcMime silc_mime_alloc(void)
   if (!mime)
     return NULL;
 
-  mime->fields = silc_hash_table_alloc(0, silc_hash_string, mime,
+  mime->fields = silc_hash_table_alloc(NULL, 0, silc_hash_string, mime,
                                       silc_hash_string_compare, mime,
                                       silc_mime_field_dest, mime, TRUE);
   if (!mime->fields) {
@@ -102,7 +102,7 @@ SilcMimeAssembler silc_mime_assembler_alloc(void)
     return NULL;
 
   assembler->fragments =
-    silc_hash_table_alloc(0, silc_hash_string, NULL,
+    silc_hash_table_alloc(NULL, 0, silc_hash_string, NULL,
                          silc_hash_string_compare, NULL,
                          silc_mime_assembler_dest, assembler, TRUE);
   if (!assembler->fragments) {
@@ -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));
@@ -342,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 */
@@ -463,7 +468,7 @@ SilcMime silc_mime_assemble(SilcMimeAssembler assembler, SilcMime partial)
   if (!silc_hash_table_find(assembler->fragments, (void *)id,
                            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,
+    f = silc_hash_table_alloc(NULL, 0, silc_hash_uint, NULL, NULL, NULL,
                              silc_mime_assemble_dest, NULL, TRUE);
     if (!f)
         goto err;