From: Timo Sirainen Date: Mon, 16 Jan 2017 15:12:41 +0000 (+0200) Subject: lib-dict: Add assert to make sure all iterators are deinitialized. X-Git-Tag: 2.3.0.rc1~2300 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b198cd6da331eb55d300b0e83f59695c58d5885c;p=thirdparty%2Fdovecot%2Fcore.git lib-dict: Add assert to make sure all iterators are deinitialized. --- diff --git a/src/lib-dict/dict-private.h b/src/lib-dict/dict-private.h index ff2bd9055e..1575e887ac 100644 --- a/src/lib-dict/dict-private.h +++ b/src/lib-dict/dict-private.h @@ -49,6 +49,7 @@ struct dict { const char *name; struct dict_vfuncs v; + unsigned int iter_count; }; struct dict_iterate_context { diff --git a/src/lib-dict/dict.c b/src/lib-dict/dict.c index bfefc0f177..5af911c336 100644 --- a/src/lib-dict/dict.c +++ b/src/lib-dict/dict.c @@ -154,16 +154,21 @@ struct dict_iterate_context * 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 */ - 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, @@ -206,6 +211,9 @@ int dict_iterate_deinit(struct dict_iterate_context **_ctx, { struct dict_iterate_context *ctx = *_ctx; + i_assert(ctx->dict->iter_count > 0); + ctx->dict->iter_count--; + *_ctx = NULL; if (ctx == &dict_iter_unsupported) { *error_r = "Dict doesn't support iteration";