]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Thread indexes: Crashfix.
authorTimo Sirainen <tss@iki.fi>
Mon, 1 Sep 2008 13:10:27 +0000 (16:10 +0300)
committerTimo Sirainen <tss@iki.fi>
Mon, 1 Sep 2008 13:10:27 +0000 (16:10 +0300)
--HG--
branch : HEAD

src/lib-storage/index/index-thread-links.c

index 2e0a5cdd9210fdbfc26ec5c52cc40c49beecd350..58eeca8786a85632ccf4c94c1c79b01002440bb6 100644 (file)
@@ -50,8 +50,16 @@ static void thread_link_reference(struct mail_thread_cache *cache,
 
        i_assert(parent_idx < cache->first_invalid_msgid_str_idx);
 
-       parent = array_idx_modifiable(&cache->thread_nodes, parent_idx);
-       child = array_idx_modifiable(&cache->thread_nodes, child_idx);
+       /* either child_idx or parent_idx may cause thread_nodes array to
+          grow. in such situation the other pointer may become invalid if
+          we don't get the pointers in correct order. */
+       if (child_idx < parent_idx) {
+               parent = array_idx_modifiable(&cache->thread_nodes, parent_idx);
+               child = array_idx_modifiable(&cache->thread_nodes, child_idx);
+       } else {
+               child = array_idx_modifiable(&cache->thread_nodes, child_idx);
+               parent = array_idx_modifiable(&cache->thread_nodes, parent_idx);
+       }
 
        child->parent_link_refcount++;
        if (thread_node_has_ancestor(cache, parent, child)) {