diff options
author | kenobi <kenobi@chromium.org> | 2015-02-24 22:24:38 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-02-25 06:25:02 +0000 |
commit | 78bb0f4b1c59602c67281bcbafb96eae90367040 (patch) | |
tree | bdee3efa32cd0f2c44ae769210d8890ec75afb12 | |
parent | 6baff46f520e31ff92669890207be5708064d16e (diff) | |
download | chromium_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.cc | 30 | ||||
-rw-r--r-- | chrome/browser/drive/drive_api_util.h | 5 |
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_; |