summaryrefslogtreecommitdiffstats
path: root/net/base/upload_data_stream.cc
diff options
context:
space:
mode:
authorvandebo@chromium.org <vandebo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-03-19 22:01:59 +0000
committervandebo@chromium.org <vandebo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-03-19 22:01:59 +0000
commit51a4c029715cf5bd6bd7659186ce7a368fbb40a7 (patch)
tree9e8eef378667d21a733fa73a8185079b6f7c26a0 /net/base/upload_data_stream.cc
parent0fecda62ce784048c032bbe31c7aeaeb8d5cdeab (diff)
downloadchromium_src-51a4c029715cf5bd6bd7659186ce7a368fbb40a7.zip
chromium_src-51a4c029715cf5bd6bd7659186ce7a368fbb40a7.tar.gz
chromium_src-51a4c029715cf5bd6bd7659186ce7a368fbb40a7.tar.bz2
Revert 42152 - Fix the case where the browser livelocks if we cannot open a file.
If one tries to upload a file that one doesn't have read access to, the browser livelocks. It tries to read from the file, gets nothing but spins forever because it knows that it hasn't finished reading. To address this, firstly we add a check at stat() time to make sure that we can read the file. However, this doesn't take care of the case where the access() call was incorrect, or the permissions have changed under us. In this case, we replace the missing file with NULs. BUG=30850 Review URL: http://codereview.chromium.org/541022 TBR=vandebo@chromium.org Review URL: http://codereview.chromium.org/1145004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@42154 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/base/upload_data_stream.cc')
-rw-r--r--net/base/upload_data_stream.cc50
1 files changed, 20 insertions, 30 deletions
diff --git a/net/base/upload_data_stream.cc b/net/base/upload_data_stream.cc
index 8c964f4..21f4ce8 100644
--- a/net/base/upload_data_stream.cc
+++ b/net/base/upload_data_stream.cc
@@ -10,7 +10,7 @@
namespace net {
-UploadDataStream::UploadDataStream(UploadData* data)
+UploadDataStream::UploadDataStream(const UploadData* data)
: data_(data),
buf_(new IOBuffer(kBufSize)),
buf_len_(0),
@@ -66,19 +66,18 @@ void UploadDataStream::FillBuf() {
} else {
DCHECK(element.type() == UploadData::TYPE_FILE);
- 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);
-
+ 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) {
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,18 +89,11 @@ void UploadDataStream::FillBuf() {
}
int rv = 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;
- }
-
+ 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) {
buf_len_ += rv;
next_element_remaining_ -= rv;
} else {
@@ -112,14 +104,12 @@ void UploadDataStream::FillBuf() {
if (advance_to_next_element) {
++next_element_;
next_element_offset_ = 0;
- next_element_stream_.Release();
+ next_element_stream_.Close();
}
}
- if (next_element_ == end && !buf_len_) {
+ if (next_element_ == end && !buf_len_)
eof_ = true;
- data_->CloseFiles();
- }
}
} // namespace net