Commit d3c6f1b7 authored by David Benjamin's avatar David Benjamin Committed by Commit Bot

Fix missing bounds check in MerkleIntegritySourceStream.

Also use base::StringPiece rather than a std::string reference. It
avoids some unnecessary copies in the substrings.

Bug: 814591
Change-Id: I7a1a0387b09038f7e084b2baf7b67716c729710a
Reviewed-on: https://chromium-review.googlesource.com/953744Reviewed-by: default avatarKinuko Yasuda <kinuko@chromium.org>
Commit-Queue: David Benjamin <davidben@chromium.org>
Cr-Commit-Position: refs/heads/master@{#541652}
parent 2ce8b7e0
...@@ -17,19 +17,20 @@ namespace { ...@@ -17,19 +17,20 @@ namespace {
constexpr uint64_t kMaxRecordSize = 5 * 1024 * 1024; constexpr uint64_t kMaxRecordSize = 5 * 1024 * 1024;
constexpr char kMiSha256Header[] = "mi-sha256="; constexpr char kMiSha256Header[] = "mi-sha256=";
constexpr int kMiSha256HeaderLength = sizeof(kMiSha256Header) - 1; constexpr size_t kMiSha256HeaderLength = sizeof(kMiSha256Header) - 1;
} // namespace } // namespace
MerkleIntegritySourceStream::MerkleIntegritySourceStream( MerkleIntegritySourceStream::MerkleIntegritySourceStream(
const std::string& mi_header_value, base::StringPiece mi_header_value,
std::unique_ptr<SourceStream> upstream) std::unique_ptr<SourceStream> upstream)
// TODO(ksakamoto): Use appropriate SourceType. // TODO(ksakamoto): Use appropriate SourceType.
: net::FilterSourceStream(SourceStream::TYPE_NONE, std::move(upstream)), : net::FilterSourceStream(SourceStream::TYPE_NONE, std::move(upstream)),
record_size_(0), record_size_(0),
failed_(false) { failed_(false) {
// TODO(ksakamoto): Support quoted parameter value. // TODO(ksakamoto): Support quoted parameter value.
if (mi_header_value.substr(0, kMiSha256HeaderLength) != kMiSha256Header || if (mi_header_value.size() < kMiSha256HeaderLength ||
mi_header_value.substr(0, kMiSha256HeaderLength) != kMiSha256Header ||
!base::Base64UrlDecode(mi_header_value.substr(kMiSha256HeaderLength), !base::Base64UrlDecode(mi_header_value.substr(kMiSha256HeaderLength),
base::Base64UrlDecodePolicy::DISALLOW_PADDING, base::Base64UrlDecodePolicy::DISALLOW_PADDING,
&next_proof_) || &next_proof_) ||
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <string> #include <string>
#include "base/macros.h" #include "base/macros.h"
#include "base/strings/string_piece.h"
#include "content/common/content_export.h" #include "content/common/content_export.h"
#include "net/filter/filter_source_stream.h" #include "net/filter/filter_source_stream.h"
...@@ -21,7 +22,7 @@ namespace content { ...@@ -21,7 +22,7 @@ namespace content {
class CONTENT_EXPORT MerkleIntegritySourceStream class CONTENT_EXPORT MerkleIntegritySourceStream
: public net::FilterSourceStream { : public net::FilterSourceStream {
public: public:
MerkleIntegritySourceStream(const std::string& mi_header_value, MerkleIntegritySourceStream(base::StringPiece mi_header_value,
std::unique_ptr<SourceStream> upstream); std::unique_ptr<SourceStream> upstream);
~MerkleIntegritySourceStream() override; ~MerkleIntegritySourceStream() override;
......
...@@ -161,6 +161,14 @@ TEST_P(MerkleIntegritySourceStreamTest, EmptyStream) { ...@@ -161,6 +161,14 @@ TEST_P(MerkleIntegritySourceStreamTest, EmptyStream) {
EXPECT_EQ(net::ERR_CONTENT_DECODING_FAILED, result); EXPECT_EQ(net::ERR_CONTENT_DECODING_FAILED, result);
} }
TEST_P(MerkleIntegritySourceStreamTest, TooShortMIHeader) {
Init("z");
source()->AddReadResult(nullptr, 0, net::OK, GetParam().mode);
std::string actual_output;
int result = ReadStream(&actual_output);
EXPECT_EQ(net::ERR_CONTENT_DECODING_FAILED, result);
}
TEST_P(MerkleIntegritySourceStreamTest, MalformedMIHeader) { TEST_P(MerkleIntegritySourceStreamTest, MalformedMIHeader) {
Init("invalid-MI-header-value"); Init("invalid-MI-header-value");
source()->AddReadResult(nullptr, 0, net::OK, GetParam().mode); source()->AddReadResult(nullptr, 0, net::OK, GetParam().mode);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment