Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(782)

Side by Side Diff: source/patched-ffmpeg/libavcodec/vorbisdec.c

Issue 8413019: Fix vorbis decoder bug. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/ffmpeg/
Patch Set: Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /** 1 /**
2 * @file 2 * @file
3 * Vorbis I decoder 3 * Vorbis I decoder
4 * @author Denes Balatoni ( dbalatoni programozo hu ) 4 * @author Denes Balatoni ( dbalatoni programozo hu )
5 * 5 *
6 * This file is part of FFmpeg. 6 * This file is part of FFmpeg.
7 * 7 *
8 * FFmpeg is free software; you can redistribute it and/or 8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public 9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
(...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after
653 653
654 res_setup->type = get_bits(gb, 16); 654 res_setup->type = get_bits(gb, 16);
655 655
656 av_dlog(NULL, " %u. residue type %d\n", i, res_setup->type); 656 av_dlog(NULL, " %u. residue type %d\n", i, res_setup->type);
657 657
658 res_setup->begin = get_bits(gb, 24); 658 res_setup->begin = get_bits(gb, 24);
659 res_setup->end = get_bits(gb, 24); 659 res_setup->end = get_bits(gb, 24);
660 res_setup->partition_size = get_bits(gb, 24) + 1; 660 res_setup->partition_size = get_bits(gb, 24) + 1;
661 /* Validations to prevent a buffer overflow later. */ 661 /* Validations to prevent a buffer overflow later. */
662 if (res_setup->begin>res_setup->end || 662 if (res_setup->begin>res_setup->end ||
663 res_setup->end > vc->avccontext->channels * vc->blocksize[1] / 2 || 663 res_setup->end > (res_setup->type == 2 ? vc->avccontext->channels : 1) * vc->blocksize[1] / 2 ||
rbultje1 2011/10/27 23:36:13 I'm clearly not knowledgeable enough to understand
664 (res_setup->end-res_setup->begin) / res_setup->partition_size > V_MA X_PARTITIONS) { 664 (res_setup->end-res_setup->begin) / res_setup->partition_size > V_MA X_PARTITIONS) {
665 av_log(vc->avccontext, AV_LOG_ERROR, 665 av_log(vc->avccontext, AV_LOG_ERROR,
666 "partition out of bounds: type, begin, end, size, blocksize: %"PRIu16", %"PRIu32", %"PRIu32", %u, %"PRIu32"\n", 666 "partition out of bounds: type, begin, end, size, blocksize: %"PRIu16", %"PRIu32", %"PRIu32", %u, %"PRIu32"\n",
667 res_setup->type, res_setup->begin, res_setup->end, 667 res_setup->type, res_setup->begin, res_setup->end,
668 res_setup->partition_size, vc->blocksize[1] / 2); 668 res_setup->partition_size, vc->blocksize[1] / 2);
669 return -1; 669 return -1;
670 } 670 }
671 671
672 res_setup->classifications = get_bits(gb, 6) + 1; 672 res_setup->classifications = get_bits(gb, 6) + 1;
673 GET_VALIDATED_INDEX(res_setup->classbook, 8, vc->codebook_count) 673 GET_VALIDATED_INDEX(res_setup->classbook, 8, vc->codebook_count)
(...skipping 787 matching lines...) Expand 10 before | Expand all | Expand 10 after
1461 unsigned mode_number, blockflag, blocksize; 1461 unsigned mode_number, blockflag, blocksize;
1462 int i, j; 1462 int i, j;
1463 uint8_t no_residue[255]; 1463 uint8_t no_residue[255];
1464 uint8_t do_not_decode[255]; 1464 uint8_t do_not_decode[255];
1465 vorbis_mapping *mapping; 1465 vorbis_mapping *mapping;
1466 float *ch_res_ptr = vc->channel_residues; 1466 float *ch_res_ptr = vc->channel_residues;
1467 float *ch_floor_ptr = vc->channel_floors; 1467 float *ch_floor_ptr = vc->channel_floors;
1468 uint8_t res_chan[255]; 1468 uint8_t res_chan[255];
1469 unsigned res_num = 0; 1469 unsigned res_num = 0;
1470 int retlen = 0; 1470 int retlen = 0;
1471 int ch_left = vc->audio_channels;
1471 1472
1472 if (get_bits1(gb)) { 1473 if (get_bits1(gb)) {
1473 av_log(vc->avccontext, AV_LOG_ERROR, "Not a Vorbis I audio packet.\n"); 1474 av_log(vc->avccontext, AV_LOG_ERROR, "Not a Vorbis I audio packet.\n");
1474 return -1; // packet type not audio 1475 return -1; // packet type not audio
1475 } 1476 }
1476 1477
1477 if (vc->mode_count == 1) { 1478 if (vc->mode_count == 1) {
1478 mode_number = 0; 1479 mode_number = 0;
1479 } else { 1480 } else {
1480 GET_VALIDATED_INDEX(mode_number, ilog(vc->mode_count-1), vc->mode_count) 1481 GET_VALIDATED_INDEX(mode_number, ilog(vc->mode_count-1), vc->mode_count)
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1535 if (no_residue[j]) { 1536 if (no_residue[j]) {
1536 do_not_decode[ch] = 1; 1537 do_not_decode[ch] = 1;
1537 } else { 1538 } else {
1538 do_not_decode[ch] = 0; 1539 do_not_decode[ch] = 0;
1539 } 1540 }
1540 ++ch; 1541 ++ch;
1541 ++res_num; 1542 ++res_num;
1542 } 1543 }
1543 } 1544 }
1544 residue = &vc->residues[mapping->submap_residue[i]]; 1545 residue = &vc->residues[mapping->submap_residue[i]];
1546 if (ch_left < ch) {
1547 av_log(vc->avccontext, AV_LOG_ERROR, "Too many channels in vorbis_fl oor_decode.\n");
1548 return -1;
1549 }
1545 vorbis_residue_decode(vc, residue, ch, do_not_decode, ch_res_ptr, blocks ize/2); 1550 vorbis_residue_decode(vc, residue, ch, do_not_decode, ch_res_ptr, blocks ize/2);
1546 1551
1547 ch_res_ptr += ch * blocksize / 2; 1552 ch_res_ptr += ch * blocksize / 2;
1553 ch_left -= ch;
1548 } 1554 }
1549 1555
1550 // Inverse coupling 1556 // Inverse coupling
1551 1557
1552 for (i = mapping->coupling_steps - 1; i >= 0; --i) { //warning: i has to be signed 1558 for (i = mapping->coupling_steps - 1; i >= 0; --i) { //warning: i has to be signed
1553 float *mag, *ang; 1559 float *mag, *ang;
1554 1560
1555 mag = vc->channel_residues+res_chan[mapping->magnitude[i]] * blocksize / 2; 1561 mag = vc->channel_residues+res_chan[mapping->magnitude[i]] * blocksize / 2;
1556 ang = vc->channel_residues+res_chan[mapping->angle[i]] * blocksize / 2; 1562 ang = vc->channel_residues+res_chan[mapping->angle[i]] * blocksize / 2;
1557 vc->dsp.vorbis_inverse_coupling(mag, ang, blocksize / 2); 1563 vc->dsp.vorbis_inverse_coupling(mag, ang, blocksize / 2);
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
1674 NULL, 1680 NULL,
1675 vorbis_decode_close, 1681 vorbis_decode_close,
1676 vorbis_decode_frame, 1682 vorbis_decode_frame,
1677 .long_name = NULL_IF_CONFIG_SMALL("Vorbis"), 1683 .long_name = NULL_IF_CONFIG_SMALL("Vorbis"),
1678 .channel_layouts = ff_vorbis_channel_layouts, 1684 .channel_layouts = ff_vorbis_channel_layouts,
1679 .sample_fmts = (const enum AVSampleFormat[]) { 1685 .sample_fmts = (const enum AVSampleFormat[]) {
1680 AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE 1686 AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE
1681 }, 1687 },
1682 }; 1688 };
1683 1689
OLDNEW
« README.chromium ('K') | « patches/to_upstream/48_vorbis_residue_buffer.patch ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698