]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-index: Fix duplicate fields in mail_cache_register_fields()
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Fri, 3 Jun 2016 17:14:01 +0000 (20:14 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 14 Jun 2016 09:21:35 +0000 (12:21 +0300)
Broken by hash_table_insert() API change. The earlier code was also a bit
wrong by allocating a bit too much memory when there were duplicate fields
being registered.

src/lib-index/mail-cache-fields.c

index 98a030b9ca25ae60b5cb5dd495940091a86e0f63..a46a2e400ea9df0a3c9f3c9ab71b8c0aa856b39c 100644 (file)
@@ -105,7 +105,7 @@ void mail_cache_register_fields(struct mail_cache *cache,
        char *name;
        void *value;
        unsigned int new_idx;
-       unsigned int i, j;
+       unsigned int i, j, registered_count;
 
        new_idx = cache->fields_count;
        for (i = 0; i < fields_count; i++) {
@@ -141,10 +141,11 @@ void mail_cache_register_fields(struct mail_cache *cache,
                          cache->fields_count * sizeof(*cache->field_file_map),
                          new_idx * sizeof(*cache->field_file_map));
 
+       registered_count = cache->fields_count;
        for (i = 0; i < fields_count; i++) {
                unsigned int idx = fields[i].idx;
 
-               if (idx < cache->fields_count)
+               if (idx < registered_count)
                        continue;
 
                /* new index - save it */
@@ -159,7 +160,9 @@ void mail_cache_register_fields(struct mail_cache *cache,
 
                hash_table_insert(cache->field_name_hash, name,
                                  POINTER_CAST(idx));
+               registered_count++;
        }
+       i_assert(registered_count == new_idx);
        cache->fields_count = new_idx;
 }