diff options
author | Wolfram Gloger <wmglo@dent.med.uni-muenchen.de> | 2005-02-16 23:04:11 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2005-02-16 23:04:11 +0000 |
commit | 27bb1ed348fc7ab7c77eec815d9cec95a526b27c (patch) | |
tree | 1acdd8ea03941f36d5dbe94fe2cc89bdf83c8190 /libavformat/mpegts.c | |
parent | aabdc4618788a90c4a2b64a569f560d5b7378271 (diff) | |
download | ffmpeg-27bb1ed348fc7ab7c77eec815d9cec95a526b27c.tar.gz |
Writing to freed memory in write_section_data() patch by (Wolfram Gloger <wmglo dent dot med dot uni-muenchen de>)
Originally committed as revision 3957 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/mpegts.c')
-rw-r--r-- | libavformat/mpegts.c | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index f48055db44..d89258c44a 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -116,7 +116,6 @@ static void write_section_data(AVFormatContext *s, MpegTSFilter *tss1, { MpegTSSectionFilter *tss = &tss1->u.section_filter; int len; - unsigned int crc; if (is_start) { memcpy(tss->section_buf, buf, buf_size); @@ -142,14 +141,10 @@ static void write_section_data(AVFormatContext *s, MpegTSFilter *tss1, } if (tss->section_h_size != -1 && tss->section_index >= tss->section_h_size) { - if (tss->check_crc) { - crc = mpegts_crc32(tss->section_buf, tss->section_h_size); - if (crc != 0) - goto invalid_crc; - } - tss->section_cb(tss->opaque, tss->section_buf, tss->section_h_size); - invalid_crc: tss->end_of_section_reached = 1; + if (!tss->check_crc || + mpegts_crc32(tss->section_buf, tss->section_h_size) == 0) + tss->section_cb(tss->opaque, tss->section_buf, tss->section_h_size); } } @@ -926,9 +921,12 @@ static void handle_packet(MpegTSContext *ts, const uint8_t *packet) if (p + len > p_end) return; if (len && cc_ok) { - /* write remaning section bytes */ + /* write remaining section bytes */ write_section_data(s, tss, p, len, 0); + /* check whether filter has been closed */ + if (!ts->pids[pid]) + return; } p += len; if (p < p_end) { |