]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Prevent a crash in ExternalIVR when the 'S' command is sent first.
authorSean Bright <sean@malleable.com>
Thu, 19 Apr 2012 16:10:04 +0000 (16:10 +0000)
committerSean Bright <sean@malleable.com>
Thu, 19 Apr 2012 16:10:04 +0000 (16:10 +0000)
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
........

Merged revisions 362586 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........

Merged revisions 362587 from http://svn.asterisk.org/svn/asterisk/branches/10

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@362588 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_externalivr.c

index d9aaf67a95b2b7e20971ff094fd3bdaac05478c7..16411810297b28ce5513359c143fd2a89e8f1b14 100644 (file)
@@ -683,13 +683,14 @@ static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u,
                        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);
@@ -768,9 +769,10 @@ static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u,
                                        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);