| Index: crypto/hkdf.cc
|
| diff --git a/crypto/hkdf.cc b/crypto/hkdf.cc
|
| index e621bcb45b0818d64bce70893ba8308f39bca168..48babe25515acd8367d14ea888a7194e71c20ea3 100644
|
| --- a/crypto/hkdf.cc
|
| +++ b/crypto/hkdf.cc
|
| @@ -72,17 +72,25 @@ HKDF::HKDF(const base::StringPiece& secret,
|
| }
|
|
|
| size_t j = 0;
|
| - client_write_key_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]),
|
| - key_bytes_to_generate);
|
| - j += key_bytes_to_generate;
|
| - server_write_key_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]),
|
| - key_bytes_to_generate);
|
| - j += key_bytes_to_generate;
|
| - client_write_iv_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]),
|
| - iv_bytes_to_generate);
|
| - j += iv_bytes_to_generate;
|
| - server_write_iv_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]),
|
| - iv_bytes_to_generate);
|
| + // On Windows, when the size of output_ is zero, dereference of 0'th element
|
| + // results in a crash. C++11 solves this problem by adding a data() getter
|
| + // method to std::vector.
|
| + if (key_bytes_to_generate > 0) {
|
| + client_write_key_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]),
|
| + key_bytes_to_generate);
|
| + j += key_bytes_to_generate;
|
| + server_write_key_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]),
|
| + key_bytes_to_generate);
|
| + j += key_bytes_to_generate;
|
| + }
|
| +
|
| + if (iv_bytes_to_generate > 0) {
|
| + client_write_iv_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]),
|
| + iv_bytes_to_generate);
|
| + j += iv_bytes_to_generate;
|
| + server_write_iv_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]),
|
| + iv_bytes_to_generate);
|
| + }
|
| }
|
|
|
| HKDF::~HKDF() {
|
|
|