From 16e4d1f36fa6b0a567b0671d7225c1d9473a4c7e Mon Sep 17 00:00:00 2001 From: Sean Bright Date: Mon, 8 Mar 2021 18:16:14 -0500 Subject: [PATCH] res_musiconhold.c: Plug ref leak caused by ao2_replace() misuse. 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 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/res/res_musiconhold.c b/res/res_musiconhold.c index 736ddc68ab..9811ea7f3a 100644 --- a/res/res_musiconhold.c +++ b/res/res_musiconhold.c @@ -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);