matroskadec: return meaningful errors in matroska_decode_buffer

release/1.0
Luca Barbato 12 years ago
parent df1d84121b
commit c9a39cec70
  1. 25
      libavformat/matroskadec.c

@ -991,7 +991,7 @@ static int matroska_decode_buffer(uint8_t** buf, int* buf_size,
int olen; int olen;
if (pkt_size >= 10000000) if (pkt_size >= 10000000)
return -1; return AVERROR_INVALIDDATA;
switch (encodings[0].compression.algo) { switch (encodings[0].compression.algo) {
case MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP: { 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; olen = pkt_size *= 3;
newpktdata = av_realloc(pkt_data, pkt_size + AV_LZO_OUTPUT_PADDING); newpktdata = av_realloc(pkt_data, pkt_size + AV_LZO_OUTPUT_PADDING);
if (!newpktdata) { if (!newpktdata) {
result = AVERROR(ENOMEM);
goto failed; goto failed;
} }
pkt_data = newpktdata; pkt_data = newpktdata;
result = av_lzo1x_decode(pkt_data, &olen, data, &isize); result = av_lzo1x_decode(pkt_data, &olen, data, &isize);
} while (result==AV_LZO_OUTPUT_FULL && pkt_size<10000000); } while (result==AV_LZO_OUTPUT_FULL && pkt_size<10000000);
if (result) if (result) {
result = AVERROR_INVALIDDATA;
goto failed; goto failed;
}
pkt_size -= olen; pkt_size -= olen;
break; break;
#if CONFIG_ZLIB #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); } while (result==Z_OK && pkt_size<10000000);
pkt_size = zstream.total_out; pkt_size = zstream.total_out;
inflateEnd(&zstream); 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; goto failed;
}
break; break;
} }
#endif #endif
@ -1071,13 +1079,18 @@ static int matroska_decode_buffer(uint8_t** buf, int* buf_size,
} while (result==BZ_OK && pkt_size<10000000); } while (result==BZ_OK && pkt_size<10000000);
pkt_size = bzstream.total_out_lo32; pkt_size = bzstream.total_out_lo32;
BZ2_bzDecompressEnd(&bzstream); 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; goto failed;
}
break; break;
} }
#endif #endif
default: default:
return -1; return AVERROR_INVALIDDATA;
} }
*buf = pkt_data; *buf = pkt_data;
@ -1085,7 +1098,7 @@ static int matroska_decode_buffer(uint8_t** buf, int* buf_size,
return 0; return 0;
failed: failed:
av_free(pkt_data); av_free(pkt_data);
return -1; return result;
} }
static void matroska_fix_ass_packet(MatroskaDemuxContext *matroska, static void matroska_fix_ass_packet(MatroskaDemuxContext *matroska,

Loading…
Cancel
Save