Skip to content

Commit 4a70750

Browse files
author
Uoti Urpala
committed
demux_mkv: Fix problem with compressed subtitle private data
Convert demux_mkv_decode() to allocate possible new storage with talloc and fix a talloc/malloc conflict in demux_mkv_open_sub() that broke decoding of files which had a subtitle track with compressed private data.
1 parent cbc6eab commit 4a70750

File tree

1 file changed

+12
-10
lines changed

1 file changed

+12
-10
lines changed

libmpdemux/demux_mkv.c

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ static void demux_mkv_decode(mkv_track_t *track, uint8_t *src,
322322
continue;
323323

324324
if (src != *dest && src != orig_src)
325-
free(src);
325+
talloc_free(src);
326326
src = *dest; // output from last iteration is new source
327327

328328
if (enc->comp_algo == 0) {
@@ -350,13 +350,13 @@ static void demux_mkv_decode(mkv_track_t *track, uint8_t *src,
350350
int result;
351351
do {
352352
*size += 4000;
353-
*dest = realloc(*dest, *size);
353+
*dest = talloc_realloc_size(NULL, *dest, *size);
354354
zstream.next_out = (Bytef *) (*dest + zstream.total_out);
355355
result = inflate(&zstream, Z_NO_FLUSH);
356356
if (result != Z_OK && result != Z_STREAM_END) {
357357
mp_tmsg(MSGT_DEMUX, MSGL_WARN,
358358
"[mkv] zlib decompression failed.\n");
359-
free(*dest);
359+
talloc_free(*dest);
360360
*dest = NULL;
361361
inflateEnd(&zstream);
362362
goto error;
@@ -377,15 +377,16 @@ static void demux_mkv_decode(mkv_track_t *track, uint8_t *src,
377377
int srclen = *size;
378378
if (dstlen > SIZE_MAX - AV_LZO_OUTPUT_PADDING)
379379
goto lzo_fail;
380-
*dest = realloc(*dest, dstlen + AV_LZO_OUTPUT_PADDING);
380+
*dest = talloc_realloc_size(NULL, *dest,
381+
dstlen + AV_LZO_OUTPUT_PADDING);
381382
int result = av_lzo1x_decode(*dest, &dstlen, src, &srclen);
382383
if (result == 0)
383384
break;
384385
if (!(result & AV_LZO_OUTPUT_FULL)) {
385386
lzo_fail:
386387
mp_tmsg(MSGT_DEMUX, MSGL_WARN,
387388
"[mkv] lzo decompression failed.\n");
388-
free(*dest);
389+
talloc_free(*dest);
389390
*dest = NULL;
390391
goto error;
391392
}
@@ -395,7 +396,7 @@ static void demux_mkv_decode(mkv_track_t *track, uint8_t *src,
395396
}
396397
*size = dstlen;
397398
} else if (enc->comp_algo == 3) {
398-
*dest = malloc(*size + enc->comp_settings_len);
399+
*dest = talloc_size(NULL, *size + enc->comp_settings_len);
399400
memcpy(*dest, enc->comp_settings, enc->comp_settings_len);
400401
memcpy(*dest + enc->comp_settings_len, src, *size);
401402
*size += enc->comp_settings_len;
@@ -404,7 +405,7 @@ static void demux_mkv_decode(mkv_track_t *track, uint8_t *src,
404405

405406
error:
406407
if (src != *dest && src != orig_src)
407-
free(src);
408+
talloc_free(src);
408409
}
409410

410411

@@ -1587,7 +1588,8 @@ static int demux_mkv_open_sub(demuxer_t *demuxer, mkv_track_t *track,
15871588
size = track->private_size;
15881589
demux_mkv_decode(track, track->private_data, &buffer, &size, 2);
15891590
if (buffer && buffer != track->private_data) {
1590-
free(track->private_data);
1591+
talloc_free(track->private_data);
1592+
talloc_steal(track, buffer);
15911593
track->private_data = buffer;
15921594
track->private_size = size;
15931595
}
@@ -2195,7 +2197,7 @@ static int handle_block(demuxer_t *demuxer, uint8_t *block, uint64_t length,
21952197
demux_mkv_decode(track, block, &buffer, &size, 1);
21962198
handle_subtitles(demuxer, track, buffer, size, block_duration, tc);
21972199
if (buffer != block)
2198-
free(buffer);
2200+
talloc_free(buffer);
21992201
use_this_block = 0;
22002202
}
22012203
} else
@@ -2224,7 +2226,7 @@ static int handle_block(demuxer_t *demuxer, uint8_t *block, uint64_t length,
22242226
dp = new_demux_packet(size);
22252227
memcpy(dp->buffer, buffer, size);
22262228
if (buffer != block)
2227-
free(buffer);
2229+
talloc_free(buffer);
22282230
dp->flags = (block_bref == 0
22292231
&& block_fref == 0) ? 0x10 : 0;
22302232
/* If default_duration is 0, assume no pts value is known

0 commit comments

Comments
 (0)