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: