# HG changeset patch
# User Darren Salt <linux@youmustbejoking.demon.co.uk>
# Date 1218056947 -3600
# Node ID 4519eeeda3b3a20489b3699693d801c3696221da
# Parent  917c6f1b8404a7528ffd251f821f430b19bf47d8
Fix crashes with fuzzed Windows Media files.

diff --git a/ChangeLog b/ChangeLog
--- a/ChangeLog
+++ b/ChangeLog
@@ -10,6 +10,7 @@ xine-lib (1.1.15) 2008-??-??
     - Delay preallocating video frames until we know how large they'll be
     - Only try and set the tuner if we're going to use it. Setting the tuner
       when using baseband video (CVBS, S-Video) breaks the input.
+  * Fix crashes with fuzzed Windows Media files.
 
 xine-lib (1.1.14) 2008-06-29
   * DVB changes:
diff --git a/src/demuxers/demux_asf.c b/src/demuxers/demux_asf.c
--- a/src/demuxers/demux_asf.c
+++ b/src/demuxers/demux_asf.c
@@ -70,6 +70,7 @@
 #define ASF_MODE_HTTP_REF          2
 #define ASF_MODE_ASF_REF           3
 #define ASF_MODE_ENCRYPTED_CONTENT 4
+#define ASF_MODE_NO_CONTENT        5
 
 typedef struct {
   int                 seq;
@@ -442,6 +443,14 @@ static int asf_read_header (demux_asf_t 
   for (i = 0; i < this->asf_header->stream_count; i++) {
     asf_stream_t *asf_stream = this->asf_header->streams[i];
     asf_demux_stream_t *demux_stream = &this->streams[i];
+
+    if (!asf_stream && this->mode != ASF_MODE_NO_CONTENT) {
+	xine_log(this->stream->xine, XINE_LOG_MSG,
+		 _("demux_asf: warning: The stream id=%d appears to be missing.\n"), asf_stream->stream_number);
+	_x_message(this->stream, XINE_MSG_READ_ERROR,
+		   _("Media stream missing?"), NULL);
+	this->mode = ASF_MODE_NO_CONTENT;
+      }
 
     if (asf_stream->encrypted_flag) {
       if (this->mode != ASF_MODE_ENCRYPTED_CONTENT) {
@@ -1679,6 +1688,7 @@ static int demux_asf_send_chunk (demux_p
       return demux_asf_parse_asf_references(this);
 
     case ASF_MODE_ENCRYPTED_CONTENT:
+    case ASF_MODE_NO_CONTENT:
       this->status = DEMUX_FINISHED;
       return this->status;
 
