[asterisk-commits] jrose: branch 11 r391794 - in /branches/11: ./ apps/app_mixmonitor.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Fri Jun 14 11:21:46 CDT 2013
Author: jrose
Date: Fri Jun 14 11:21:41 2013
New Revision: 391794
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=391794
Log:
app_mixmonitor: Fix crashes caused by unloading app_mixmonitor
Unloading app_mixmonitor while active mixmonitors were running would
cause a segfault. This patch fixes that by making it impossible to
unload app_mixmonitor while mixmonitors are active.
Review: https://reviewboard.asterisk.org/r/2624/
........
Merged revisions 391778 from http://svn.asterisk.org/svn/asterisk/branches/1.8
Modified:
branches/11/ (props changed)
branches/11/apps/app_mixmonitor.c
Propchange: branches/11/
------------------------------------------------------------------------------
Binary property 'branch-1.8-merged' - no diff available.
Modified: branches/11/apps/app_mixmonitor.c
URL: http://svnview.digium.com/svn/asterisk/branches/11/apps/app_mixmonitor.c?view=diff&rev=391794&r1=391793&r2=391794
==============================================================================
--- branches/11/apps/app_mixmonitor.c (original)
+++ branches/11/apps/app_mixmonitor.c Fri Jun 14 11:21:41 2013
@@ -740,6 +740,8 @@
}
mixmonitor_free(mixmonitor);
+
+ ast_module_unref(ast_module_info->self);
return NULL;
}
@@ -779,7 +781,7 @@
return 0;
}
-static void launch_monitor_thread(struct ast_channel *chan, const char *filename,
+static int launch_monitor_thread(struct ast_channel *chan, const char *filename,
unsigned int flags, int readvol, int writevol,
const char *post_process, const char *filename_write,
char *filename_read, const char *uid_channel_var,
@@ -806,33 +808,33 @@
/* Pre-allocate mixmonitor structure and spy */
if (!(mixmonitor = ast_calloc(1, sizeof(*mixmonitor)))) {
- return;
+ return -1;
}
/* Now that the struct has been calloced, go ahead and initialize the string fields. */
if (ast_string_field_init(mixmonitor, 512)) {
mixmonitor_free(mixmonitor);
- return;
+ return -1;
}
/* Setup the actual spy before creating our thread */
if (ast_audiohook_init(&mixmonitor->audiohook, AST_AUDIOHOOK_TYPE_SPY, mixmonitor_spy_type, 0)) {
mixmonitor_free(mixmonitor);
- return;
+ return -1;
}
/* Copy over flags and channel name */
mixmonitor->flags = flags;
if (!(mixmonitor->autochan = ast_autochan_setup(chan))) {
mixmonitor_free(mixmonitor);
- return;
+ return -1;
}
if (setup_mixmonitor_ds(mixmonitor, chan, &datastore_id)) {
ast_autochan_destroy(mixmonitor->autochan);
mixmonitor_free(mixmonitor);
ast_free(datastore_id);
- return;
+ return -1;
}
if (!ast_strlen_zero(uid_channel_var)) {
@@ -901,13 +903,13 @@
mixmonitor_spy_type, ast_channel_name(chan));
ast_audiohook_destroy(&mixmonitor->audiohook);
mixmonitor_free(mixmonitor);
- return;
+ return -1;
}
/* reference be released at mixmonitor destruction */
mixmonitor->callid = ast_read_threadstorage_callid();
- ast_pthread_create_detached_background(&thread, NULL, mixmonitor_thread, mixmonitor);
+ return ast_pthread_create_detached_background(&thread, NULL, mixmonitor_thread, mixmonitor);
}
/* a note on filename_parse: creates directory structure and assigns absolute path from relative paths for filenames */
@@ -1028,7 +1030,10 @@
}
pbx_builtin_setvar_helper(chan, "MIXMONITOR_FILENAME", args.filename);
- launch_monitor_thread(chan,
+
+ /* If launch_monitor_thread works, the module reference must not be released until it is finished. */
+ ast_module_ref(ast_module_info->self);
+ if (launch_monitor_thread(chan,
args.filename,
flags.flags,
readvol,
@@ -1037,7 +1042,9 @@
filename_write,
filename_read,
uid_channel_var,
- recipients);
+ recipients)) {
+ ast_module_unref(ast_module_info->self);
+ }
return 0;
}
More information about the asterisk-commits
mailing list