aboutsummaryrefslogtreecommitdiffstats
path: root/res
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2009-06-18 15:32:37 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2009-06-18 15:32:37 +0000
commitc6e74d7f36371d508de5ec7ebcd838913c75ce1c (patch)
treeb8c3746ec14e2a7fa564100bfc1631e0a6d2f392 /res
parentc59c08e2f4dd057ab9642c304d6de35166cd19b4 (diff)
Merged revisions 201610 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ................ r201610 | russell | 2009-06-18 10:27:10 -0500 (Thu, 18 Jun 2009) | 36 lines Merged revisions 201600 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r201600 | russell | 2009-06-18 10:24:31 -0500 (Thu, 18 Jun 2009) | 29 lines Fix memory corruption and leakage related reloads of non files mode MoH classes. For Music on Hold classes that are not files mode, meaning that we are executing an application that will feed us audio data, we use a thread to monitor the external application and read audio from it. This thread also makes use of the MoH class object. In the MoH class destructor, we used pthread_cancel() to ask the thread to exit. Unfortunately, the code did not wait to ensure that the thread actually went away. What needed to be done is a pthread_join() to ensure that the thread fully cleans up before we proceed. By adding this one line, we resolve two significant problems: 1) Since the thread was never joined, it never fully goes away. So, on every reload of non-files mode MoH, an unused thread was sticking around. 2) There was a race condition here where the application monitoring thread could still try to access the MoH class, even though the thread executing the MoH reload has already destroyed it. (issue #15109) Reported by: jvandal (issue #15123) Reported by: axisinternet (issue #15195) Reported by: amorsen (issue AST-208) ........ ................ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@201612 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'res')
-rw-r--r--res/res_musiconhold.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/res/res_musiconhold.c b/res/res_musiconhold.c
index 97553ec6f..5b332f6d0 100644
--- a/res/res_musiconhold.c
+++ b/res/res_musiconhold.c
@@ -1400,9 +1400,10 @@ static void moh_class_destructor(void *obj)
while ((member = AST_LIST_REMOVE_HEAD(&class->members, list))) {
free(member);
}
-
+
if (class->thread) {
pthread_cancel(class->thread);
+ pthread_join(class->thread, NULL);
class->thread = AST_PTHREADT_NULL;
}