From 9189752c51d38f5adf73572be43f1fb8ecc78860 Mon Sep 17 00:00:00 2001
From: David Vossel <dvossel@digium.com>
Date: Thu, 21 Oct 2010 16:46:15 +0000
Subject: [PATCH] Merged revisions 292595 via svnmerge from
 https://origsvn.digium.com/svn/asterisk/branches/1.8

........
  r292595 | dvossel | 2010-10-21 11:14:33 -0500 (Thu, 21 Oct 2010) | 14 lines

  Fixes recursive lock problem in manager.c

  It is possible for a AMI session to freeze because of invalid
  use of recursive locks during the EVENT processing.  This
  patch removes the unnecessary locks.

  (closes issue #18167)
  Reported by: sustav
  Patches:
        manager_locking_v1.diff uploaded by dvossel (license 671)
  Tested by: sustav
........


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@292597 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 main/manager.c | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/main/manager.c b/main/manager.c
index 8f1403c7e1..4f8a151b12 100644
--- a/main/manager.c
+++ b/main/manager.c
@@ -2828,7 +2828,6 @@ static int action_waitevent(struct mansession *s, const struct message *m)
 	if (s->session->waiting_thread == pthread_self()) {
 		struct eventqent *eqe = s->session->last_ev;
 		astman_send_response(s, m, "Success", "Waiting for Event completed.");
-		AST_RWLIST_RDLOCK(&all_events);
 		while ((eqe = advance_event(eqe))) {
 			if (((s->session->readperm & eqe->category) == eqe->category) &&
 			    ((s->session->send_events & eqe->category) == eqe->category)) {
@@ -2836,7 +2835,6 @@ static int action_waitevent(struct mansession *s, const struct message *m)
 			}
 			s->session->last_ev = eqe;
 		}
-		AST_RWLIST_UNLOCK(&all_events);
 		astman_append(s,
 			"Event: WaitEventComplete\r\n"
 			"%s"
@@ -4101,7 +4099,7 @@ static int process_events(struct mansession *s)
 	ao2_lock(s->session);
 	if (s->session->f != NULL) {
 		struct eventqent *eqe = s->session->last_ev;
-		AST_RWLIST_RDLOCK(&all_events);
+
 		while ((eqe = advance_event(eqe))) {
 			if (!ret && s->session->authenticated &&
 			    (s->session->readperm & eqe->category) == eqe->category &&
@@ -4113,7 +4111,6 @@ static int process_events(struct mansession *s)
 			}
 			s->session->last_ev = eqe;
 		}
-		AST_RWLIST_UNLOCK(&all_events);
 	}
 	ao2_unlock(s->session);
 	return ret;
-- 
GitLab