From: Timo Sirainen Date: Fri, 3 Jun 2016 16:17:03 +0000 (+0300) Subject: maildir: Avoid extra memory usage on duplicate uidlist entries X-Git-Tag: 2.2.25.rc1~193 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ec2ee6f35cb0734fc0aca3a906fb491d2b3b1ed3;p=thirdparty%2Fdovecot%2Fcore.git maildir: Avoid extra memory usage on duplicate uidlist entries Also fixes assert-crashing in hash_table_insert() when it happens. --- diff --git a/src/lib-storage/index/maildir/maildir-uidlist.c b/src/lib-storage/index/maildir/maildir-uidlist.c index b0208f2672..6208ed29cb 100644 --- a/src/lib-storage/index/maildir/maildir-uidlist.c +++ b/src/lib-storage/index/maildir/maildir-uidlist.c @@ -1701,8 +1701,11 @@ maildir_uidlist_sync_next_partial(struct maildir_uidlist_sync_ctx *ctx, rec = p_new(uidlist->record_pool, struct maildir_uidlist_rec, 1); rec->uid = (uint32_t)-1; + rec->filename = p_strdup(uidlist->record_pool, filename); array_append(&uidlist->records, &rec, 1); uidlist->change_counter++; + + hash_table_insert(uidlist->files, rec->filename, rec); } if (uid != 0) { if (rec->uid != uid && rec->uid != (uint32_t)-1) { @@ -1724,8 +1727,6 @@ maildir_uidlist_sync_next_partial(struct maildir_uidlist_sync_ctx *ctx, rec->flags &= ~MAILDIR_UIDLIST_REC_FLAG_NEW_DIR; rec->flags = (rec->flags | flags) & ~MAILDIR_UIDLIST_REC_FLAG_NONSYNCED; - rec->filename = p_strdup(uidlist->record_pool, filename); - hash_table_insert(uidlist->files, rec->filename, rec); ctx->finished = FALSE; *rec_r = rec; @@ -1816,6 +1817,8 @@ int maildir_uidlist_sync_next_uid(struct maildir_uidlist_sync_ctx *ctx, /* didn't exist in uidlist, it's recent */ flags |= MAILDIR_UIDLIST_REC_FLAG_RECENT; } + rec->filename = p_strdup(ctx->record_pool, filename); + hash_table_insert(ctx->files, rec->filename, rec); array_append(&ctx->records, &rec, 1); } @@ -1826,8 +1829,6 @@ int maildir_uidlist_sync_next_uid(struct maildir_uidlist_sync_ctx *ctx, } rec->flags = (rec->flags | flags) & ~MAILDIR_UIDLIST_REC_FLAG_NONSYNCED; - rec->filename = p_strdup(ctx->record_pool, filename); - hash_table_insert(ctx->files, rec->filename, rec); *rec_r = rec; return 1; }