]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_musiconhold.c: Plug ref leak caused by ao2_replace() misuse.
authorSean Bright <sean.bright@gmail.com>
Mon, 8 Mar 2021 23:16:14 +0000 (18:16 -0500)
committerSean Bright <sean.bright@gmail.com>
Mon, 8 Mar 2021 23:21:39 +0000 (17:21 -0600)
ao2_replace() bumps the reference count of the object that is doing the
replacing, which is not what we want. We just want to drop the old ref
on the old object and update the pointer to point to the new object.

Pointed out by George Joseph in #asterisk-dev

Change-Id: Ie8167ed3d4b52b9d1ea2d785f885e8c27206743d

res/res_musiconhold.c

index 736ddc68ab7fd0b4f721ad8161487727246d2b31..9811ea7f3a72b451770e70350e51a2a0f94dddac 100644 (file)
@@ -1209,7 +1209,8 @@ static void moh_parse_options(struct ast_variable *var, struct mohclass *mohclas
 
                /* We don't need to lock here because we are the thread that
                 * created this mohclass and we haven't published it yet */
-               ao2_replace(mohclass->files, playlist_entries);
+               ao2_ref(mohclass->files, -1);
+               mohclass->files = playlist_entries;
        }
 }
 
@@ -1306,7 +1307,8 @@ static int moh_scan_files(struct mohclass *class) {
        AST_VECTOR_COMPACT(files);
 
        ao2_lock(class);
-       ao2_replace(class->files, files);
+       ao2_ref(class->files, -1);
+       class->files = files;
        ao2_unlock(class);
 
        return AST_VECTOR_SIZE(files);