Mercurial > dovecot > core-2.2
view src/lib-index/mail-cache-sync-update.c @ 22691:dca05b22217b
director: Fix crash when handling expired USER timestamps.
The fix in 154f91726624265fce15097eb4bbbf6e55f8c477 wasn't complete.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Tue, 28 Nov 2017 13:10:35 +0200 |
parents | 7d09937dc4ff |
children | cb108f786fb4 |
line wrap: on
line source
/* Copyright (c) 2004-2017 Dovecot authors, see the included COPYING file */ #include "lib.h" #include "mail-cache-private.h" #include "mail-index-sync-private.h" struct mail_cache_sync_context { unsigned expunge_count; }; void mail_cache_expunge_count(struct mail_cache *cache, unsigned int count) { if (mail_cache_lock(cache) > 0) { cache->hdr_copy.deleted_record_count += count; if (cache->hdr_copy.record_count >= count) cache->hdr_copy.record_count -= count; else cache->hdr_copy.record_count = 0; cache->hdr_modified = TRUE; (void)mail_cache_unlock(cache); } } static struct mail_cache_sync_context *mail_cache_handler_init(void **context) { struct mail_cache_sync_context *ctx; if (*context != NULL) ctx = *context; else { *context = i_new(struct mail_cache_sync_context, 1); ctx = *context; } return ctx; } static void mail_cache_handler_deinit(struct mail_index_sync_map_ctx *sync_ctx, struct mail_cache_sync_context *ctx) { struct mail_cache *cache = sync_ctx->view->index->cache; if (ctx == NULL) return; mail_cache_expunge_count(cache, ctx->expunge_count); i_free(ctx); } int mail_cache_expunge_handler(struct mail_index_sync_map_ctx *sync_ctx, uint32_t seq ATTR_UNUSED, const void *data, void **sync_context, void *context ATTR_UNUSED) { struct mail_cache_sync_context *ctx = *sync_context; const uint32_t *cache_offset = data; if (data == NULL) { mail_cache_handler_deinit(sync_ctx, ctx); *sync_context = NULL; return 0; } if (*cache_offset == 0) return 0; ctx = mail_cache_handler_init(sync_context); ctx->expunge_count++; return 0; }