From b9a3f8d7c0f4ff2543e259830826b86a50b0ba09 Mon Sep 17 00:00:00 2001 From: SJ Date: Mon, 14 Mar 2016 21:26:18 +0100 Subject: [PATCH] fixed a multiline subject header decoding issue --- src/config.h | 2 +- src/parser.c | 58 ++++++++++++++++++++++++++-------------------------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/config.h b/src/config.h index d145b519..beef97f1 100644 --- a/src/config.h +++ b/src/config.h @@ -13,7 +13,7 @@ #define VERSION "1.2.0-master" -#define BUILD 939 +#define BUILD 940 #define HOSTID "mailarchiver" diff --git a/src/parser.c b/src/parser.c index fa1343a8..f0b80474 100644 --- a/src/parser.c +++ b/src/parser.c @@ -108,8 +108,6 @@ void post_parse(struct session_data *sdata, struct parser_state *state, struct _ clearhash(state->journal_recipient); trimBuffer(state->b_subject); - fixupEncodedHeaderLine(state->b_subject, MAXBUFSIZE); - if(sdata->internal_sender == 0) sdata->direction = DIRECTION_INCOMING; else { @@ -460,34 +458,36 @@ int parse_line(char *buf, struct parser_state *state, struct session_data *sdata } - if(state->is_1st_header == 1 && state->message_state == MSG_SUBJECT && strlen(state->b_subject) + strlen(buf) < MAXBUFSIZE-1){ - - if(state->b_subject[0] == '\0'){ - p = &buf[0]; - if(strncmp(buf, "Subject:", strlen("Subject:")) == 0) p += strlen("Subject:"); - if(*p == ' ') p++; - - strncat(state->b_subject, p, MAXBUFSIZE-strlen(state->b_subject)-1); - } - else { - - /* - * if the next subject line is encoded, then strip the whitespace characters at the beginning of the line - */ - - p = buf; - - if(strcasestr(buf, "?Q?") || strcasestr(buf, "?B?")){ - while(isspace(*p)) p++; - } - - strncat(state->b_subject, p, MAXBUFSIZE-strlen(state->b_subject)-1); - } - } - - if(state->is_1st_header == 1){ - fixupEncodedHeaderLine(buf, MAXBUFSIZE); + + if(state->message_state == MSG_SUBJECT && strlen(state->b_subject) + strlen(buf) < MAXBUFSIZE-1){ + + if(state->b_subject[0] == '\0'){ + p = &buf[0]; + if(strncmp(buf, "Subject:", strlen("Subject:")) == 0) p += strlen("Subject:"); + if(*p == ' ') p++; + + fixupEncodedHeaderLine(p, MAXBUFSIZE); + strncat(state->b_subject, p, MAXBUFSIZE-strlen(state->b_subject)-1); + } + else { + + /* + * if the next subject line is encoded, then strip the whitespace characters at the beginning of the line + */ + + p = buf; + + if(strcasestr(buf, "?Q?") || strcasestr(buf, "?B?")){ + while(isspace(*p)) p++; + } + + fixupEncodedHeaderLine(p, MAXBUFSIZE); + + strncat(state->b_subject, p, MAXBUFSIZE-strlen(state->b_subject)-1); + } + } + else { fixupEncodedHeaderLine(buf, MAXBUFSIZE); } }