Index: apps/codecs/libffmpegFLAC/decoder.c =================================================================== --- apps/codecs/libffmpegFLAC/decoder.c (revision 29613) +++ apps/codecs/libffmpegFLAC/decoder.c (working copy) @@ -184,6 +184,8 @@ for (i = 0; i < pred_order; i++) { decoded[i] = get_sbits(&s->gb, s->curr_bps); + if(decoded[i]<-(2<bps) || decoded[i]>2<bps) + return -19; } if (decode_residuals(s, decoded, pred_order) < 0) @@ -200,19 +202,35 @@ break; case 1: for (i = pred_order; i < blocksize; i++) + { decoded[i] = a += decoded[i]; + if(decoded[i]<-(2<bps) || decoded[i]>2<bps) + return -19; + } break; case 2: for (i = pred_order; i < blocksize; i++) + { decoded[i] = a += b += decoded[i]; + if(decoded[i]<-(2<bps) || decoded[i]>2<bps) + return -19; + } break; case 3: for (i = pred_order; i < blocksize; i++) + { decoded[i] = a += b += c += decoded[i]; + if(decoded[i]<-(2<bps) || decoded[i]>2<bps) + return -19; + } break; case 4: for (i = pred_order; i < blocksize; i++) + { decoded[i] = a += b += c += d += decoded[i]; + if(decoded[i]<-(2<bps) || decoded[i]>2<bps) + return -19; + } break; default: return -5; @@ -233,6 +251,8 @@ for (i = 0; i < pred_order; i++) { decoded[i] = get_sbits(&s->gb, s->curr_bps); + if(decoded[i]<-(2<bps-1) || decoded[i]>2<bps-1) + return -19; } coeff_prec = get_bits(&s->gb, 4) + 1; @@ -272,6 +292,8 @@ for (j = 0; j < pred_order; j++) sum += coeffs[j] * decoded[i-j-1]; decoded[i] += sum >> qlevel; + if(decoded[i]<-(2<bps-1) || decoded[i]>2<bps-1) + return -19; } #endif } else { @@ -287,6 +309,8 @@ for (j = 0; j < pred_order; j++) wsum += (int64_t)coeffs[j] * (int64_t)decoded[i-j-1]; decoded[i] += wsum >> qlevel; + if(decoded[i]<-(2<bps-1) || decoded[i]>2<bps-1) + return -19; } #endif } @@ -344,13 +368,21 @@ //fprintf(stderr,"coding type: constant\n"); tmp = get_sbits(&s->gb, s->curr_bps); for (i = 0; i < s->blocksize; i++) + { decoded[i] = tmp; + if(decoded[i]<-(2<bps) || decoded[i]>2<bps) + return -19; + } } else if (type == 1) { //fprintf(stderr,"coding type: verbatim\n"); for (i = 0; i < s->blocksize; i++) + { decoded[i] = get_sbits(&s->gb, s->curr_bps); + if(decoded[i]<-(2<bps) || decoded[i]>2<bps) + return -19; + } } else if ((type >= 8) && (type <= 12)) {