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

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: Created 10 years, 11 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
« net/base/upload_data.cc ('K') | « 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 d22929abbab1dd452b2d7de47fcfe706c252f04e..83fceddc6b6335f4ac72e369df79bcd79fc2ed82 100644
--- a/net/base/upload_data_stream.cc
+++ b/net/base/upload_data_stream.cc
@@ -18,7 +18,8 @@ UploadDataStream::UploadDataStream(const UploadData* data)
next_element_offset_(0),
next_element_remaining_(0),
total_size_(data->GetContentLength()),
- current_position_(0) {
+ current_position_(0),
+ file_failed_to_open_(false) {
FillBuf();
}
@@ -65,7 +66,7 @@ void UploadDataStream::FillBuf() {
} else {
DCHECK(element.type() == UploadData::TYPE_FILE);
- if (!next_element_stream_.IsOpen()) {
+ if (!file_failed_to_open_ && !next_element_stream_.IsOpen()) {
int flags = base::PLATFORM_FILE_OPEN |
base::PLATFORM_FILE_READ;
int rv = next_element_stream_.Open(element.file_path(), flags);
@@ -76,6 +77,15 @@ void UploadDataStream::FillBuf() {
<< "\" for reading: " << rv;
next_element_remaining_ = 0; // Default to reading nothing.
+
+ // If a file is visible to us but not readable then, at this point,
wtc 2010/01/12 19:51:02 What does "visible but not readable" mean?
agl 2010/01/25 14:14:09 For example, /etc/shadow is visible (you can ls -l
wtc 2010/01/25 20:07:11 Got it. Thanks for the explanation. How about "v
+ // we'll have assumed a non-zero length, but we'll have just failed to
+ // open the file. In this case we just fill in NULs.
+ if (rv != OK && element.expected_length() > 0) {
+ file_failed_to_open_ = true;
+ next_element_remaining_ = element.expected_length();
+ }
+
if (rv == OK) {
uint64 offset = element.file_range_offset();
if (offset && next_element_stream_.Seek(FROM_BEGIN, offset) < 0) {
@@ -90,9 +100,15 @@ 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 (count > 0 && file_failed_to_open_) {
+ memset(buf_->data() + buf_len_, 0, count);
wtc 2010/01/12 19:51:02 Please add a comment here to note that we're filli
agl 2010/01/25 14:14:09 Done.
+ buf_len_ += count;
+ next_element_remaining_ -= count;
+ } else if (count > 0 &&
+ (rv = next_element_stream_.Read(buf_->data() + buf_len_,
+ count, NULL)) > 0) {
+ // TODO(darin): The file might have been truncated between when we
+ // asked for its size and now.
buf_len_ += rv;
next_element_remaining_ -= rv;
} else {
@@ -102,6 +118,7 @@ void UploadDataStream::FillBuf() {
if (advance_to_next_element) {
++next_element_;
+ file_failed_to_open_ = false;
next_element_offset_ = 0;
next_element_stream_.Close();
}
« net/base/upload_data.cc ('K') | « net/base/upload_data_stream.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698