]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_musiconhold: Fix reference leaks caused when reloading with REF_DEBUG set
authorJonathan Rose <jrose@digium.com>
Thu, 21 Aug 2014 21:15:40 +0000 (21:15 +0000)
committerJonathan Rose <jrose@digium.com>
Thu, 21 Aug 2014 21:15:40 +0000 (21:15 +0000)
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
........

Merged revisions 421777 from http://svn.asterisk.org/svn/asterisk/branches/11

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/12@421779 65c4cc65-6c06-0410-ace0-fbb531ad65f3

res/res_musiconhold.c

index 290052592f57645cd8bb364d7d0fc1f0967139ac..82c594874e0544351010b7e58e6d26750a537f2d 100644 (file)
@@ -242,8 +242,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) {
@@ -256,7 +257,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;
 }