[FFmpeg-cvslog] idcin: better error handling
Justin Ruggles
git at videolan.org
Thu Jan 10 12:56:29 CET 2013
ffmpeg | branch: master | Justin Ruggles <justin.ruggles at gmail.com> | Wed Aug 1 17:16:58 2012 -0400| [5d0450461ff729be5f531d333d29754155e406c5] | committer: Justin Ruggles
idcin: better error handling
Add some additional checks for EOF and print error messages on an incomplete
header or packet.
FATE reference updated for id-cin-video due to the demuxer no longer
returning a partial video packet at EOF.
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=5d0450461ff729be5f531d333d29754155e406c5
---
libavformat/idcin.c | 31 +++++++++++++++++++++++++++----
tests/ref/fate/id-cin-video | 1 -
2 files changed, 27 insertions(+), 5 deletions(-)
diff --git a/libavformat/idcin.c b/libavformat/idcin.c
index 93ba721..87117eb 100644
--- a/libavformat/idcin.c
+++ b/libavformat/idcin.c
@@ -147,6 +147,7 @@ static int idcin_read_header(AVFormatContext *s)
AVStream *st;
unsigned int width, height;
unsigned int sample_rate, bytes_per_sample, channels;
+ int ret;
/* get the 5 header parameters */
width = avio_rl32(pb);
@@ -155,6 +156,11 @@ static int idcin_read_header(AVFormatContext *s)
bytes_per_sample = avio_rl32(pb);
channels = avio_rl32(pb);
+ if (s->pb->eof_reached) {
+ av_log(s, AV_LOG_ERROR, "incomplete header\n");
+ return s->pb->error ? s->pb->error : AVERROR_EOF;
+ }
+
if (av_image_check_size(width, height, 0, s) < 0)
return AVERROR_INVALIDDATA;
if (sample_rate > 0) {
@@ -192,9 +198,13 @@ static int idcin_read_header(AVFormatContext *s)
/* load up the Huffman tables into extradata */
st->codec->extradata_size = HUFFMAN_TABLE_SIZE;
st->codec->extradata = av_malloc(HUFFMAN_TABLE_SIZE);
- if (avio_read(pb, st->codec->extradata, HUFFMAN_TABLE_SIZE) !=
- HUFFMAN_TABLE_SIZE)
+ ret = avio_read(pb, st->codec->extradata, HUFFMAN_TABLE_SIZE);
+ if (ret < 0) {
+ return ret;
+ } else if (ret != HUFFMAN_TABLE_SIZE) {
+ av_log(s, AV_LOG_ERROR, "incomplete header\n");
return AVERROR(EIO);
+ }
if (idcin->audio_present) {
idcin->audio_present = 1;
@@ -251,7 +261,7 @@ static int idcin_read_packet(AVFormatContext *s,
uint32_t palette[256];
if (s->pb->eof_reached)
- return AVERROR(EIO);
+ return s->pb->error ? s->pb->error : AVERROR_EOF;
if (idcin->next_chunk_is_video) {
command = avio_rl32(pb);
@@ -259,8 +269,13 @@ static int idcin_read_packet(AVFormatContext *s,
return AVERROR(EIO);
} else if (command == 1) {
/* trigger a palette change */
- if (avio_read(pb, palette_buffer, 768) != 768)
+ ret = avio_read(pb, palette_buffer, 768);
+ if (ret < 0) {
+ return ret;
+ } else if (ret != 768) {
+ av_log(s, AV_LOG_ERROR, "incomplete packet\n");
return AVERROR(EIO);
+ }
/* scale the palette as necessary */
palette_scale = 2;
for (i = 0; i < 768; i++)
@@ -277,6 +292,10 @@ static int idcin_read_packet(AVFormatContext *s,
}
}
+ if (s->pb->eof_reached) {
+ av_log(s, AV_LOG_ERROR, "incomplete packet\n");
+ return s->pb->error ? s->pb->error : AVERROR_EOF;
+ }
chunk_size = avio_rl32(pb);
if (chunk_size < 4 || chunk_size > INT_MAX - 4) {
av_log(s, AV_LOG_ERROR, "invalid chunk size: %u\n", chunk_size);
@@ -288,6 +307,10 @@ static int idcin_read_packet(AVFormatContext *s,
ret= av_get_packet(pb, pkt, chunk_size);
if (ret < 0)
return ret;
+ else if (ret != chunk_size) {
+ av_log(s, AV_LOG_ERROR, "incomplete packet\n");
+ return AVERROR(EIO);
+ }
if (command == 1) {
uint8_t *pal;
diff --git a/tests/ref/fate/id-cin-video b/tests/ref/fate/id-cin-video
index 241cae5..f55544f 100644
--- a/tests/ref/fate/id-cin-video
+++ b/tests/ref/fate/id-cin-video
@@ -104,4 +104,3 @@
1, 78750, 78750, 1575, 6300, 0xe3bfa403
0, 51, 51, 1, 230400, 0x488de02d
1, 80325, 80325, 1575, 6300, 0x2c5bd9c9
-0, 52, 52, 1, 230400, 0x488de02d
More information about the ffmpeg-cvslog
mailing list