From: Timo Sirainen Date: Sun, 5 Jun 2016 21:07:53 +0000 (+0300) Subject: lib-index: Extension record size resizing was still broken. X-Git-Tag: 2.3.0.rc1~3546 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c6c2b49bf4c582157a964a305e0c23bbca44097c;p=thirdparty%2Fdovecot%2Fcore.git lib-index: Extension record size resizing was still broken. Fixes assert-crash: Panic: file mail-index-util.c: line 143 (mail_index_seq_array_add): assertion failed: (array->arr.element_size == sizeof(seq) + aligned_record_size) --- diff --git a/src/lib-index/mail-index-transaction-update.c b/src/lib-index/mail-index-transaction-update.c index 38f9905b97..dff497e358 100644 --- a/src/lib-index/mail-index-transaction-update.c +++ b/src/lib-index/mail-index-transaction-update.c @@ -744,18 +744,19 @@ void mail_index_ext_resize(struct mail_index_transaction *t, uint32_t ext_id, uint32_t hdr_size, uint16_t record_size, uint16_t record_align) { + const struct mail_index_registered_ext *rext; + const struct mail_transaction_ext_intro *resizes; + unsigned int resizes_count; struct mail_transaction_ext_intro intro; - uint32_t old_record_size, old_record_align, old_header_size; + uint32_t old_record_size = 0, old_record_align, old_header_size; memset(&intro, 0, sizeof(intro)); + rext = array_idx(&t->view->index->extensions, ext_id); /* get ext_id from transaction's map if it's there */ if (!mail_index_map_get_ext_idx(t->view->map, ext_id, &intro.ext_id)) { /* have to create it */ - const struct mail_index_registered_ext *rext; - intro.ext_id = (uint32_t)-1; - rext = array_idx(&t->view->index->extensions, ext_id); old_record_size = rext->record_size; old_record_align = rext->record_align; old_header_size = rext->hdr_size; @@ -763,11 +764,27 @@ void mail_index_ext_resize(struct mail_index_transaction *t, uint32_t ext_id, const struct mail_index_ext *ext; ext = array_idx(&t->view->map->extensions, intro.ext_id); - old_record_size = ext->record_size; old_record_align = ext->record_align; old_header_size = ext->hdr_size; } + /* get the record size. if there are any existing record updates, + they're using the registered size, not the map's existing + record_size. */ + if (array_is_created(&t->ext_resizes)) + resizes = array_get(&t->ext_resizes, &resizes_count); + else { + resizes = NULL; + resizes_count = 0; + } + if (ext_id < resizes_count && resizes[ext_id].name_size != 0) { + /* already resized once. use the resized value. */ + old_record_size = resizes[ext_id].record_size; + } else { + /* use the registered values. */ + record_size = rext->record_size; + } + if (record_size != old_record_size) { /* if record_size grows, we'll just resize the existing ext_rec_updates array. it's not possible to shrink