]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-dict: Add assert to make sure all iterators are deinitialized.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 16 Jan 2017 15:12:41 +0000 (17:12 +0200)
committerGitLab <gitlab@git.dovecot.net>
Tue, 17 Jan 2017 11:29:44 +0000 (13:29 +0200)
src/lib-dict/dict-private.h
src/lib-dict/dict.c

index ff2bd9055e21283f500531c6f74b9e2b706d9a4e..1575e887ac1c5b5f4fbc90d0808d97b17a963be7 100644 (file)
@@ -49,6 +49,7 @@ struct dict {
        const char *name;
 
        struct dict_vfuncs v;
+       unsigned int iter_count;
 };
 
 struct dict_iterate_context {
index bfefc0f1772551cbc8ddf141a43ba7001ef97be2..5af911c3366257411786a2a3a7fd24318fb6c9f3 100644 (file)
@@ -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";