summaryrefslogtreecommitdiff
path: root/res/res_stasis_recording.c
diff options
context:
space:
mode:
authorJonathan Rose <jrose@digium.com>2014-08-22 16:52:51 +0000
committerJonathan Rose <jrose@digium.com>2014-08-22 16:52:51 +0000
commit33835e17a08641f3b54a9293a13a08ca30b43fd6 (patch)
tree484add3c1ec136e31d2fb1e0f2afcda4b005efe3 /res/res_stasis_recording.c
parent1498ae0830d946a9b8185131d510b1b864fd3d11 (diff)
ARI: Fix a crash caused by hanging during playback to a channel in a bridge
ASTERISK-24147 #close Reported by: Edvin Vidmar Review: https://reviewboard.asterisk.org/r/3908/ ........ Merged revisions 421879 from http://svn.asterisk.org/svn/asterisk/branches/12 ........ Merged revisions 421880 from http://svn.asterisk.org/svn/asterisk/branches/13 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@421881 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'res/res_stasis_recording.c')
-rw-r--r--res/res_stasis_recording.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/res/res_stasis_recording.c b/res/res_stasis_recording.c
index d9e9599cd..433adb3d5 100644
--- a/res/res_stasis_recording.c
+++ b/res/res_stasis_recording.c
@@ -279,21 +279,22 @@ static void recording_fail(struct stasis_app_control *control,
recording, STASIS_APP_RECORDING_STATE_FAILED, cause);
}
-static void recording_cleanup(struct stasis_app_recording *recording)
+static void recording_cleanup(void *data)
{
+ struct stasis_app_recording *recording = data;
+
ao2_unlink_flags(recordings, recording,
OBJ_POINTER | OBJ_UNLINK | OBJ_NODATA);
+ ao2_ref(recording, -1);
}
static int record_file(struct stasis_app_control *control,
struct ast_channel *chan, void *data)
{
- RAII_VAR(struct stasis_app_recording *, recording,
- NULL, recording_cleanup);
+ struct stasis_app_recording *recording = data;
char *acceptdtmf;
int res;
- recording = data;
ast_assert(recording != NULL);
if (stasis_app_get_bridge(control)) {
@@ -364,7 +365,7 @@ struct stasis_app_recording *stasis_app_control_record(
struct stasis_app_control *control,
struct stasis_app_recording_options *options)
{
- RAII_VAR(struct stasis_app_recording *, recording, NULL, ao2_cleanup);
+ struct stasis_app_recording *recording;
char *last_slash;
errno = 0;
@@ -395,6 +396,7 @@ struct stasis_app_recording *stasis_app_control_record(
if (recording->absolute_name == NULL) {
errno = ENOMEM;
+ ao2_ref(recording, -1);
return NULL;
}
@@ -403,6 +405,7 @@ struct stasis_app_recording *stasis_app_control_record(
if (ast_safe_mkdir(ast_config_AST_RECORDING_DIR,
recording->absolute_name, 0777) != 0) {
/* errno set by ast_mkdir */
+ ao2_ref(recording, -1);
return NULL;
}
*last_slash = '/';
@@ -418,6 +421,7 @@ struct stasis_app_recording *stasis_app_control_record(
ast_log(LOG_WARNING, "Recording file '%s' already exists and ifExists option is failure.\n",
recording->absolute_name);
errno = EEXIST;
+ ao2_ref(recording, -1);
return NULL;
}
@@ -434,6 +438,7 @@ struct stasis_app_recording *stasis_app_control_record(
"Recording %s already in progress\n",
recording->options->name);
errno = EEXIST;
+ ao2_ref(recording, -1);
return NULL;
}
ao2_link(recordings, recording);
@@ -441,11 +446,8 @@ struct stasis_app_recording *stasis_app_control_record(
stasis_app_control_register_add_rule(control, &rule_recording);
- /* A ref is kept in the recordings container; no need to bump */
- stasis_app_send_command_async(control, record_file, recording);
+ stasis_app_send_command_async(control, record_file, ao2_bump(recording), recording_cleanup);
- /* Although this should be bumped for the caller */
- ao2_ref(recording, +1);
return recording;
}