--- MPlayer-1.0pre5/ChangeLog 2004-07-15 02:14:35.000000000 +0200
+++ MPlayer-1.0pre5try2/ChangeLog 2004-12-15 22:11:18.546149409 +0100
@@ -1,5 +1,13 @@
MPlayer (1.0)
+ pre5try2: December 15, 2004
+ Security:
+ * buffer overflow in mp3lib fixed
+ * heap overflow in Real rtsp streaming code fixed
+ * stack overflow in mmst streaming code fixed
+ * unnecessary bmp demuxer removed because of buffer overflows
+ * heap overflow in pnm streaming code fixed
+
pre5: "LinuxTag release" July 15, 2004
Name:
--- MPlayer-1.0pre5/libmpdemux/asf_mmst_streaming.c 2004-07-02 22:36:50.000000000 +0200
+++ MPlayer-1.0pre5try2/libmpdemux/asf_mmst_streaming.c 2004-12-15 21:32:03.000000000 +0100
@@ -42,6 +42,7 @@
#include "network.h"
#define BUF_SIZE 102400
+#define HDR_BUF_SIZE 8192
typedef struct
{
@@ -216,6 +217,11 @@
// printf ("asf header packet detected, len=%d\n", packet_len);
+ if (packet_len < 0 || packet_len > HDR_BUF_SIZE - header_len) {
+ mp_msg(MSGT_NETWORK, MSGL_FATAL, "Invalid header size, giving up\n");
+ return 0;
+ }
+
if (!get_data (s, &header[header_len], packet_len)) {
printf ("header data read failed\n");
return 0;
@@ -250,6 +256,12 @@
packet_len = get_32 ((unsigned char*)&packet_len, 0) + 4;
// printf ("command packet detected, len=%d\n", packet_len);
+
+ if (packet_len < 0 || packet_len > BUF_SIZE) {
+ mp_msg(MSGT_NETWORK, MSGL_FATAL,
+ "Invalid rtsp packet size, giving up\n");
+ return 0;
+ }
if (!get_data (s, data, packet_len)) {
printf ("command data read failed\n");
@@ -361,6 +373,12 @@
// printf ("asf media packet detected, len=%d\n", packet_len);
+ if (packet_len < 0 || packet_len > BUF_SIZE) {
+ mp_msg(MSGT_NETWORK, MSGL_FATAL,
+ "Invalid rtsp packet size, giving up\n");
+ return 0;
+ }
+
if (!get_data (s, data, packet_len)) {
printf ("media data read failed\n");
return 0;
@@ -380,6 +398,12 @@
packet_len = get_32 ((unsigned char*)&packet_len, 0) + 4;
+ if (packet_len < 0 || packet_len > BUF_SIZE) {
+ mp_msg(MSGT_NETWORK, MSGL_FATAL,
+ "Invalid rtsp packet size, giving up\n");
+ return 0;
+ }
+
if (!get_data (s, data, packet_len)) {
printf ("command data read failed\n");
return 0;
@@ -464,7 +488,7 @@
{
char str[1024];
char data[BUF_SIZE];
- uint8_t asf_header[8192];
+ uint8_t asf_header[HDR_BUF_SIZE];
int asf_header_len;
int len, i, packet_length;
char *path, *unescpath;
--- MPlayer-1.0pre5/libmpdemux/demux_bmp.c 2003-04-30 22:24:09.000000000 +0200
+++ MPlayer-1.0pre5try2/libmpdemux/demux_bmp.c 1970-01-01 01:00:00.000000000 +0100
@@ -1,116 +0,0 @@
-/*
- BMP file parser for the MPlayer program
- by Mike Melanson
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include "config.h"
-#include "mp_msg.h"
-#include "help_mp.h"
-
-#include "stream.h"
-#include "demuxer.h"
-#include "stheader.h"
-
-typedef struct {
- int image_size;
- int image_offset;
-} bmp_image_t;
-
-// Check if a file is a BMP file depending on whether starts with 'BM'
-int bmp_check_file(demuxer_t *demuxer)
-{
- if (stream_read_word(demuxer->stream) == (('B' << 8) | 'M'))
- return 1;
- else
- return 0;
-}
-
-// return value:
-// 0 = EOF or no stream found
-// 1 = successfully read a packet
-int demux_bmp_fill_buffer(demuxer_t *demuxer)
-{
- bmp_image_t *bmp_image = (bmp_image_t *)demuxer->priv;
-
- stream_reset(demuxer->stream);
- stream_seek(demuxer->stream, bmp_image->image_offset);
- ds_read_packet(demuxer->video, demuxer->stream, bmp_image->image_size,
- 0, bmp_image->image_offset, 1);
-
- return 1;
-}
-
-demuxer_t* demux_open_bmp(demuxer_t* demuxer)
-{
- sh_video_t *sh_video = NULL;
- unsigned int filesize;
- unsigned int data_offset;
- bmp_image_t *bmp_image;
-
- // go back to the beginning
- stream_reset(demuxer->stream);
- stream_seek(demuxer->stream, 2);
- filesize = stream_read_dword_le(demuxer->stream);
- stream_skip(demuxer->stream, 4);
- data_offset = stream_read_word_le(demuxer->stream);
- stream_skip(demuxer->stream, 2);
-
- // create a new video stream header
- sh_video = new_sh_video(demuxer, 0);
-
- // make sure the demuxer knows about the new video stream header
- demuxer->video->sh = sh_video;
-
- // make sure that the video demuxer stream header knows about its
- // parent video demuxer stream
- sh_video->ds = demuxer->video;
-
- // load the BITMAPINFOHEADER
- // allocate size and take the palette table into account
- sh_video->bih = (BITMAPINFOHEADER *)malloc(data_offset - 12);
- sh_video->bih->biSize = stream_read_dword_le(demuxer->stream);
- sh_video->bih->biWidth = stream_read_dword_le(demuxer->stream);
- sh_video->bih->biHeight = stream_read_dword_le(demuxer->stream);
- sh_video->bih->biPlanes = stream_read_word_le(demuxer->stream);
- sh_video->bih->biBitCount = stream_read_word_le(demuxer->stream);
- sh_video->bih->biCompression = stream_read_dword_le(demuxer->stream);
- sh_video->bih->biSizeImage = stream_read_dword_le(demuxer->stream);
- sh_video->bih->biXPelsPerMeter = stream_read_dword_le(demuxer->stream);
- sh_video->bih->biYPelsPerMeter = stream_read_dword_le(demuxer->stream);
- sh_video->bih->biClrUsed = stream_read_dword_le(demuxer->stream);
- sh_video->bih->biClrImportant = stream_read_dword_le(demuxer->stream);
- // fetch the palette
- stream_read(demuxer->stream, (unsigned char *)(sh_video->bih) + 40,
- sh_video->bih->biClrUsed * 4);
-
- // load the data
- bmp_image = (bmp_image_t *)malloc(sizeof(bmp_image_t));
- bmp_image->image_size = filesize - data_offset;
- bmp_image->image_offset = data_offset;
-
- // custom fourcc for internal MPlayer use
- sh_video->format = sh_video->bih->biCompression;
-
- sh_video->disp_w = sh_video->bih->biWidth;
- sh_video->disp_h = sh_video->bih->biHeight;
-
- // get the speed
- sh_video->fps = 2;
- sh_video->frametime = 1 / sh_video->fps;
-
- demuxer->priv = bmp_image;
-
- return demuxer;
-}
-
-void demux_close_bmp(demuxer_t* demuxer) {
- bmp_image_t *bmp_image = demuxer->priv;
-
- if(!bmp_image)
- return;
- free(bmp_image);
-}
--- MPlayer-1.0pre5/libmpdemux/demuxer.c 2004-05-07 10:31:39.000000000 +0200
+++ MPlayer-1.0pre5try2/libmpdemux/demuxer.c 2004-12-15 21:34:12.000000000 +0100
@@ -121,7 +121,6 @@
extern void demux_close_mf(demuxer_t* demuxer);
extern void demux_close_roq(demuxer_t* demuxer);
extern void demux_close_film(demuxer_t* demuxer);
-extern void demux_close_bmp(demuxer_t* demuxer);
extern void demux_close_fli(demuxer_t* demuxer);
extern void demux_close_nsv(demuxer_t* demuxer);
extern void demux_close_nuv(demuxer_t* demuxer);
@@ -172,8 +171,6 @@
demux_close_roq(demuxer); break;
case DEMUXER_TYPE_FILM:
demux_close_film(demuxer); break;
- case DEMUXER_TYPE_BMP:
- demux_close_bmp(demuxer); break;
case DEMUXER_TYPE_FLI:
demux_close_fli(demuxer); break;
case DEMUXER_TYPE_NSV:
@@ -290,7 +287,6 @@
int demux_mf_fill_buffer( demuxer_t *demux);
int demux_roq_fill_buffer(demuxer_t *demux);
int demux_film_fill_buffer(demuxer_t *demux);
-int demux_bmp_fill_buffer(demuxer_t *demux);
int demux_fli_fill_buffer(demuxer_t *demux);
int demux_mpg_es_fill_buffer(demuxer_t *demux);
int demux_mpg_fill_buffer(demuxer_t *demux);
@@ -330,7 +326,6 @@
case DEMUXER_TYPE_MF: return demux_mf_fill_buffer(demux);
case DEMUXER_TYPE_ROQ: return demux_roq_fill_buffer(demux);
case DEMUXER_TYPE_FILM: return demux_film_fill_buffer(demux);
- case DEMUXER_TYPE_BMP: return demux_bmp_fill_buffer(demux);
case DEMUXER_TYPE_FLI: return demux_fli_fill_buffer(demux);
case DEMUXER_TYPE_MPEG_TY: return demux_ty_fill_buffer( demux );
case DEMUXER_TYPE_MPEG4_ES:
@@ -587,7 +582,6 @@
int demux_open_fli(demuxer_t* demuxer);
int demux_open_mf(demuxer_t* demuxer);
int demux_open_film(demuxer_t* demuxer);
-int demux_open_bmp(demuxer_t* demuxer);
int demux_open_roq(demuxer_t* demuxer);
#ifdef HAVE_LIBDV095
int demux_open_rawdv(demuxer_t* demuxer);
@@ -613,7 +607,6 @@
extern int demux_rawvideo_open(demuxer_t* demuxer);
extern int smjpeg_check_file(demuxer_t *demuxer);
extern int demux_open_smjpeg(demuxer_t* demuxer);
-extern int bmp_check_file(demuxer_t *demuxer);
extern int demux_xmms_open(demuxer_t* demuxer);
extern int gif_check_file(demuxer_t *demuxer);
extern int demux_open_gif(demuxer_t* demuxer);
@@ -884,17 +877,6 @@
}
}
#endif
-//=============== Try to open as BMP file: =================
-if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_BMP){
- demuxer=new_demuxer(stream,DEMUXER_TYPE_BMP,audio_id,video_id,dvdsub_id);
- if(bmp_check_file(demuxer)){
- mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"BMP");
- file_format=DEMUXER_TYPE_BMP;
- } else {
- free_demuxer(demuxer);
- demuxer = NULL;
- }
-}
#ifdef HAVE_OGGVORBIS
//=============== Try to open as Ogg file: =================
if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_OGG){
@@ -1165,10 +1147,6 @@
break;
}
#endif
- case DEMUXER_TYPE_BMP: {
- if (!demux_open_bmp(demuxer)) return NULL;
- break;
- }
case DEMUXER_TYPE_ROQ: {
if (!demux_open_roq(demuxer)) return NULL;
break;
--- MPlayer-1.0pre5/libmpdemux/demuxer.h 2004-04-12 16:19:12.000000000 +0200
+++ MPlayer-1.0pre5try2/libmpdemux/demuxer.h 2004-12-15 21:34:12.000000000 +0100
@@ -27,7 +27,6 @@
#define DEMUXER_TYPE_MF 16
#define DEMUXER_TYPE_AUDIO 17
#define DEMUXER_TYPE_OGG 18
-#define DEMUXER_TYPE_BMP 19
#define DEMUXER_TYPE_RAWAUDIO 20
#define DEMUXER_TYPE_RTP 21
#define DEMUXER_TYPE_RAWDV 22
--- MPlayer-1.0pre5/libmpdemux/Makefile 2004-07-12 00:47:49.000000000 +0200
+++ MPlayer-1.0pre5try2/libmpdemux/Makefile 2004-12-15 21:34:12.000000000 +0100
@@ -3,7 +3,7 @@
include ../config.mak
-SRCS = mp3_hdr.c video.c mpeg_hdr.c cache2.c asfheader.c aviheader.c aviprint.c muxer.c muxer_avi.c muxer_mpeg.c demux_asf.c demux_avi.c demux_mov.c parse_mp4.c demux_mpg.c demux_ty.c demux_ty_osd.c demux_pva.c demux_viv.c demuxer.c dvdnav_stream.c open.c parse_es.c stream.c stream_file.c stream_netstream.c stream_vcd.c stream_null.c stream_ftp.c tv.c tvi_dummy.c tvi_v4l.c tvi_v4l2.c tvi_bsdbt848.c frequencies.c demux_fli.c demux_real.c demux_y4m.c yuv4mpeg.c yuv4mpeg_ratio.c demux_nuv.c demux_film.c demux_roq.c mf.c demux_mf.c demux_audio.c demux_demuxers.c demux_ogg.c demux_bmp.c cdda.c demux_rawaudio.c demux_rawvideo.c cddb.c cdinfo.c demux_rawdv.c ai_alsa.c ai_alsa1x.c ai_oss.c audio_in.c demux_smjpeg.c demux_lmlm4.c cue_read.c extension.c demux_gif.c demux_ts.c demux_realaud.c url.c muxer_rawvideo.c demux_lavf.c demux_nsv.c
+SRCS = mp3_hdr.c video.c mpeg_hdr.c cache2.c asfheader.c aviheader.c aviprint.c muxer.c muxer_avi.c muxer_mpeg.c demux_asf.c demux_avi.c demux_mov.c parse_mp4.c demux_mpg.c demux_ty.c demux_ty_osd.c demux_pva.c demux_viv.c demuxer.c dvdnav_stream.c open.c parse_es.c stream.c stream_file.c stream_netstream.c stream_vcd.c stream_null.c stream_ftp.c tv.c tvi_dummy.c tvi_v4l.c tvi_v4l2.c tvi_bsdbt848.c frequencies.c demux_fli.c demux_real.c demux_y4m.c yuv4mpeg.c yuv4mpeg_ratio.c demux_nuv.c demux_film.c demux_roq.c mf.c demux_mf.c demux_audio.c demux_demuxers.c demux_ogg.c cdda.c demux_rawaudio.c demux_rawvideo.c cddb.c cdinfo.c demux_rawdv.c ai_alsa.c ai_alsa1x.c ai_oss.c audio_in.c demux_smjpeg.c demux_lmlm4.c cue_read.c extension.c demux_gif.c demux_ts.c demux_realaud.c url.c muxer_rawvideo.c demux_lavf.c demux_nsv.c
ifeq ($(XMMS_PLUGINS),yes)
SRCS += demux_xmms.c
endif
--- MPlayer-1.0pre5/libmpdemux/pnm.c 2003-10-04 19:29:01.000000000 +0200
+++ MPlayer-1.0pre5try2/libmpdemux/pnm.c 2004-12-15 21:37:11.000000000 +0100
@@ -307,9 +307,12 @@
char *data, int *need_response) {
unsigned int chunk_size;
- int n;
+ unsigned int n;
char *ptr;
+ if (max < PREAMBLE_SIZE)
+ return -1;
+
/* get first PREAMBLE_SIZE bytes and ignore checksum */
rm_read (p->s, data, CHECKSUM_SIZE);
if (data[0] == 0x72)
@@ -317,6 +320,8 @@
else
rm_read (p->s, data+CHECKSUM_SIZE, PREAMBLE_SIZE-CHECKSUM_SIZE);
+ max -= PREAMBLE_SIZE;
+
*chunk_type = BE_32(data);
chunk_size = BE_32(data+4);
@@ -324,18 +329,30 @@
case PNA_TAG:
*need_response=0;
ptr=data+PREAMBLE_SIZE;
+ if (max < 1)
+ return -1;
rm_read (p->s, ptr++, 1);
+ max -= 1;
while(1) {
/* expecting following chunk format: 0x4f <chunk size> <data...> */
+ if (max < 2)
+ return -1;
rm_read (p->s, ptr, 2);
+ max -= 2;
if (*ptr == 'X') /* checking for server message */
{
printf("input_pnm: got a message from server:\n");
+ if (max < 1)
+ return -1;
rm_read (p->s, ptr+2, 1);
+ max = -1;
n=BE_16(ptr+1);
+ if (max < n)
+ return -1;
rm_read (p->s, ptr+3, n);
+ max -= n;
ptr[3+n]=0;
printf("%s\n",ptr+3);
return -1;
@@ -354,10 +371,15 @@
}
if (*ptr != 0x4f) break;
n=ptr[1];
+ if (max < n)
+ return -1;
rm_read (p->s, ptr+2, n);
+ max -= n;
ptr+=(n+2);
}
/* the checksum of the next chunk is ignored here */
+ if (max < 1)
+ return -1;
rm_read (p->s, ptr+2, 1);
ptr+=3;
chunk_size=ptr-data;
@@ -367,10 +389,12 @@
case PROP_TAG:
case MDPR_TAG:
case CONT_TAG:
- if (chunk_size > max) {
+ if (chunk_size > max || chunk_size < PREAMBLE_SIZE) {
printf("error: max chunk size exeeded (max was 0x%04x)\n", max);
+#ifdef LOG
n=rm_read (p->s, &data[PREAMBLE_SIZE], 0x100 - PREAMBLE_SIZE);
hexdump(data,n+PREAMBLE_SIZE);
+#endif
return -1;
}
rm_read (p->s, &data[PREAMBLE_SIZE], chunk_size-PREAMBLE_SIZE);
--- MPlayer-1.0pre5/libmpdemux/realrtsp/real.c 2004-04-25 02:17:23.000000000 +0200
+++ MPlayer-1.0pre5try2/libmpdemux/realrtsp/real.c 2004-12-15 21:35:34.000000000 +0100
@@ -683,6 +683,8 @@
return 1;
}
+//! maximum size of the rtsp description, must be < INT_MAX
+#define MAX_DESC_BUF (20 * 1024 * 1024)
rmff_header_t *real_setup_and_get_header(rtsp_t *rtsp_session, uint32_t bandwidth) {
char *description=NULL;
@@ -733,13 +735,21 @@
else
size=atoi(rtsp_search_answers(rtsp_session,"Content-length"));
+ // as size is unsigned this also catches the case (size < 0)
+ if (size > MAX_DESC_BUF) {
+ printf("real: Content-length for description too big (> %uMB)!\n",
+ MAX_DESC_BUF/(1024*1024) );
+ xbuffer_free(buf);
+ return NULL;
+ }
+
if (!rtsp_search_answers(rtsp_session,"ETag"))
printf("real: got no ETag!\n");
else
session_id=strdup(rtsp_search_answers(rtsp_session,"ETag"));
#ifdef LOG
- printf("real: Stream description size: %i\n", size);
+ printf("real: Stream description size: %u\n", size);
#endif
description=malloc(sizeof(char)*(size+1));
--- MPlayer-1.0pre5/mp3lib/layer2.c 2004-04-06 03:06:21.000000000 +0200
+++ MPlayer-1.0pre5try2/mp3lib/layer2.c 2004-12-15 22:06:29.120521177 +0100
@@ -80,12 +80,12 @@
bita = bit_alloc;
if(stereo)
{
- for (i=jsbound;i;i--,alloc1+=(1<<step))
+ for (i=jsbound;i>0;i--,alloc1+=(1<<step))
{
*bita++ = (char) getbits(step=alloc1->bits);
*bita++ = (char) getbits(step);
}
- for (i=sblimit-jsbound;i;i--,alloc1+=(1<<step))
+ for (i=sblimit-jsbound;i>0;i--,alloc1+=(1<<step))
{
bita[0] = (char) getbits(step=alloc1->bits);
bita[1] = bita[0];
@@ -93,24 +93,24 @@
}
bita = bit_alloc;
scfsi=scfsi_buf;
- for (i=sblimit2;i;i--)
+ for (i=sblimit2;i>0;i--)
if (*bita++)
*scfsi++ = (char) getbits_fast(2);
}
else /* mono */
{
- for (i=sblimit;i;i--,alloc1+=(1<<step))
+ for (i=sblimit;i>0;i--,alloc1+=(1<<step))
*bita++ = (char) getbits(step=alloc1->bits);
bita = bit_alloc;
scfsi=scfsi_buf;
- for (i=sblimit;i;i--)
+ for (i=sblimit;i>0;i--)
if (*bita++)
*scfsi++ = (char) getbits_fast(2);
}
bita = bit_alloc;
scfsi=scfsi_buf;
- for (i=sblimit2;i;i--)
+ for (i=sblimit2;i>0;i--)
if (*bita++)
switch (*scfsi++)
{
--- MPlayer-1.0pre5/version.sh 2004-07-15 02:18:47.000000000 +0200
+++ MPlayer-1.0pre5try2/version.sh 2004-12-15 22:12:19.181995904 +0100
@@ -1,2 +1,2 @@
#!/bin/sh
-echo "#define VERSION \"1.0pre5-$1\"" > version.h
+echo "#define VERSION \"1.0pre5try2-$1\"" > version.h