summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkenobi <kenobi@chromium.org>2015-02-24 22:24:38 -0800
committerCommit bot <commit-bot@chromium.org>2015-02-25 06:25:02 +0000
commit78bb0f4b1c59602c67281bcbafb96eae90367040 (patch)
treebdee3efa32cd0f2c44ae769210d8890ec75afb12
parent6baff46f520e31ff92669890207be5708064d16e (diff)
downloadchromium_src-78bb0f4b1c59602c67281bcbafb96eae90367040.zip
chromium_src-78bb0f4b1c59602c67281bcbafb96eae90367040.tar.gz
chromium_src-78bb0f4b1c59602c67281bcbafb96eae90367040.tar.bz2
Files.app: Fix a bug in content hash computation.
Break a circular reference which was causing FileManagerPrivateComputeChecksumFunction to never be cleaned up. This, in turn, was holding open one file stream for every file for which a content checksum was requested. BUG=458624 Review URL: https://codereview.chromium.org/950423003 Cr-Commit-Position: refs/heads/master@{#317997}
-rw-r--r--chrome/browser/drive/drive_api_util.cc30
-rw-r--r--chrome/browser/drive/drive_api_util.h5
2 files changed, 18 insertions, 17 deletions
diff --git a/chrome/browser/drive/drive_api_util.cc b/chrome/browser/drive/drive_api_util.cc
index 3d7e1b9..8dc6462 100644
--- a/chrome/browser/drive/drive_api_util.cc
+++ b/chrome/browser/drive/drive_api_util.cc
@@ -177,40 +177,42 @@ void FileStreamMd5Digester::GetMd5Digest(
scoped_ptr<storage::FileStreamReader> stream_reader,
const ResultCallback& callback) {
reader_ = stream_reader.Pass();
- callback_ = callback;
base::MD5Init(&md5_context_);
// Start the read/hash.
- ReadNextChunk();
+ ReadNextChunk(callback);
}
-void FileStreamMd5Digester::ReadNextChunk() {
- const int result = reader_->Read(
- buffer_.get(), kMd5DigestBufferSize,
- base::Bind(&FileStreamMd5Digester::OnChunkRead, base::Unretained(this)));
+void FileStreamMd5Digester::ReadNextChunk(const ResultCallback& callback) {
+ const int result =
+ reader_->Read(buffer_.get(), kMd5DigestBufferSize,
+ base::Bind(&FileStreamMd5Digester::OnChunkRead,
+ base::Unretained(this), callback));
if (result != net::ERR_IO_PENDING)
- OnChunkRead(result);
+ OnChunkRead(callback, result);
}
-void FileStreamMd5Digester::OnChunkRead(int bytesRead) {
- if (bytesRead < 0) {
+void FileStreamMd5Digester::OnChunkRead(const ResultCallback& callback,
+ int bytes_read) {
+ if (bytes_read < 0) {
// Error - just return empty string.
- callback_.Run("");
+ callback.Run("");
return;
- } else if (bytesRead == 0) {
+ } else if (bytes_read == 0) {
// EOF.
base::MD5Digest digest;
base::MD5Final(&digest, &md5_context_);
std::string result = MD5DigestToBase16(digest);
- callback_.Run(result);
+ callback.Run(result);
return;
}
// Read data and digest it.
- base::MD5Update(&md5_context_, base::StringPiece(buffer_->data(), bytesRead));
+ base::MD5Update(&md5_context_,
+ base::StringPiece(buffer_->data(), bytes_read));
// Kick off the next read.
- ReadNextChunk();
+ ReadNextChunk(callback);
}
std::string GetHostedDocumentExtension(const std::string& mime_type) {
diff --git a/chrome/browser/drive/drive_api_util.h b/chrome/browser/drive/drive_api_util.h
index def1199..3dbdfb7 100644
--- a/chrome/browser/drive/drive_api_util.h
+++ b/chrome/browser/drive/drive_api_util.h
@@ -92,13 +92,12 @@ class FileStreamMd5Digester {
private:
// Kicks off a read of the next chunk from the stream.
- void ReadNextChunk();
+ void ReadNextChunk(const ResultCallback& callback);
// Handles the incoming chunk of data from a stream read.
- void OnChunkRead(int result);
+ void OnChunkRead(const ResultCallback& callback, int bytes_read);
// Maximum chunk size for read operations.
scoped_ptr<storage::FileStreamReader> reader_;
- ResultCallback callback_;
scoped_refptr<net::IOBuffer> buffer_;
base::MD5Context md5_context_;