[svn-commits] russell: branch 1.4 r201600 - /branches/1.4/res/res_musiconhold.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Jun 18 10:24:51 CDT 2009


Author: russell
Date: Thu Jun 18 10:24:31 2009
New Revision: 201600

URL: http://svn.asterisk.org/svn-view/asterisk?view=rev&rev=201600
Log:
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)

Modified:
    branches/1.4/res/res_musiconhold.c

Modified: branches/1.4/res/res_musiconhold.c
URL: http://svn.asterisk.org/svn-view/asterisk/branches/1.4/res/res_musiconhold.c?view=diff&rev=201600&r1=201599&r2=201600
==============================================================================
--- branches/1.4/res/res_musiconhold.c (original)
+++ branches/1.4/res/res_musiconhold.c Thu Jun 18 10:24:31 2009
@@ -1103,9 +1103,10 @@
 	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;
 	}
 




More information about the svn-commits mailing list