Mercurial > dovecot > original-hg > dovecot-1.2
changeset 6945:5915aea5f070 HEAD
UID ranges can be large, don't allocate them from data stack.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 07 Dec 2007 16:16:58 +0200 |
parents | 66b3e894041b |
children | 49ba86f65da5 |
files | src/plugins/fts-squat/squat-trie.c src/plugins/fts-squat/squat-uidlist.c |
diffstat | 2 files changed, 39 insertions(+), 36 deletions(-) [+] |
line wrap: on
line diff
--- a/src/plugins/fts-squat/squat-trie.c Fri Dec 07 16:10:19 2007 +0200 +++ b/src/plugins/fts-squat/squat-trie.c Fri Dec 07 16:16:58 2007 +0200 @@ -1631,8 +1631,8 @@ ctx.type = type; ctx.definite_uids = definite_uids; ctx.maybe_uids = maybe_uids; - t_array_init(&ctx.tmp_uids, 128); - t_array_init(&ctx.tmp_uids2, 128); + i_array_init(&ctx.tmp_uids, 128); + i_array_init(&ctx.tmp_uids2, 128); ctx.first = TRUE; str_bytelen = strlen(str); @@ -1667,31 +1667,32 @@ char_lengths, i - start); } - squat_trie_add_unknown(trie, maybe_uids); - return ret < 0 ? -1 : 0; - } - - if (str_charlen <= trie->hdr.partial_len || - trie->hdr.full_len > trie->hdr.partial_len) { - ret = squat_trie_lookup_data(trie, data, str_bytelen, - &ctx.tmp_uids); - if (ret > 0) { - squat_trie_filter_type(type, &ctx.tmp_uids, - definite_uids); + } else { + if (str_charlen <= trie->hdr.partial_len || + trie->hdr.full_len > trie->hdr.partial_len) { + ret = squat_trie_lookup_data(trie, data, str_bytelen, + &ctx.tmp_uids); + if (ret > 0) { + squat_trie_filter_type(type, &ctx.tmp_uids, + definite_uids); + } + } else { + array_clear(definite_uids); } - } else { - array_clear(definite_uids); - } - if (str_charlen <= trie->hdr.partial_len || - trie->hdr.partial_len == 0) { - /* we have the result */ - array_clear(maybe_uids); - } else { - ret = squat_trie_lookup_partial(&ctx, data + start, - char_lengths, i - start); + if (str_charlen <= trie->hdr.partial_len || + trie->hdr.partial_len == 0) { + /* we have the result */ + array_clear(maybe_uids); + } else { + ret = squat_trie_lookup_partial(&ctx, data + start, + char_lengths, + i - start); + } } squat_trie_add_unknown(trie, maybe_uids); + array_free(&ctx.tmp_uids); + array_free(&ctx.tmp_uids2); return ret < 0 ? -1 : 0; }
--- a/src/plugins/fts-squat/squat-uidlist.c Fri Dec 07 16:10:19 2007 +0200 +++ b/src/plugins/fts-squat/squat-uidlist.c Fri Dec 07 16:16:58 2007 +0200 @@ -1364,22 +1364,24 @@ struct seq_range range; const uint32_t *tmp_uids; unsigned int i, count; - - t_array_init(&tmp_uid_arr, 128); - if (squat_uidlist_get(uidlist, uid_list_idx, &tmp_uid_arr) < 0) - return -1; + int ret; - tmp_uids = array_get(&tmp_uid_arr, &count); - for (i = 0; i < count; i++) { - if ((tmp_uids[i] & UID_LIST_MASK_RANGE) == 0) - range.seq1 = range.seq2 = tmp_uids[i]; - else { - range.seq1 = tmp_uids[i] & ~UID_LIST_MASK_RANGE; - range.seq2 = tmp_uids[++i]; + i_array_init(&tmp_uid_arr, 128); + ret = squat_uidlist_get(uidlist, uid_list_idx, &tmp_uid_arr); + if (ret == 0) { + tmp_uids = array_get(&tmp_uid_arr, &count); + for (i = 0; i < count; i++) { + if ((tmp_uids[i] & UID_LIST_MASK_RANGE) == 0) + range.seq1 = range.seq2 = tmp_uids[i]; + else { + range.seq1 = tmp_uids[i] & ~UID_LIST_MASK_RANGE; + range.seq2 = tmp_uids[++i]; + } + array_append(seq_range_arr, &range, 1); } - array_append(seq_range_arr, &range, 1); } - return 0; + array_free(&tmp_uid_arr); + return ret; } int squat_uidlist_filter(struct squat_uidlist *uidlist, uint32_t uid_list_idx,