From: Alan T. DeKok Date: Mon, 30 Jan 2023 20:27:34 +0000 (-0500) Subject: re-initialize the iterator for every module we delete X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a3644caa34cb797d37070554c32589e6543d0624;p=thirdparty%2Ffreeradius-server.git re-initialize the iterator for every module we delete because deleting one module may cause it to delete child modules in the tree, which confuses the iterator and makes it sad. --- diff --git a/src/lib/server/module.c b/src/lib/server/module.c index 85632c45b9d..0c16462bf70 100644 --- a/src/lib/server/module.c +++ b/src/lib/server/module.c @@ -1064,12 +1064,12 @@ static int _module_list_free(module_list_t *ml) module_instance_t *mi; /* - * We explicitly free modules so that - * they're done in a stable order. + * Re-initialize the iterator after freeing each module. + * The module may have children which are also in the + * tree. It can cause problems when we delete children + * without the iterator knowing about it. */ - for (mi = fr_rb_iter_init_inorder(&iter, ml->name_tree); - mi; - mi = fr_rb_iter_next_inorder(&iter)) { + while ((mi = fr_rb_iter_init_inorder(&iter, ml->name_tree)) != NULL) { fr_rb_iter_delete_inorder(&iter); /* Keeps the iterator sane */ talloc_free(mi); }