[asterisk-commits] seanbright: branch 1.8 r362586 - /branches/1.8/apps/app_externalivr.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Thu Apr 19 10:54:00 CDT 2012
Author: seanbright
Date: Thu Apr 19 10:53:56 2012
New Revision: 362586
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=362586
Log:
Prevent a crash in ExternalIVR when the 'S' command is sent first.
If the first command sent from an ExternalIVR client is an 'S' command, we were
blindly removing the first element from the play list and deferencing it, even
if it was NULL. This corrects that and also locks appropriately in one place.
Modified:
branches/1.8/apps/app_externalivr.c
Modified: branches/1.8/apps/app_externalivr.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/apps/app_externalivr.c?view=diff&rev=362586&r1=362585&r2=362586
==============================================================================
--- branches/1.8/apps/app_externalivr.c (original)
+++ branches/1.8/apps/app_externalivr.c Thu Apr 19 10:53:56 2012
@@ -682,13 +682,14 @@
if (f->frametype == AST_FRAME_DTMF) {
send_eivr_event(eivr_events, f->subclass.integer, NULL, chan);
if (u->option_autoclear) {
+ AST_LIST_LOCK(&u->playlist);
if (!u->abort_current_sound && !u->playing_silence) {
/* send interrupted file as T data */
- entry = AST_LIST_REMOVE_HEAD(&u->playlist, list);
- send_eivr_event(eivr_events, 'T', entry->filename, chan);
- ast_free(entry);
+ if ((entry = AST_LIST_REMOVE_HEAD(&u->playlist, list))) {
+ send_eivr_event(eivr_events, 'T', entry->filename, chan);
+ ast_free(entry);
+ }
}
- AST_LIST_LOCK(&u->playlist);
while ((entry = AST_LIST_REMOVE_HEAD(&u->playlist, list))) {
send_eivr_event(eivr_events, 'D', entry->filename, chan);
ast_free(entry);
@@ -767,9 +768,10 @@
AST_LIST_LOCK(&u->playlist);
if (!u->abort_current_sound && !u->playing_silence) {
/* send interrupted file as T data */
- entry = AST_LIST_REMOVE_HEAD(&u->playlist, list);
- send_eivr_event(eivr_events, 'T', entry->filename, chan);
- ast_free(entry);
+ if ((entry = AST_LIST_REMOVE_HEAD(&u->playlist, list))) {
+ send_eivr_event(eivr_events, 'T', entry->filename, chan);
+ ast_free(entry);
+ }
}
while ((entry = AST_LIST_REMOVE_HEAD(&u->playlist, list))) {
send_eivr_event(eivr_events, 'D', entry->filename, chan);
More information about the asterisk-commits
mailing list