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.

(issue ASTERISK-17889)
Reported by: Chris Maciejewski


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@362586 65c4cc65-6c06-0410-ace0-fbb531ad65f3
certified/1.8.15
Sean Bright 14 years ago
parent 07a9b1744d
commit c2447e0cc8

@ -682,13 +682,14 @@ static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u,
if (f->frametype == AST_FRAME_DTMF) { if (f->frametype == AST_FRAME_DTMF) {
send_eivr_event(eivr_events, f->subclass.integer, NULL, chan); send_eivr_event(eivr_events, f->subclass.integer, NULL, chan);
if (u->option_autoclear) { if (u->option_autoclear) {
AST_LIST_LOCK(&u->playlist);
if (!u->abort_current_sound && !u->playing_silence) { if (!u->abort_current_sound && !u->playing_silence) {
/* send interrupted file as T data */ /* send interrupted file as T data */
entry = AST_LIST_REMOVE_HEAD(&u->playlist, list); if ((entry = AST_LIST_REMOVE_HEAD(&u->playlist, list))) {
send_eivr_event(eivr_events, 'T', entry->filename, chan); send_eivr_event(eivr_events, 'T', entry->filename, chan);
ast_free(entry); ast_free(entry);
}
} }
AST_LIST_LOCK(&u->playlist);
while ((entry = AST_LIST_REMOVE_HEAD(&u->playlist, list))) { while ((entry = AST_LIST_REMOVE_HEAD(&u->playlist, list))) {
send_eivr_event(eivr_events, 'D', entry->filename, chan); send_eivr_event(eivr_events, 'D', entry->filename, chan);
ast_free(entry); ast_free(entry);
@ -767,9 +768,10 @@ static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u,
AST_LIST_LOCK(&u->playlist); AST_LIST_LOCK(&u->playlist);
if (!u->abort_current_sound && !u->playing_silence) { if (!u->abort_current_sound && !u->playing_silence) {
/* send interrupted file as T data */ /* send interrupted file as T data */
entry = AST_LIST_REMOVE_HEAD(&u->playlist, list); if ((entry = AST_LIST_REMOVE_HEAD(&u->playlist, list))) {
send_eivr_event(eivr_events, 'T', entry->filename, chan); send_eivr_event(eivr_events, 'T', entry->filename, chan);
ast_free(entry); ast_free(entry);
}
} }
while ((entry = AST_LIST_REMOVE_HEAD(&u->playlist, list))) { while ((entry = AST_LIST_REMOVE_HEAD(&u->playlist, list))) {
send_eivr_event(eivr_events, 'D', entry->filename, chan); send_eivr_event(eivr_events, 'D', entry->filename, chan);

Loading…
Cancel
Save