History

dca: Check scale_sum.

Fixes a out of array read.

Michael Niedermayer committed 14 years ago

Commit 51db9a91 parent d6bc2731 file · +14 −2Browse files

Unified · Split

libavcodec/dca.c+14−2
@@ -717,15 +717,19 @@ static int dca_subframe_header(DCAContext *s, int base_channel, int block_index) · 716 unmodified lines
717717
718718 for (j = base_channel; j < s->prim_channels; j++) {
719719 const uint32_t *scale_table;
720+ unsigned int scale_max;
720721 int scale_sum;
721722
722723 memset(s->scale_factor[j], 0,
723724 s->subband_activity[j] * sizeof(s->scale_factor[0][0][0]) * 2);
724725
725− if (s->scalefactor_huffman[j] == 6)
726+ if (s->scalefactor_huffman[j] == 6) {
726727 scale_table = scale_factor_quant7;
727− else
728+ scale_max = 127;
729+ } else {
728730 scale_table = scale_factor_quant6;
731+ scale_max = 63;
732+ }
729733
730734 /* When huffman coded, only the difference is encoded */
731735 scale_sum = 0;
@@ -733,12 +737,20 @@ static int dca_subframe_header(DCAContext *s, int base_channel, int block_index) · 1 unmodified line
733737 for (k = 0; k < s->subband_activity[j]; k++) {
734738 if (k >= s->vq_start_subband[j] || s->bitalloc[j][k] > 0) {
735739 scale_sum = get_scale(&s->gb, s->scalefactor_huffman[j], scale_sum);
740+ if (scale_sum > scale_max) {
741+ av_log(s->avctx, AV_LOG_ERROR, "scale_sum out of range\n");
742+ return AVERROR_INVALIDDATA;
743+ }
736744 s->scale_factor[j][k][0] = scale_table[scale_sum];
737745 }
738746
739747 if (k < s->vq_start_subband[j] && s->transition_mode[j][k]) {
740748 /* Get second scale factor */
741749 scale_sum = get_scale(&s->gb, s->scalefactor_huffman[j], scale_sum);
750+ if (scale_sum > scale_max) {
751+ av_log(s->avctx, AV_LOG_ERROR, "scale_sum out of range\n");
752+ return AVERROR_INVALIDDATA;
753+ }
742754 s->scale_factor[j][k][1] = scale_table[scale_sum];
743755 }
744756 }

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