[svn-commits] seanbright: branch 1.8 r362586 - /branches/1.8/apps/app_externalivr.c

SVN commits to the Digium repositories svn-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 svn-commits mailing list