diff options
author | tomfinegan@chromium.org <tomfinegan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-14 02:35:37 +0000 |
---|---|---|
committer | tomfinegan@chromium.org <tomfinegan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-14 02:35:37 +0000 |
commit | 5b9d6c34051ad68bef7a859af2db8a7f60968277 (patch) | |
tree | 29e9036d6a192a3c789ce65716d34b62cc538490 | |
parent | 80b559c19958db9bdb36d993941670a1db809dd1 (diff) | |
download | chromium_src-5b9d6c34051ad68bef7a859af2db8a7f60968277.zip chromium_src-5b9d6c34051ad68bef7a859af2db8a7f60968277.tar.gz chromium_src-5b9d6c34051ad68bef7a859af2db8a7f60968277.tar.bz2 |
Fix crash in CdmWrapper::Decrypt when there are no sub samples.
When PP_EncryptedBlockInfo has a num_subsamples of 0,
CdmWrapper::Decrypt triggers a _DEBUG_ERROR in
c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\vector.
The Windows std::vector doesn't appear to like it much when you call
operator[] on empty vectors.
BUG=none
TEST=CdmWrapper::Decrypt does not crash on Windows when
PP_EncryptedBlockInfo has no sub samples.
Review URL: https://chromiumcodereview.appspot.com/10909199
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@156718 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | webkit/media/crypto/ppapi/cdm_wrapper.cc | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/webkit/media/crypto/ppapi/cdm_wrapper.cc b/webkit/media/crypto/ppapi/cdm_wrapper.cc index 8a8cb37..9098065 100644 --- a/webkit/media/crypto/ppapi/cdm_wrapper.cc +++ b/webkit/media/crypto/ppapi/cdm_wrapper.cc @@ -208,13 +208,20 @@ void CdmWrapper::Decrypt(pp::Buffer_Dev encrypted_buffer, input_buffer.checksum = encrypted_block_info.checksum; input_buffer.checksum_size = encrypted_block_info.checksum_size; input_buffer.num_subsamples = encrypted_block_info.num_subsamples; + std::vector<cdm::SubsampleEntry> subsamples; - for (uint32_t i = 0; i < encrypted_block_info.num_subsamples; ++i) { - subsamples.push_back(cdm::SubsampleEntry( - encrypted_block_info.subsamples[i].clear_bytes, - encrypted_block_info.subsamples[i].cipher_bytes)); + if (encrypted_block_info.num_subsamples > 0) { + subsamples.reserve(encrypted_block_info.num_subsamples); + + for (uint32_t i = 0; i < encrypted_block_info.num_subsamples; ++i) { + subsamples.push_back(cdm::SubsampleEntry( + encrypted_block_info.subsamples[i].clear_bytes, + encrypted_block_info.subsamples[i].cipher_bytes)); + } + + input_buffer.subsamples = &subsamples[0]; } - input_buffer.subsamples = &subsamples[0]; + input_buffer.timestamp = encrypted_block_info.tracking_info.timestamp; cdm::OutputBuffer output_buffer; |