From: Mark Michelson Date: Thu, 27 Mar 2014 14:20:10 +0000 (+0000) Subject: Give sorcery instances a reference to their wizards. X-Git-Tag: 12.2.0-rc1~17 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e8c1b4f2b0c93e5bdd06cf6addf8e6494aca27d8;p=thirdparty%2Fasterisk.git Give sorcery instances a reference to their wizards. On graceful shutdown, sorcery wizards are all killed off, but it is possible for sorcery instances to still have dangling pointers after this, possibly causing a crash. Giving the sorcery instances a reference to their wizards ensures that the wizard reference will remain valid for the lifetime of the sorcery instance. Review: https://reviewboard.asterisk.org/r/3401 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/12@411295 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/main/sorcery.c b/main/sorcery.c index 01ef6ffdbb..9488dee4b2 100644 --- a/main/sorcery.c +++ b/main/sorcery.c @@ -688,6 +688,8 @@ static void sorcery_object_wizard_destructor(void *obj) if (object_wizard->wizard) { ast_module_unref(object_wizard->wizard->module); } + + ao2_cleanup(object_wizard->wizard); } /*! \brief Internal function which creates an object type and adds a wizard mapping */ @@ -728,7 +730,7 @@ static enum ast_sorcery_apply_result sorcery_apply_wizard_mapping(struct ast_sor ast_module_ref(wizard->module); - object_wizard->wizard = wizard; + object_wizard->wizard = ao2_bump(wizard); object_wizard->caching = caching; ao2_link(object_type->wizards, object_wizard);