Mercurial > dovecot > core-2.2
changeset 12845:d3d6ed6d268b
dbox: Give more verbose error message about broken attachment ext-refs.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 12 Mar 2011 17:24:38 +0200 |
parents | b896d72d7fa7 |
children | 0a1a0d33c1b2 |
files | src/lib-storage/index/dbox-common/dbox-attachment.c |
diffstat | 1 files changed, 23 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/dbox-common/dbox-attachment.c Sat Mar 12 17:18:47 2011 +0200 +++ b/src/lib-storage/index/dbox-common/dbox-attachment.c Sat Mar 12 17:24:38 2011 +0200 @@ -139,7 +139,8 @@ static int dbox_attachment_file_get_stream_from(struct dbox_file *file, const char *ext_refs, - struct istream **stream) + struct istream **stream, + const char **error_r) { ARRAY_TYPE(mail_attachment_extref) extrefs_arr; ARRAY_DEFINE(streams, struct istream *); @@ -150,10 +151,14 @@ unsigned int i; int ret = 1; + *error_r = NULL; + t_array_init(&extrefs_arr, 16); if (!dbox_attachment_parse_extref_real(ext_refs, pool_datastack_create(), - &extrefs_arr)) + &extrefs_arr)) { + *error_r = "Broken ext-refs string"; return 0; + } psize = dbox_file_get_plaintext_size(file); t_array_init(&streams, 8); @@ -169,7 +174,10 @@ array_append(&streams, &input, 1); i_stream_seek(*stream, (*stream)->v_offset + part_size); if ((*stream)->v_offset + part_size > psize) { - /* extrefs point outside message */ + *error_r = t_strdup_printf( + "ext-refs point outside message " + "(%"PRIuUOFF_T" + %"PRIuUOFF_T" > %"PRIuUOFF_T")", + (*stream)->v_offset, part_size, psize); ret = 0; } last_voffset += part_size; @@ -192,8 +200,11 @@ } if (psize != (*stream)->v_offset) { - if (psize < (*stream)->v_offset) { - /* extrefs point outside message */ + if ((*stream)->v_offset > psize) { + *error_r = t_strdup_printf( + "ext-refs point outside message " + "(%"PRIuUOFF_T" > %"PRIuUOFF_T")", + (*stream)->v_offset, psize); ret = 0; } else { uoff_t trailer_size = psize - (*stream)->v_offset; @@ -215,7 +226,7 @@ int dbox_attachment_file_get_stream(struct dbox_file *file, struct istream **stream) { - const char *ext_refs; + const char *ext_refs, *error; int ret; /* need to read metadata in case there are external references */ @@ -231,11 +242,12 @@ /* we have external references. */ T_BEGIN { ret = dbox_attachment_file_get_stream_from(file, ext_refs, - stream); + stream, &error); + if (ret == 0) { + dbox_file_set_corrupted(file, + "Corrupted ext-refs metadata %s: %s", + ext_refs, error); + } } T_END; - if (ret == 0) { - dbox_file_set_corrupted(file, "Ext refs metadata corrupted: %s", - ext_refs); - } return ret; }