summaryrefslogtreecommitdiffstats
path: root/net/base/upload_data.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.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.cc')
-rw-r--r--net/base/upload_data.cc72
1 files changed, 16 insertions, 56 deletions
diff --git a/net/base/upload_data.cc b/net/base/upload_data.cc
index a23b25e..0496873 100644
--- a/net/base/upload_data.cc
+++ b/net/base/upload_data.cc
@@ -5,7 +5,6 @@
#include "net/base/upload_data.h"
#include "base/file_util.h"
-#include "base/platform_file.h"
#include "base/logging.h"
namespace net {
@@ -18,67 +17,28 @@ uint64 UploadData::GetContentLength() const {
return len;
}
-void UploadData::CloseFiles() {
- std::vector<Element>::iterator it = elements_.begin();
- for (; it != elements_.end(); ++it) {
- if (it->type() == TYPE_FILE)
- it->Close();
- }
-}
-
-base::PlatformFile UploadData::Element::platform_file() const {
- DCHECK(type_ == TYPE_FILE) << "platform_file on non-file Element";
-
- return file_;
-}
-
-void UploadData::Element::Close() {
- DCHECK(type_ == TYPE_FILE) << "Close on non-file Element";
-
- if (file_ != base::kInvalidPlatformFileValue)
- base::ClosePlatformFile(file_);
- file_ = base::kInvalidPlatformFileValue;
-}
-
-void UploadData::Element::SetToFilePathRange(const FilePath& path,
- uint64 offset,
- uint64 length) {
- type_ = TYPE_FILE;
- file_range_offset_ = 0;
- file_range_length_ = 0;
+uint64 UploadData::Element::GetContentLength() const {
+ if (override_content_length_)
+ return content_length_;
- Close();
+ if (type_ == TYPE_BYTES)
+ return static_cast<uint64>(bytes_.size());
- if (offset + length < offset) {
- LOG(ERROR) << "Upload file offset and length overflow 64-bits. Ignoring.";
- return;
- }
+ DCHECK(type_ == TYPE_FILE);
- base::PlatformFile file = base::CreatePlatformFile(
- path, base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ, NULL);
- if (file == base::kInvalidPlatformFileValue) {
- // This case occurs when the user selects a file that isn't readable.
- file_path_= path;
- return;
- }
+ // TODO(darin): This size calculation could be out of sync with the state of
+ // the file when we get around to reading it. We should probably find a way
+ // to lock the file or somehow protect against this error condition.
- uint64 file_size;
- if (!base::GetPlatformFileSize(file, &file_size)) {
- base::ClosePlatformFile(file);
- return;
- }
+ int64 length = 0;
+ if (!file_util::GetFileSize(file_path_, &length))
+ return 0;
- if (offset > file_size) {
- base::ClosePlatformFile(file);
- return;
- }
- if (offset + length > file_size)
- length = file_size - offset;
+ if (file_range_offset_ >= static_cast<uint64>(length))
+ return 0; // range is beyond eof
- file_ = file;
- file_path_ = path;
- file_range_offset_ = offset;
- file_range_length_ = length;
+ // compensate for the offset and clip file_range_length_ to eof
+ return std::min(length - file_range_offset_, file_range_length_);
}
} // namespace net