Mercurial > dovecot > core-2.2
changeset 2632:ec5601f71ba0 HEAD
Fix for circular record list detection, we can't use data stack for buffer.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 16 Sep 2004 17:33:16 +0300 |
parents | 519b768e5f2f |
children | a87abc14de35 |
files | src/lib-index/mail-cache-lookup.c src/lib-index/mail-cache-private.h src/lib-index/mail-cache.c |
diffstat | 3 files changed, 14 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mail-cache-lookup.c Thu Sep 16 17:03:00 2004 +0300 +++ b/src/lib-index/mail-cache-lookup.c Thu Sep 16 17:33:16 2004 +0300 @@ -162,7 +162,6 @@ mail_cache_foreach_callback_t *callback, void *context) { uint32_t offset; - buffer_t *offsets; int ret; if (MAIL_CACHE_IS_UNUSABLE(view->cache)) @@ -178,38 +177,34 @@ view->cached_offset = offset; } - t_push(); - offsets = buffer_create_dynamic(pool_datastack_create(), - 128, (size_t)-1); ret = 1; + buffer_set_used_size(view->offsets_buf, 0); while (offset != 0 && ret > 0) { - if (buffer_find_offset(offsets, offset)) { + if (buffer_find_offset(view->offsets_buf, offset)) { mail_cache_set_corrupted(view->cache, "record list is circular"); - ret = -1; - break; + return -1; } - buffer_append(offsets, &offset, sizeof(offset)); + buffer_append(view->offsets_buf, &offset, sizeof(offset)); ret = mail_cache_foreach_rec(view, &offset, callback, context); } if (ret > 0 && view->trans_seq1 <= seq && view->trans_seq2 >= seq && mail_cache_transaction_lookup(view->transaction, seq, &offset)) { - buffer_set_used_size(offsets, 0); + buffer_set_used_size(view->offsets_buf, 0); while (offset != 0 && ret > 0) { - if (buffer_find_offset(offsets, offset)) { + if (buffer_find_offset(view->offsets_buf, offset)) { mail_cache_set_corrupted(view->cache, "record list is circular"); - ret = -1; - break; + return -1; } - buffer_append(offsets, &offset, sizeof(offset)); + buffer_append(view->offsets_buf, + &offset, sizeof(offset)); ret = mail_cache_foreach_rec(view, &offset, callback, context); } } - t_pop(); return ret; }
--- a/src/lib-index/mail-cache-private.h Thu Sep 16 17:03:00 2004 +0300 +++ b/src/lib-index/mail-cache-private.h Thu Sep 16 17:33:16 2004 +0300 @@ -147,6 +147,8 @@ struct mail_cache_transaction_ctx *transaction; uint32_t trans_seq1, trans_seq2; + buffer_t *offsets_buf; /* temporary buffer, just to avoid mallocs */ + /* if cached_exists_buf[field] == cached_exists_value, it's cached. this allows us to avoid constantly clearing the whole buffer. it needs to be cleared only when cached_exists_value is wrapped. */
--- a/src/lib-index/mail-cache.c Thu Sep 16 17:03:00 2004 +0300 +++ b/src/lib-index/mail-cache.c Thu Sep 16 17:33:16 2004 +0300 @@ -333,6 +333,8 @@ view = i_new(struct mail_cache_view, 1); view->cache = cache; view->view = iview; + view->offsets_buf = + buffer_create_dynamic(default_pool, 128, (size_t)-1); view->cached_exists_buf = buffer_create_dynamic(default_pool, cache->file_fields_count + 10, @@ -345,6 +347,7 @@ if (view->cache->field_header_write_pending) (void)mail_cache_header_fields_update(view->cache); + buffer_free(view->offsets_buf); buffer_free(view->cached_exists_buf); i_free(view); }