Mercurial > dovecot > core-2.2
changeset 21413:91187182279c
lib-dict: Add assert to make sure all iterators are deinitialized.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Mon, 16 Jan 2017 17:12:41 +0200 |
parents | 7ff9bc554381 |
children | 355ebf12f384 |
files | src/lib-dict/dict-private.h src/lib-dict/dict.c |
diffstat | 2 files changed, 11 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-dict/dict-private.h Mon Jan 16 16:57:21 2017 +0200 +++ b/src/lib-dict/dict-private.h Mon Jan 16 17:12:41 2017 +0200 @@ -48,6 +48,7 @@ const char *name; struct dict_vfuncs v; + unsigned int iter_count; }; struct dict_iterate_context {
--- a/src/lib-dict/dict.c Mon Jan 16 16:57:21 2017 +0200 +++ b/src/lib-dict/dict.c Mon Jan 16 17:12:41 2017 +0200 @@ -161,17 +161,22 @@ dict_iterate_init_multiple(struct dict *dict, const char *const *paths, enum dict_iterate_flags flags) { + struct dict_iterate_context *ctx; unsigned int i; i_assert(paths[0] != NULL); for (i = 0; paths[i] != NULL; i++) i_assert(dict_key_prefix_is_valid(paths[i])); + if (dict->v.iterate_init == NULL) { /* not supported by backend */ i_error("%s: dict iteration not supported", dict->name); - return &dict_iter_unsupported; + ctx = &dict_iter_unsupported; + } else { + ctx = dict->v.iterate_init(dict, paths, flags); } - return dict->v.iterate_init(dict, paths, flags); + dict->iter_count++; + return ctx; } bool dict_iterate(struct dict_iterate_context *ctx, @@ -213,6 +218,9 @@ { struct dict_iterate_context *ctx = *_ctx; + i_assert(ctx->dict->iter_count > 0); + ctx->dict->iter_count--; + *_ctx = NULL; return ctx == &dict_iter_unsupported ? -1 : ctx->dict->v.iterate_deinit(ctx);