dovecot-2.0: lib-storage: Fixed storing newlines at the end of b...
dovecot at dovecot.org
dovecot at dovecot.org
Fri Dec 3 11:23:59 EET 2010
details: http://hg.dovecot.org/dovecot-2.0/rev/4455f79f964d
changeset: 12503:4455f79f964d
user: Timo Sirainen <tss at iki.fi>
date: Fri Dec 03 09:10:12 2010 +0000
description:
lib-storage: Fixed storing newlines at the end of base64 attachments.
diffstat:
src/lib-storage/index/index-attachment.c | 39 +++++++------------
1 files changed, 14 insertions(+), 25 deletions(-)
diffs (85 lines):
diff -r e5dcc12f8dba -r 4455f79f964d src/lib-storage/index/index-attachment.c
--- a/src/lib-storage/index/index-attachment.c Fri Dec 03 09:09:10 2010 +0000
+++ b/src/lib-storage/index/index-attachment.c Fri Dec 03 09:10:12 2010 +0000
@@ -39,9 +39,8 @@
uoff_t start_offset;
/* for saving attachments base64-decoded: */
- enum base64_state base64_state, base64_prev_state;
+ enum base64_state base64_state;
unsigned int base64_line_blocks, cur_base64_blocks;
- unsigned int base64_last_newline_size;
uoff_t base64_bytes;
bool base64_have_crlf; /* CRLF linefeeds */
bool base64_failed;
@@ -366,18 +365,18 @@
return -1;
}
- if (part->base64_state == BASE64_STATE_0) {
- part->base64_bytes = part->output->offset -
- part->base64_last_newline_size;
- part->base64_state = BASE64_STATE_EOM;
- }
-
- if (!part->base64_failed &&
- part->base64_state == BASE64_STATE_EOM) {
- /* base64 data looks ok. STATE_0 happens when
- there is no trailing LF or '=' characters. */
- if (index_attachment_base64_decode(ctx) < 0)
- part->base64_failed = TRUE;
+ if (!part->base64_failed) {
+ if (part->base64_state == BASE64_STATE_0 &&
+ part->base64_bytes > 0) {
+ /* there is no trailing LF or '=' characters,
+ but it's not completely empty */
+ part->base64_state = BASE64_STATE_EOM;
+ }
+ if (part->base64_state == BASE64_STATE_EOM) {
+ /* base64 data looks ok. */
+ if (index_attachment_base64_decode(ctx) < 0)
+ part->base64_failed = TRUE;
+ }
}
/* open the attachment destination file */
@@ -451,10 +450,6 @@
index_attachment_try_base64_decode_char(struct mail_save_attachment_part *part,
size_t pos, char chr)
{
- enum base64_state prev_state = part->base64_prev_state;
-
- part->base64_last_newline_size = 0;
- part->base64_prev_state = part->base64_state;
switch (part->base64_state) {
case BASE64_STATE_0:
if (base64_is_valid_char(chr))
@@ -463,15 +458,9 @@
part->base64_state = BASE64_STATE_CR;
else if (chr == '\n') {
part->base64_state = BASE64_STATE_0;
- part->base64_last_newline_size =
- prev_state == BASE64_STATE_CR ? 2 : 1;
if (part->cur_base64_blocks <
part->base64_line_blocks) {
/* last line */
- part->base64_bytes =
- part->output->offset + pos;
- if (prev_state == BASE64_STATE_CR)
- part->base64_bytes--;
part->base64_state = BASE64_STATE_EOM;
return 0;
} else if (part->base64_line_blocks == 0) {
@@ -505,11 +494,11 @@
return -1;
break;
case BASE64_STATE_3:
+ part->base64_bytes = part->output->offset + pos + 1;
if (base64_is_valid_char(chr)) {
part->base64_state = BASE64_STATE_0;
part->cur_base64_blocks++;
} else if (chr == '=') {
- part->base64_bytes = part->output->offset + pos + 1;
part->base64_state = BASE64_STATE_EOM;
part->cur_base64_blocks++;
return 0;
More information about the dovecot-cvs
mailing list