From 8fded490ce76b00d0fa76cf481c4d963b5dd21a0 Mon Sep 17 00:00:00 2001 From: Mark Michelson Date: Mon, 31 Dec 2007 23:43:13 +0000 Subject: [PATCH] Avoiding a potentially bad locking situation. ast_merge_contexts_and_delete writelocks the conlock, then calls ast_hint_extension, which attempts to readlock the same lock. Recursion with read-write locks is dangerous, so the inner lock needs to be removed. I did this by copying the "guts" of ast_hint_extension into ast_merge_contexts_and_delete (sans the extra lock). (this change is inspired by the locking problems seen in issue #11080, but I have no idea if this is the problematic area experienced by the reporters of that issue) git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@95577 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- main/pbx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/main/pbx.c b/main/pbx.c index 145c1be0b4..915a6206fe 100644 --- a/main/pbx.c +++ b/main/pbx.c @@ -3994,7 +3994,8 @@ void ast_merge_contexts_and_delete(struct ast_context **extcontexts, const char cannot be restored */ while ((this = AST_LIST_REMOVE_HEAD(&store, list))) { - exten = ast_hint_extension(NULL, this->context, this->exten); + struct pbx_find_info q = { .stacklen = 0 }; + exten = pbx_find_extension(NULL, NULL, &q, this->context, this->exten, PRIORITY_HINT, NULL, "", E_MATCH); /* Find the hint in the list of hints */ AST_LIST_TRAVERSE(&hints, hint, list) { if (hint->exten == exten)