Wed Oct 30 14:06:52 CET 2003 Jochen Eisinger <jochen@penguin-breeder.org>
authorJochen Eisinger <coffee@silcnet.org>
Thu, 30 Oct 2003 13:19:45 +0000 (13:19 +0000)
committerJochen Eisinger <coffee@silcnet.org>
Thu, 30 Oct 2003 13:19:45 +0000 (13:19 +0000)
* Cleaned up the silc_mime_parse function and fixed detection
  of wrapped header lines. Affected file lib/silcutil/silcstrutil.c

CHANGES
lib/silcutil/silcstrutil.c

diff --git a/CHANGES b/CHANGES
index 89bd16d8ec684fb74d5c6cd5f680e55a06004244..f61e623fc5e6d4dc1cb9b9124c61a3e93dcc0901 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,17 @@
+Wed Oct 30 14:06:52 CET 2003 Jochen Eisinger <jochen@penguin-breeder.org>
+
+       * 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 <priikone@silcnet.org>
 
        * Resolve the IP for file transfer listener from the connection
index 0d17d9702a3c44df5f8439a926c62ddfb387ab75..f84ea96bee1f5e24f9fe5557177cea0cfbe1a9fa 100644 (file)
@@ -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;
 }