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

Unified Diff: net/base/upload_data.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.h ('k') | net/base/upload_data_stream.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/base/upload_data.cc
diff --git a/net/base/upload_data.cc b/net/base/upload_data.cc
index 04968736f1eebb5f634f10ab0a25528e0d808601..a23b25ee97bafb4be96c740cec1ee664a22b9994 100644
--- a/net/base/upload_data.cc
+++ b/net/base/upload_data.cc
@@ -5,6 +5,7 @@
#include "net/base/upload_data.h"
#include "base/file_util.h"
+#include "base/platform_file.h"
#include "base/logging.h"
namespace net {
@@ -17,28 +18,67 @@ uint64 UploadData::GetContentLength() const {
return len;
}
-uint64 UploadData::Element::GetContentLength() const {
- if (override_content_length_)
- return content_length_;
+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;
- if (type_ == TYPE_BYTES)
- return static_cast<uint64>(bytes_.size());
+ Close();
- DCHECK(type_ == TYPE_FILE);
+ if (offset + length < offset) {
+ LOG(ERROR) << "Upload file offset and length overflow 64-bits. Ignoring.";
+ 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.
+ 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;
+ }
- int64 length = 0;
- if (!file_util::GetFileSize(file_path_, &length))
- return 0;
+ uint64 file_size;
+ if (!base::GetPlatformFileSize(file, &file_size)) {
+ base::ClosePlatformFile(file);
+ return;
+ }
- if (file_range_offset_ >= static_cast<uint64>(length))
- return 0; // range is beyond eof
+ if (offset > file_size) {
+ base::ClosePlatformFile(file);
+ return;
+ }
+ if (offset + length > file_size)
+ length = file_size - offset;
- // compensate for the offset and clip file_range_length_ to eof
- return std::min(length - file_range_offset_, file_range_length_);
+ file_ = file;
+ file_path_ = path;
+ file_range_offset_ = offset;
+ file_range_length_ = length;
}
} // namespace net
« no previous file with comments | « net/base/upload_data.h ('k') | net/base/upload_data_stream.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698