History

demux_mkv: add sanity checks for RealAudio packet sizes

This fixes feeding unitialized data in some cases on corrupted/fuzzed files.

Kacper Michajłow committed 1 year ago

Commit a0d164c1 parent 8385c2b1 file · +8 −0Browse files

Unified · Split

demux/demux_mkv.c+8−0
@@ -1969,12 +1969,16 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track) · 1968 unmodified lines
19691969 if (flavor >= MP_ARRAY_SIZE(atrc_fl2bps))
19701970 goto error;
19711971 sh_a->bitrate = atrc_fl2bps[flavor] * 8;
1972+ if (!track->sub_packet_size || track->audiopk_size % track->sub_packet_size)
1973+ goto error;
19721974 sh_a->block_align = track->sub_packet_size;
19731975 } else if (!strcmp(track->codec_id, "A_REAL/COOK")) {
19741976 sh_a->codec = "cook";
19751977 if (flavor >= MP_ARRAY_SIZE(cook_fl2bps))
19761978 goto error;
19771979 sh_a->bitrate = cook_fl2bps[flavor] * 8;
1980+ if (!track->sub_packet_size || track->audiopk_size % track->sub_packet_size)
1981+ goto error;
19781982 sh_a->block_align = track->sub_packet_size;
19791983 } else if (!strcmp(track->codec_id, "A_REAL/SIPR")) {
19801984 sh_a->codec = "sipr";
@@ -1985,6 +1989,10 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track) · 4 unmodified lines
19851989 } else if (!strcmp(track->codec_id, "A_REAL/28_8")) {
19861990 sh_a->codec = "ra_288";
19871991 sh_a->bitrate = 3600 * 8;
1992+ if (track->sub_packet_h & 1)
1993+ goto error;
1994+ if (2 * track->audiopk_size != (int64_t)track->sub_packet_h * track->coded_framesize)
1995+ goto error;
19881996 sh_a->block_align = track->coded_framesize;
19891997 } else if (!strcmp(track->codec_id, "A_REAL/DNET")) {
19901998 sh_a->codec = "ac3";

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t