File sec-010-notincludedyet.diff of Package xine-lib

diff -ur xine-lib-1.1.15-pre/src/demuxers/demux_matroska.c xine-lib-1.1.15-post/src/demuxers/demux_matroska.c
--- xine-lib-1.1.15-pre/src/demuxers/demux_matroska.c	2009-01-23 17:30:19.000000000 +0100
+++ xine-lib-1.1.15-post/src/demuxers/demux_matroska.c	2009-01-23 17:25:48.000000000 +0100
@@ -1320,7 +1320,8 @@
       _x_bmiheader_le2me(bih);
       
       /* add bih extra data */
-      memcpy(bih + 1, track->codec_private, track->codec_private_len);
+      if (track->codec_private_len > 0)
+        memcpy(bih + 1, track->codec_private, track->codec_private_len);
       free(track->codec_private);
       track->codec_private = (uint8_t *)bih;
       track->codec_private_len = bih->biSize;
@@ -1344,7 +1345,8 @@
       _x_bmiheader_le2me(bih);
       
       /* add bih extra data */
-      memcpy(bih + 1, track->codec_private, track->codec_private_len);
+      if (track->codec_private_len > 0)
+        memcpy(bih + 1, track->codec_private, track->codec_private_len);
       free(track->codec_private);
       track->codec_private = (uint8_t *)bih;
       track->codec_private_len = bih->biSize;
diff -ur xine-lib-1.1.15-pre/src/demuxers/demux_real.c xine-lib-1.1.15-post/src/demuxers/demux_real.c
--- xine-lib-1.1.15-pre/src/demuxers/demux_real.c	2009-01-23 17:30:19.000000000 +0100
+++ xine-lib-1.1.15-post/src/demuxers/demux_real.c	2009-01-23 17:25:48.000000000 +0100
@@ -785,7 +783,7 @@
        * header giving bits per sample, sample rate and number of channels.
        * The second is the codec initialisation data found at the end of
        * the type specific data for the audio stream */
-      if(buf->type == BUF_AUDIO_AAC) {
+      if(buf->type == BUF_AUDIO_AAC && mdpr->type_specific_len >= 79) {
         const uint16_t version = _X_BE_16(mdpr->type_specific_data + 4);
         
         if(version != 5) {
@@ -814,8 +812,9 @@
         buf->decoder_info_ptr[2] = buf->content;
         buf->size                = 0;
                         
-        memcpy(buf->content, mdpr->type_specific_data + 79,
-               buf->decoder_info[2]);
+	if (mdpr->type_specific_len >= 79 + buf->decoder_info[2])
+          memcpy(buf->content, mdpr->type_specific_data + 79,
+                 buf->decoder_info[2]);
 
       } else if(buf->type == BUF_AUDIO_MP3ADU) {
 	buf->decoder_flags |= BUF_FLAG_STDHEADER | BUF_FLAG_FRAME_END;
diff -ur xine-lib-1.1.15-pre/src/libmusepack/idtag.c xine-lib-1.1.15-post/src/libmusepack/idtag.c
--- xine-lib-1.1.15-pre/src/libmusepack/idtag.c	2008-04-17 18:48:58.000000000 +0200
+++ xine-lib-1.1.15-post/src/libmusepack/idtag.c	2009-01-23 17:25:53.000000000 +0100
@@ -53,7 +53,8 @@
         return 0;  
     }
     
-    r->read(r->data, tmp, sizeof(tmp));
+    if (r->read(r->data, tmp, sizeof(tmp)) != sizeof (tmp))
+	return 0;
 
     // check id3-tag
     if ( 0 != memcmp ( tmp, "ID3", 3) )
diff -ur xine-lib-1.1.15-pre/src/libmusepack/mpc_decoder.c xine-lib-1.1.15-post/src/libmusepack/mpc_decoder.c
--- xine-lib-1.1.15-pre/src/libmusepack/mpc_decoder.c	2008-04-17 18:48:58.000000000 +0200
+++ xine-lib-1.1.15-post/src/libmusepack/mpc_decoder.c	2009-01-23 17:25:53.000000000 +0100
@@ -69,7 +69,8 @@
 //------------------------------------------------------------------------------
 static mpc_int32_t f_read(mpc_decoder *d, void *ptr, size_t size) 
 { 
-    return d->r->read(d->r->data, ptr, size); 
+    off_t res = d->r->read(d->r->data, ptr, size); 
+    return res > 0 ? res : 0;
 };
 
 static mpc_bool_t f_seek(mpc_decoder *d, mpc_int32_t offset) 
diff -ur xine-lib-1.1.15-pre/src/xine-engine/demux.c xine-lib-1.1.15-post/src/xine-engine/demux.c
--- xine-lib-1.1.15-pre/src/xine-engine/demux.c	2008-06-15 01:15:00.000000000 +0200
+++ xine-lib-1.1.15-post/src/xine-engine/demux.c	2009-01-23 17:25:53.000000000 +0100
@@ -427,7 +427,7 @@
   int read_size;
   unsigned char *buf;
 
-  if (!input || !size || size > MAX_PREVIEW_SIZE)
+  if (!input || size <= 0 || size > MAX_PREVIEW_SIZE)
     return 0;
 
   if (input->get_capabilities(input) & INPUT_CAP_SEEKABLE) {
@@ -437,8 +437,10 @@
   } else if (input->get_capabilities(input) & INPUT_CAP_PREVIEW) {
     buf = malloc(MAX_PREVIEW_SIZE);
     read_size = input->get_optional_data(input, buf, INPUT_OPTIONAL_DATA_PREVIEW);
-    read_size = MIN (read_size, size);
-    memcpy(buffer, buf, read_size);
+    if (read_size > 0) {
+      read_size = MIN (read_size, size);
+      memcpy(buffer, buf, read_size);
+    }
     free(buf);
   } else {
     return 0;
diff -ur xine-lib-1.1.15-pre/src/xine-engine/input_cache.c xine-lib-1.1.15-post/src/xine-engine/input_cache.c
--- xine-lib-1.1.15-pre/src/xine-engine/input_cache.c	2008-06-15 01:15:00.000000000 +0200
+++ xine-lib-1.1.15-post/src/xine-engine/input_cache.c	2009-01-23 17:25:53.000000000 +0100
@@ -69,6 +69,9 @@
   lprintf("cache_plugin_read: len=%"PRId64"\n", len);
   this->read_call++;
 
+  if (len < 0)
+    return -1;
+
   /* optimized for common cases */
   if (len <= (this->buf_len - this->buf_pos)) {
     /* all bytes are in the buffer */
@@ -191,8 +194,15 @@
     if (buf) {
       buf->type = BUF_DEMUX_BLOCK;
    
-      assert(todo <= buf->max_size);
+      if (todo > buf->max_size) {
+	buf->free_buffer (buf);
+	return NULL;
+      }
       read_len = cache_plugin_read (this_gen, buf->content, todo);
+      if (read_len < 0) {
+	buf->free_buffer (buf);
+	return NULL;
+      }
       buf->size = read_len;
     }
   } else {
diff -ur xine-lib-1.1.15-pre/src/xine-engine/input_rip.c xine-lib-1.1.15-post/src/xine-engine/input_rip.c
--- xine-lib-1.1.15-pre/src/xine-engine/input_rip.c	2008-06-15 01:15:00.000000000 +0200
+++ xine-lib-1.1.15-post/src/xine-engine/input_rip.c	2009-01-23 17:25:53.000000000 +0100
@@ -141,7 +141,7 @@
   }
 
   /* really to read/catch */
-  if (nread_orig + nwrite) {
+  if (nread_orig + nwrite > 0) {
     lprintf(" => read %"PRId64" bytes from input plugin\n", nread_orig + nwrite);
 
     /* read from main input plugin */
@@ -239,8 +239,12 @@
   nread_orig = this->regular ? 0 : nread;
 
   /* create own block by RIP if needed */
-  if (npreview + nread_file) {
+  if (npreview + nread_file > 0) {
     buf = fifo->buffer_pool_alloc(fifo);
+    if (npreview + nread_file > buf->size) {
+      buf->free_buffer (buf);
+      return NULL;
+    }
     buf->content = buf->mem;
     buf->type = BUF_DEMUX_BLOCK;
 
@@ -263,7 +267,7 @@
   }
 
   /* really to read/catch */
-  if (nread_orig + nwrite) {
+  if (nread_orig + nwrite > 0) {
     /* read from main input plugin */
     if (buf) {
       lprintf(" => read %"PRId64" bytes from input plugin (block)\n", nread_orig + nwrite);
@@ -636,14 +640,21 @@
       blocksize = main_plugin->get_blocksize(main_plugin);
       buf = main_plugin->read_block(main_plugin, stream->video_fifo, blocksize);
 
-      this->preview_size = buf->size;
-      this->preview = malloc(this->preview_size);
-      memcpy(this->preview, buf->content, this->preview_size);
+      if (buf) {
+        this->preview_size = buf->size;
+        this->preview = malloc(this->preview_size);
+        memcpy(this->preview, buf->content, this->preview_size);
     
-      buf->free_buffer(buf);
+        buf->free_buffer(buf);
+      }
     } else {
       this->preview = malloc(MAX_PREVIEW_SIZE);
       this->preview_size = main_plugin->read(main_plugin, this->preview, MAX_PREVIEW_SIZE);
+      if (this->preview_size <= 0) {
+	free (this->preview);
+	this->preview = NULL;
+	this->preview_size = 0;
+      }
     }
   } else {
     this->preview = NULL;
openSUSE Build Service is sponsored by