Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(174)

Unified Diff: net/base/upload_data_stream.cc

Issue 541022: Fix the case where the browser livelocks if we cannot open a file. (Closed)
Patch Set: Uploading checkpoint. This is known to cause all uploads on Windows to be zero bytes long. Created 10 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/base/upload_data_stream.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/base/upload_data_stream.cc
diff --git a/net/base/upload_data_stream.cc b/net/base/upload_data_stream.cc
index 221ef2899d8012b184401f088a9034532c34382a..9fca29ef267c0e14d8536c1dbcb9cb846e35c9eb 100644
--- a/net/base/upload_data_stream.cc
+++ b/net/base/upload_data_stream.cc
@@ -10,7 +10,7 @@
namespace net {
-UploadDataStream::UploadDataStream(const UploadData* data)
+UploadDataStream::UploadDataStream(UploadData* data)
: data_(data),
buf_(new IOBuffer(kBufSize)),
buf_len_(0),
@@ -67,18 +67,19 @@ void UploadDataStream::FillBuf() {
} else {
DCHECK(element.type() == UploadData::TYPE_FILE);
- if (!next_element_stream_.IsOpen()) {
- int flags = base::PLATFORM_FILE_OPEN |
- base::PLATFORM_FILE_READ;
- int rv = next_element_stream_.Open(element.file_path(), flags);
- // If the file does not exist, that's technically okay.. we'll just
- // upload an empty file. This is for consistency with Mozilla.
- DLOG_IF(WARNING, rv != OK) << "Failed to open \""
- << element.file_path().value()
- << "\" for reading: " << rv;
-
- next_element_remaining_ = 0; // Default to reading nothing.
- if (rv == OK) {
+ if (element.file_range_length() == 0) {
+ // If we failed to open the file, then the length is set to zero. The
+ // length used when calculating the POST size was also zero. This
+ // matches the behaviour of Mozilla.
+ next_element_remaining_ = 0;
+ } else {
+ if (!next_element_stream_.IsOpen()) {
+ // We ignore the return value of Open becuase we've already checked
+ // !IsOpen, above.
+ int flags = base::PLATFORM_FILE_READ |
+ base::PLATFORM_FILE_WRITE;
+ next_element_stream_.Open(element.platform_file(), flags);
+
uint64 offset = element.file_range_offset();
if (offset && next_element_stream_.Seek(FROM_BEGIN, offset) < 0) {
DLOG(WARNING) << "Failed to seek \"" << element.file_path().value()
@@ -90,11 +91,18 @@ void UploadDataStream::FillBuf() {
}
int rv = 0;
- int count = static_cast<int>(std::min(
- static_cast<uint64>(size_remaining), next_element_remaining_));
- if (count > 0 &&
- (rv = next_element_stream_.Read(buf_->data() + buf_len_,
- count, NULL)) > 0) {
+ if (next_element_remaining_ > 0) {
+ int count =
+ static_cast<int>(std::min(next_element_remaining_,
+ static_cast<uint64>(size_remaining)));
+ rv = next_element_stream_.Read(buf_->data() + buf_len_, count, NULL);
+ if (rv < 1) {
+ // If the file was truncated between the time that we opened it and
+ // now, or if we got an error on reading, then we pad with NULs.
+ memset(buf_->data() + buf_len_, 0, count);
+ rv = count;
+ }
+
buf_len_ += rv;
next_element_remaining_ -= rv;
} else {
@@ -105,12 +113,14 @@ void UploadDataStream::FillBuf() {
if (advance_to_next_element) {
++next_element_;
next_element_offset_ = 0;
- next_element_stream_.Close();
+ next_element_stream_.Release();
}
}
- if (next_element_ == end && !buf_len_)
+ if (next_element_ == end && !buf_len_) {
eof_ = true;
+ data_->CloseFiles();
+ }
}
} // namespace net
« no previous file with comments | « net/base/upload_data_stream.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698