[vlc-commits] packetizer: mpeg4audio: reject truncated data
Francois Cartegnie
git at videolan.org
Wed Jun 10 17:44:46 CEST 2020
vlc/vlc-3.0 | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Wed Jun 10 16:29:46 2020 +0200| [da38519fb81dff9141ae2ab37118efc49485fd77] | committer: Francois Cartegnie
packetizer: mpeg4audio: reject truncated data
(cherry picked from commit 4eb7d1c4c63346f020883f5c9d52437e2df45a3a)
> http://git.videolan.org/gitweb.cgi/vlc/vlc-3.0.git/?a=commit;h=da38519fb81dff9141ae2ab37118efc49485fd77
---
modules/packetizer/mpeg4audio.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/modules/packetizer/mpeg4audio.c b/modules/packetizer/mpeg4audio.c
index b3a12ab2e9..81d921cc93 100644
--- a/modules/packetizer/mpeg4audio.c
+++ b/modules/packetizer/mpeg4audio.c
@@ -712,11 +712,16 @@ static int LatmReadStreamMuxConfiguration(latm_mux_t *m, bs_t *s)
if (i_mux_version == 1)
LatmGetValue(s); /* taraBufferFullness */
+ if(bs_remain(s) < 11)
+ return -1;
+
m->b_same_time_framing = bs_read1(s);
m->i_sub_frames = 1 + bs_read(s, 6);
m->i_programs = 1 + bs_read(s, 4);
for (int i_program = 0; i_program < m->i_programs; i_program++) {
+ if(bs_remain(s) < 3)
+ return -1;
m->pi_layers[i_program] = 1+bs_read(s, 3);
for (int i_layer = 0; i_layer < m->pi_layers[i_program]; i_layer++) {
@@ -775,6 +780,9 @@ static int LatmReadStreamMuxConfiguration(latm_mux_t *m, bs_t *s)
}
}
+ if(bs_remain(s) < 2)
+ return -1;
+
/* other data */
if (bs_read1(s)) {
if (i_mux_version == 1)
@@ -852,6 +860,9 @@ static int LOASParse(decoder_t *p_dec, uint8_t *p_buffer, int i_buffer)
else return 0;
}
+ if(bs_remain(&s) == 0 && i_buffer)
+ goto truncated;
+
/* FIXME do we need to split the subframe into independent packet ? */
if (p_sys->latm.i_sub_frames > 1)
msg_Err(p_dec, "latm sub frames not yet supported, please send a sample");
@@ -895,6 +906,9 @@ static int LOASParse(decoder_t *p_dec, uint8_t *p_buffer, int i_buffer)
if (pi_payload[i_program][i_layer] <= 0)
continue;
+ if(pi_payload[i_program][i_layer] > (bs_remain(&s) >> 3))
+ goto truncated;
+
/* FIXME that's slow (and a bit ugly to write in place) */
for (int i = 0; i < pi_payload[i_program][i_layer]; i++) {
if (i_accumulated >= i_buffer)
@@ -959,6 +973,10 @@ static int LOASParse(decoder_t *p_dec, uint8_t *p_buffer, int i_buffer)
bs_align(&s);
return i_accumulated;
+
+truncated:
+ msg_Warn(p_dec,"Truncated LAOS packet. Wrong format ?");
+ return 0;
}
/*****************************************************************************
More information about the vlc-commits
mailing list