dovecot: mail_index_seq_array_lookup() didn't return idx_r corre...

dovecot at dovecot.org dovecot at dovecot.org
Mon Aug 6 17:30:07 EEST 2007


details:   http://hg.dovecot.org/dovecot/rev/eb307524cf16
changeset: 6169:eb307524cf16
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Aug 06 17:12:00 2007 +0300
description:
mail_index_seq_array_lookup() didn't return idx_r correctly always, which
could have caused out-of-order mail_index_update_ext() calls to break. We'll
use bsearch_insert_pos() now instead of our own duplicated code.

diffstat:

1 file changed, 15 insertions(+), 32 deletions(-)
src/lib-index/mail-index-transaction.c |   47 ++++++++++----------------------

diffs (67 lines):

diff -r 28d1cfbbce6e -r eb307524cf16 src/lib-index/mail-index-transaction.c
--- a/src/lib-index/mail-index-transaction.c	Mon Aug 06 16:31:48 2007 +0300
+++ b/src/lib-index/mail-index-transaction.c	Mon Aug 06 17:12:00 2007 +0300
@@ -7,6 +7,7 @@
 #include "lib.h"
 #include "ioloop.h"
 #include "array.h"
+#include "bsearch-insert-pos.h"
 #include "seq-range-array.h"
 #include "mail-index-view-private.h"
 #include "mail-transaction-log.h"
@@ -127,41 +128,23 @@ void mail_index_transaction_unref(struct
 		mail_index_transaction_free(t);
 }
 
+static int mail_index_seq_record_cmp(const void *key, const void *data)
+{
+	const uint32_t *seq_p = key;
+	const uint32_t *data_seq = data;
+
+	return *seq_p - *data_seq;
+}
+
 bool mail_index_seq_array_lookup(const ARRAY_TYPE(seq_array) *array,
 				 uint32_t seq, unsigned int *idx_r)
 {
-	unsigned int idx, left_idx, right_idx, count;
-	const uint32_t *seq_p;
-
-	count = array_count(array);
-	if (count == 0) {
-		*idx_r = 0;
-		return FALSE;
-	}
-
-	/* we're probably appending it, check */
-	seq_p = array_idx(array, count-1);
-	if (*seq_p < seq)
-		idx = count;
-	else {
-		idx = 0; left_idx = 0; right_idx = count;
-		while (left_idx < right_idx) {
-			idx = (left_idx + right_idx) / 2;
-
-			seq_p = array_idx(array, idx);
-			if (*seq_p < seq)
-				left_idx = idx+1;
-			else if (*seq_p > seq)
-				right_idx = idx;
-			else {
-				*idx_r = idx;
-				return TRUE;
-			}
-		}
-	}
-
-	*idx_r = idx;
-	return FALSE;
+	const void *base;
+	unsigned int count;
+
+	base = array_get(array, &count);
+	return bsearch_insert_pos(&seq, base, count, array->arr.element_size,
+				  mail_index_seq_record_cmp, idx_r);
 }
 
 static bool mail_index_seq_array_add(ARRAY_TYPE(seq_array) *array, uint32_t seq,


More information about the dovecot-cvs mailing list