From 3045568e47d1e8bf22723fc2e7b7f58b5fd49ba8 Mon Sep 17 00:00:00 2001
From: Jonathan Rose <jrose@digium.com>
Date: Thu, 21 Aug 2014 21:00:31 +0000
Subject: [PATCH] res_musiconhold: Fix reference leaks caused when reloading
 with REF_DEBUG set

Due to a faulty function for debugging reference decrementing, it was possible
to reduce the refcount on the wrong object if two moh classes of the same name
were in the moh class container.

(closes issue ASTERISK-22252)
Reported by: Walter Doekes
Patches:
    18_moh_debug_ref_patch.diff Uploaded by Jonathan Rose (license 6182)
........

Merged revisions 398937 from http://svn.asterisk.org/svn/asterisk/branches/1.8


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@421777 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 res/res_musiconhold.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/res/res_musiconhold.c b/res/res_musiconhold.c
index 3a22ec19d4..7daf4db15e 100644
--- a/res/res_musiconhold.c
+++ b/res/res_musiconhold.c
@@ -234,8 +234,9 @@ static int reload(void);
 #define mohclass_unref(class,string) _mohclass_unref(class, string, __FILE__,__LINE__,__PRETTY_FUNCTION__)
 static struct mohclass *_mohclass_unref(struct mohclass *class, const char *tag, const char *file, int line, const char *funcname)
 {
-	struct mohclass *dup;
-	if ((dup = ao2_find(mohclasses, class, OBJ_POINTER))) {
+	struct mohclass *dup = ao2_callback(mohclasses, OBJ_POINTER, ao2_match_by_addr, class);
+
+	if (dup) {
 		if (__ao2_ref_debug(dup, -1, (char *) tag, (char *) file, line, funcname) == 2) {
 			FILE *ref = fopen("/tmp/refs", "a");
 			if (ref) {
@@ -248,7 +249,7 @@ static struct mohclass *_mohclass_unref(struct mohclass *class, const char *tag,
 			ao2_ref(class, -1);
 		}
 	} else {
-		ao2_t_ref(class, -1, (char *) tag);
+		__ao2_ref_debug(class, -1, (char *) tag, (char *) file, line, funcname);
 	}
 	return NULL;
 }
-- 
GitLab