intro is corrupted */
ctx->cur_ext_map_idx = (uint32_t)-2;
ctx->cur_ext_ignore = TRUE;
+ ctx->cur_ext_record_size = 0;
if (u->ext_id != (uint32_t)-1 &&
(!array_is_created(&map->extensions) ||
return -1;
}
+ ctx->cur_ext_record_size = u->record_size;
if (ext != NULL) {
/* exists already */
if (u->reset_id == ext->reset_id) {
return 1;
ext = array_idx(&view->map->extensions, ctx->cur_ext_map_idx);
- i_assert(ext->record_offset + ext->record_size <=
+ i_assert(ext->record_offset + ctx->cur_ext_record_size <=
view->map->hdr.record_size);
rec = MAIL_INDEX_REC_AT_SEQ(view->map, seq);
}
/* @UNSAFE */
- memcpy(old_data, u + 1, ext->record_size);
+ memcpy(old_data, u + 1, ctx->cur_ext_record_size);
+ if (ctx->cur_ext_record_size < ext->record_size) {
+ memset(PTR_OFFSET(old_data, ctx->cur_ext_record_size), 0,
+ ext->record_size - ctx->cur_ext_record_size);
+ }
return 1;
}
return 1;
ext = array_idx(&view->map->extensions, ctx->cur_ext_map_idx);
- i_assert(ext->record_offset + ext->record_size <=
+ i_assert(ext->record_offset + ctx->cur_ext_record_size <=
view->map->hdr.record_size);
rec = MAIL_INDEX_REC_AT_SEQ(view->map, seq);
min_value = u->diff >= 0 ? 0 : (uint64_t)(-(int64_t)u->diff);
- max_value = ext->record_size == 8 ? (uint64_t)-1 :
- ((uint64_t)1 << (ext->record_size*8)) - 1;
+ max_value = ctx->cur_ext_record_size == 8 ? (uint64_t)-1 :
+ ((uint64_t)1 << (ctx->cur_ext_record_size*8)) - 1;
if (u->diff <= 0) {
/* skip */
} else if (max_value >= (uint32_t)u->diff) {
return -1;
}
- switch (ext->record_size) {
+ switch (ctx->cur_ext_record_size) {
case 1: {
uint8_t *num = data;
default:
mail_index_sync_set_corrupted(ctx,
"Extension record inc with invalid size=%u",
- ext->record_size);
+ ctx->cur_ext_record_size);
return -1;
}
if (orig_num < min_value) {
}
case MAIL_TRANSACTION_EXT_REC_UPDATE: {
const struct mail_transaction_ext_rec_update *rec;
- const struct mail_index_ext *ext;
unsigned int i, record_size;
if (ctx->cur_ext_map_idx == (uint32_t)-1) {
break;
}
- ext = array_idx(&ctx->view->map->extensions,
- ctx->cur_ext_map_idx);
/* the record is padded to 32bits in the transaction log */
- record_size = (sizeof(*rec) + ext->record_size + 3) & ~3;
+ record_size = (sizeof(*rec) + ctx->cur_ext_record_size + 3) & ~3;
for (i = 0; i < hdr->size; i += record_size) {
rec = CONST_PTR_OFFSET(data, i);
/* generate a new intro structure */
intro = buffer_append_space_unsafe(buf, sizeof(*intro));
intro->ext_id = idx;
+ intro->record_size = rext->record_size;
+ intro->record_align = rext->record_align;
if (idx == (uint32_t)-1) {
intro->hdr_size = rext->hdr_size;
- intro->record_size = rext->record_size;
- intro->record_align = rext->record_align;
intro->name_size = strlen(rext->name);
} else {
ext = array_idx(&t->view->index->map->extensions, idx);
intro->hdr_size = ext->hdr_size;
- intro->record_size = ext->record_size;
- intro->record_align = ext->record_align;
intro->name_size = 0;
}
intro->flags = MAIL_TRANSACTION_EXT_INTRO_FLAG_NO_SHRINK;