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() { |