aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuca Barbato2012-09-14 20:03:37 +0200
committerLuca Barbato2012-09-19 20:34:14 +0200
commitc9a39cec70603f662f4c326b21b11c4f0112079a (patch)
treeb17b2d353aac3dbca07617114b7ff3afdafef738
parentdf1d84121ba0656abb8bcfcb72b2a0b44a59fdbc (diff)
matroskadec: return meaningful errors in matroska_decode_buffer
-rw-r--r--libavformat/matroskadec.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index deb272c2e3..27c962eab1 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -991,7 +991,7 @@ static int matroska_decode_buffer(uint8_t** buf, int* buf_size,
int olen;
if (pkt_size >= 10000000)
- return -1;
+ return AVERROR_INVALIDDATA;
switch (encodings[0].compression.algo) {
case MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP: {
@@ -1015,13 +1015,16 @@ static int matroska_decode_buffer(uint8_t** buf, int* buf_size,
olen = pkt_size *= 3;
newpktdata = av_realloc(pkt_data, pkt_size + AV_LZO_OUTPUT_PADDING);
if (!newpktdata) {
+ result = AVERROR(ENOMEM);
goto failed;
}
pkt_data = newpktdata;
result = av_lzo1x_decode(pkt_data, &olen, data, &isize);
} while (result==AV_LZO_OUTPUT_FULL && pkt_size<10000000);
- if (result)
+ if (result) {
+ result = AVERROR_INVALIDDATA;
goto failed;
+ }
pkt_size -= olen;
break;
#if CONFIG_ZLIB
@@ -1045,8 +1048,13 @@ static int matroska_decode_buffer(uint8_t** buf, int* buf_size,
} while (result==Z_OK && pkt_size<10000000);
pkt_size = zstream.total_out;
inflateEnd(&zstream);
- if (result != Z_STREAM_END)
+ if (result != Z_STREAM_END) {
+ if (result == Z_MEM_ERROR)
+ result = AVERROR(ENOMEM);
+ else
+ result = AVERROR_INVALIDDATA;
goto failed;
+ }
break;
}
#endif
@@ -1071,13 +1079,18 @@ static int matroska_decode_buffer(uint8_t** buf, int* buf_size,
} while (result==BZ_OK && pkt_size<10000000);
pkt_size = bzstream.total_out_lo32;
BZ2_bzDecompressEnd(&bzstream);
- if (result != BZ_STREAM_END)
+ if (result != BZ_STREAM_END) {
+ if (result == BZ_MEM_ERROR)
+ result = AVERROR(ENOMEM);
+ else
+ result = AVERROR_INVALIDDATA;
goto failed;
+ }
break;
}
#endif
default:
- return -1;
+ return AVERROR_INVALIDDATA;
}
*buf = pkt_data;
@@ -1085,7 +1098,7 @@ static int matroska_decode_buffer(uint8_t** buf, int* buf_size,
return 0;
failed:
av_free(pkt_data);
- return -1;
+ return result;
}
static void matroska_fix_ass_packet(MatroskaDemuxContext *matroska,