Commit f7205b05 authored by superdump's avatar superdump

Validate pulse position and error out if an invalid position is encountered.

Patch by Alex Converse (alex converse gmail com)


git-svn-id: file:///var/local/repositories/ffmpeg/trunk@15340 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent 57e09361
...@@ -594,16 +594,24 @@ static int decode_scalefactors(AACContext * ac, float sf[120], GetBitContext * g ...@@ -594,16 +594,24 @@ static int decode_scalefactors(AACContext * ac, float sf[120], GetBitContext * g
/** /**
* Decode pulse data; reference: table 4.7. * Decode pulse data; reference: table 4.7.
*/ */
static void decode_pulses(Pulse * pulse, GetBitContext * gb, const uint16_t * swb_offset) { static int decode_pulses(Pulse * pulse, GetBitContext * gb, const uint16_t * swb_offset, int num_swb) {
int i; int i, pulse_swb;
pulse->num_pulse = get_bits(gb, 2) + 1; pulse->num_pulse = get_bits(gb, 2) + 1;
pulse->pos[0] = swb_offset[get_bits(gb, 6)]; pulse_swb = get_bits(gb, 6);
if (pulse_swb >= num_swb)
return -1;
pulse->pos[0] = swb_offset[pulse_swb];
pulse->pos[0] += get_bits(gb, 5); pulse->pos[0] += get_bits(gb, 5);
if (pulse->pos[0] > 1023)
return -1;
pulse->amp[0] = get_bits(gb, 4); pulse->amp[0] = get_bits(gb, 4);
for (i = 1; i < pulse->num_pulse; i++) { for (i = 1; i < pulse->num_pulse; i++) {
pulse->pos[i] = get_bits(gb, 5) + pulse->pos[i-1]; pulse->pos[i] = get_bits(gb, 5) + pulse->pos[i-1];
if (pulse->pos[i] > 1023)
return -1;
pulse->amp[i] = get_bits(gb, 4); pulse->amp[i] = get_bits(gb, 4);
} }
return 0;
} }
/** /**
...@@ -811,7 +819,10 @@ static int decode_ics(AACContext * ac, SingleChannelElement * sce, GetBitContext ...@@ -811,7 +819,10 @@ static int decode_ics(AACContext * ac, SingleChannelElement * sce, GetBitContext
av_log(ac->avccontext, AV_LOG_ERROR, "Pulse tool not allowed in eight short sequence.\n"); av_log(ac->avccontext, AV_LOG_ERROR, "Pulse tool not allowed in eight short sequence.\n");
return -1; return -1;
} }
decode_pulses(&pulse, gb, ics->swb_offset); if (decode_pulses(&pulse, gb, ics->swb_offset, ics->num_swb)) {
av_log(ac->avccontext, AV_LOG_ERROR, "Pulse data corrupt or invalid.\n");
return -1;
}
} }
if ((tns->present = get_bits1(gb)) && decode_tns(ac, tns, gb, ics)) if ((tns->present = get_bits1(gb)) && decode_tns(ac, tns, gb, ics))
return -1; return -1;
......
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