comparison src/lib-charset/charset-iconv.c @ 9586:97b702abd132 HEAD

lib-charset: Don't assert-crash when iconv() skips lots of invalid input.
author Timo Sirainen <tss@iki.fi>
date Mon, 21 Jun 2010 21:17:58 +0100
parents 00cd9aacd03c
children 91c605339e45
comparison
equal deleted inserted replaced
9585:cdc66c6e0c6f 9586:97b702abd132
129 charset_to_utf8(struct charset_translation *t, 129 charset_to_utf8(struct charset_translation *t,
130 const unsigned char *src, size_t *src_size, buffer_t *dest) 130 const unsigned char *src, size_t *src_size, buffer_t *dest)
131 { 131 {
132 bool dtcase = (t->flags & CHARSET_FLAG_DECOMP_TITLECASE) != 0; 132 bool dtcase = (t->flags & CHARSET_FLAG_DECOMP_TITLECASE) != 0;
133 enum charset_result result; 133 enum charset_result result;
134 size_t pos, used, size, prev_used = 0; 134 size_t pos, used, size, prev_pos = 0, prev_used = 0;
135 bool ret; 135 bool ret;
136 136
137 for (pos = 0;;) { 137 for (pos = 0;;) {
138 size = *src_size - pos; 138 size = *src_size - pos;
139 ret = charset_to_utf8_try(t, src + pos, &size, dest, &result); 139 ret = charset_to_utf8_try(t, src + pos, &size, dest, &result);
149 used = dest->used; 149 used = dest->used;
150 size = buffer_get_size(dest) - used + 1; 150 size = buffer_get_size(dest) - used + 1;
151 (void)buffer_append_space_unsafe(dest, size); 151 (void)buffer_append_space_unsafe(dest, size);
152 buffer_set_used_size(dest, used); 152 buffer_set_used_size(dest, used);
153 } else { 153 } else {
154 i_assert(dest->used != prev_used); 154 i_assert(dest->used != prev_used || pos != prev_pos);
155 prev_pos = pos;
155 prev_used = dest->used; 156 prev_used = dest->used;
156 } 157 }
157 } 158 }
158 } 159 }
159 160