Chromium Code Reviews| Index: media/webm/webm_cluster_parser.cc |
| diff --git a/media/webm/webm_cluster_parser.cc b/media/webm/webm_cluster_parser.cc |
| index fb1c69b874739719169085cbdcf4278862e95a61..512127517089b2df511b2a64f4cd43ecadcb42cf 100644 |
| --- a/media/webm/webm_cluster_parser.cc |
| +++ b/media/webm/webm_cluster_parser.cc |
| @@ -7,7 +7,6 @@ |
| #include <vector> |
| #include "base/logging.h" |
| -#include "base/sys_byteorder.h" |
| #include "media/base/data_buffer.h" |
| #include "media/base/decrypt_config.h" |
| #include "media/webm/webm_constants.h" |
| @@ -17,9 +16,9 @@ namespace media { |
| // Generates a 16 byte CTR counter block. The CTR counter block format is a |
| // CTR IV appended with a CTR block counter. |iv| is an 8 byte CTR IV. |
| // Returns a string of kDecryptionKeySize bytes. |
| -static std::string GenerateCounterBlock(uint64 iv) { |
| - std::string counter_block(reinterpret_cast<char*>(&iv), sizeof(iv)); |
| - counter_block.append(DecryptConfig::kDecryptionKeySize - sizeof(iv), 0); |
| +static std::string GenerateCounterBlock(const uint8* iv, size_t iv_size) { |
| + std::string counter_block(DecryptConfig::kDecryptionKeySize, 0); |
| + memcpy(&counter_block[0], reinterpret_cast<const char*>(iv), iv_size); |
|
xhwang
2012/10/15 16:39:00
The &foo[0] trick only works for vector, whose int
fgalligan1
2012/10/15 20:01:07
Done.
|
| return counter_block; |
| } |
| @@ -185,6 +184,7 @@ bool WebMClusterParser::OnBlock(int track_num, int timecode, |
| int block_duration, |
| int flags, |
| const uint8* data, int size) { |
| + DCHECK_GE(size, 0); |
| if (cluster_timecode_ == -1) { |
| DVLOG(1) << "Got a block before cluster timecode."; |
| return false; |
| @@ -228,6 +228,10 @@ bool WebMClusterParser::OnBlock(int track_num, int timecode, |
| // encrypted WebM request for comments specification is here |
| // http://wiki.webmproject.org/encryption/webm-encryption-rfc |
| if (!encryption_key_id.empty()) { |
| + if (static_cast<size_t>(size) < sizeof(uint8)) { |
| + DVLOG(1) << "Got a block from an encrypted stream with no data."; |
| + return false; |
| + } |
| uint8 signal_byte = data[0]; |
| int data_offset = sizeof(signal_byte); |
| @@ -237,10 +241,12 @@ bool WebMClusterParser::OnBlock(int track_num, int timecode, |
| std::string counter_block; |
| if (signal_byte & kWebMFlagEncryptedFrame) { |
| - uint64 network_iv; |
| - memcpy(&network_iv, data + data_offset, sizeof(network_iv)); |
| - data_offset += sizeof(network_iv); |
| - counter_block = GenerateCounterBlock(base::NetToHost64(network_iv)); |
| + if (static_cast<size_t>(size) < sizeof(signal_byte) + kWebMIvSize) { |
|
xhwang
2012/10/15 16:39:00
Both sizeof(signal_byte) and sizeof(uint8) on line
fgalligan1
2012/10/15 20:01:07
Done.
|
| + DVLOG(1) << "Got an encrypted block with not enough data " << size; |
| + return false; |
| + } |
| + counter_block = GenerateCounterBlock(data + data_offset, kWebMIvSize); |
| + data_offset += kWebMIvSize; |
| } |
| // TODO(fgalligan): Revisit if DecryptConfig needs to be set on unencrypted |