Commit f874e272 authored by wm4's avatar wm4

avcodec/dvdsub: fix partial packet assembly

Assuming the first and second packets are partial, this would append the
reassembly buffer (ctx->buf) to itself with the second
append_to_cached_buf() call, because buf is set to ctx->buf.

I do not know a valid sample file which triggers this, and do not know
if packets can be split into more than 2 sub-packets, but it triggered
with a (differently) broken sample file in trac issue #4872.
parent 26eb2940
...@@ -535,6 +535,7 @@ static int dvdsub_decode(AVCodecContext *avctx, ...@@ -535,6 +535,7 @@ static int dvdsub_decode(AVCodecContext *avctx,
const uint8_t *buf = avpkt->data; const uint8_t *buf = avpkt->data;
int buf_size = avpkt->size; int buf_size = avpkt->size;
AVSubtitle *sub = data; AVSubtitle *sub = data;
int appended = 0;
int is_menu; int is_menu;
if (ctx->buf_size) { if (ctx->buf_size) {
...@@ -545,12 +546,13 @@ static int dvdsub_decode(AVCodecContext *avctx, ...@@ -545,12 +546,13 @@ static int dvdsub_decode(AVCodecContext *avctx,
} }
buf = ctx->buf; buf = ctx->buf;
buf_size = ctx->buf_size; buf_size = ctx->buf_size;
appended = 1;
} }
is_menu = decode_dvd_subtitles(ctx, sub, buf, buf_size); is_menu = decode_dvd_subtitles(ctx, sub, buf, buf_size);
if (is_menu == AVERROR(EAGAIN)) { if (is_menu == AVERROR(EAGAIN)) {
*data_size = 0; *data_size = 0;
return append_to_cached_buf(avctx, buf, buf_size); return appended ? 0 : append_to_cached_buf(avctx, buf, buf_size);
} }
if (is_menu < 0) { if (is_menu < 0) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment