[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#385011: decode_header_line assertion



Attempt to fix that and some more:

mimedecode (1.9-4cii0) unstable; urgency=low

  * Make the outside and inside versions agree.
  * Tweak the man page to get a name description. Closes: #515016.
  * Stolen fixes from upstream (Darren Salt), who's at version 1.10 since 2003
    and suggested an upgrade in Dec 2002, see #173631 and
    http://www.youmustbejoking.demon.co.uk/progs.linux.html#mimedecode.
  * More case tolerant on headers stuff. Closes: #399677.
  * Fixes assertion in decode_header_line. Closes: #385011. Closes: #385325.
  * Comment on #294523: mimedecode acts on headers. Using formail to extract
    the Subject will remove the 'header' part. Use grep instead of formail and
    it will work.

 -- Cristian Ionescu-Idbohrn <cii@axis.com>  Sun, 24 May 2009 12:06:31 +0200

--- mimedecode.c.original	2009-05-22 12:12:51.000000000 +0200
+++ mimedecode.c	2009-05-24 10:40:59.000000000 +0200
@@ -64,7 +64,7 @@

 /* Some defines. Should have gone into a file by itself.
  */
-#define MIMED_VERSION "mimedecode version 1.8"
+#define MIMED_VERSION "mimedecode version 1.9"

 #define FALSE 0
 #define TRUE  1
@@ -124,6 +124,7 @@
 static int parse_body(int, int, char *);
 static int parse_header(struct mime_header *);
 static char *decode_header_line(char *);
+static int is_mimetype(const char *, const char *);
 static void print_state(int);
 static int casncmp(const char *, const char *, int);
 static int valid_charset(char *, int);
@@ -455,17 +456,20 @@

 		    if (!casncmp(linebuf,"content-type:",13))
 		    {
+			const char *content = linebuf + 12;
+			while (isspace(*(++content)))
+			    ;
 			ct_read = TRUE;

 			/* we are only doing decoding of text types */
-			if (strstr(linebuf, "text/") || strstr(linebuf, "Text/"))
+			if (is_mimetype(content, "text/"))
 			{
 			    if (debug >=3 )
 				fprintf(stderr,"Content IS text\n");

 			    mhp->content_type = TEXT;
 			}
-			else if (  strstr(linebuf, "multipart/"))
+			else if (is_mimetype(content, "multipart/"))
 			{
 			    mhp->content_type = MULT;

@@ -501,7 +505,7 @@
 				}
 			    }
 			}
-			else if (  strstr(linebuf, "message/"))
+			else if (is_mimetype(content, "message/"))
 			{
 			    mhp->content_type = MESG;
 			}
@@ -933,8 +937,12 @@
 	}
  	*retp++ = c;
     }
-    if (state != HUNT) {

+    if (header_logging) print_state (state);
+
+    if (state != HUNT
+	&& state != B_FIELD && state != Q_FIELD
+	&& state != DEC1 && state != DEC2) {
 	*retp++ = '=';
 	*retp++ = '?';
 	while (*charset) *retp++ = *charset++;
@@ -947,6 +955,22 @@


 /*******************************************************************/
+static int is_mimetype(content, type)
+/*******************************************************************/
+const char *content, *type;
+{
+    int l = strlen(type);        /* assumed non-zero */
+
+    if (type[l - 1] == '/')
+	return !casncmp(content, type, l);
+
+    return !casncmp(content, type, l) &&
+	(content[l] == '\0' || content[l] == ';' || isspace(content[l]));
+}
+
+
+
+/*******************************************************************/
 static void print_state(state)
 /*******************************************************************/
 int	state;


Cheers,

-- 
Cristian



Reply to: