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

Unified Diff: chrome/common/important_file_writer.cc

Issue 7695014: ImportantFileWriter: Flush the data before closing the (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 9 years, 4 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 | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/common/important_file_writer.cc
===================================================================
--- chrome/common/important_file_writer.cc (revision 97170)
+++ chrome/common/important_file_writer.cc (working copy)
@@ -36,22 +36,33 @@
// as target file, so it can be moved in one step, and that the temp file
// is securely created.
FilePath tmp_file_path;
- FILE* tmp_file = file_util::CreateAndOpenTemporaryFileInDir(
- path_.DirName(), &tmp_file_path);
- if (!tmp_file) {
+ if (!file_util::CreateTemporaryFileInDir(path_.DirName(), &tmp_file_path)) {
LogFailure("could not create temporary file");
return;
}
- size_t bytes_written = fwrite(data_.data(), 1, data_.length(), tmp_file);
- if (!file_util::CloseFile(tmp_file)) {
+ int flags = base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_WRITE;
+ base::PlatformFile tmp_file =
+ base::CreatePlatformFile(tmp_file_path, flags, NULL, NULL);
Scott Hess - ex-Googler 2011/08/23 00:54:38 I would prefer if you could not introduce a race c
rvargas (doing something else) 2011/08/23 01:41:52 I was writing the code with some posix specific ve
Scott Hess - ex-Googler 2011/08/23 19:23:57 The rename case is a very good point! I won't dig
+ if (tmp_file == base::kInvalidPlatformFileValue) {
+ LogFailure("could not open temporary file");
+ return;
+ }
+
+ CHECK_LE(data_.length(), static_cast<size_t>(kint32max));
+ int bytes_written = base::WritePlatformFile(
+ tmp_file, 0, data_.data(), static_cast<int>(data_.length()));
Scott Hess - ex-Googler 2011/08/23 19:27:17 BTW ... AFAICT the POSIX version of this function
rvargas (doing something else) 2011/08/23 23:36:58 In that case, line 63 should detect the error and
+ base::FlushPlatformFile(tmp_file); // Ignore return value.
Scott Hess - ex-Googler 2011/08/23 00:54:38 Would it be reasonable to wire up something like f
rvargas (doing something else) 2011/08/23 01:41:52 Not sure. I can make fflush do the right thing on
Scott Hess - ex-Googler 2011/08/23 19:23:57 OK, that's all I wanted to hear - I hate having mu
+
+ if (!base::ClosePlatformFile(tmp_file)) {
LogFailure("failed to close temporary file");
file_util::Delete(tmp_file_path, false);
return;
}
- if (bytes_written < data_.length()) {
+
+ if (bytes_written < static_cast<int>(data_.length())) {
LogFailure("error writing, bytes_written=" +
- base::Uint64ToString(bytes_written));
+ base::IntToString(bytes_written));
file_util::Delete(tmp_file_path, false);
return;
}
@@ -102,6 +113,10 @@
void ImportantFileWriter::WriteNow(const std::string& data) {
DCHECK(CalledOnValidThread());
+ if (data.length() > static_cast<size_t>(kint32max)) {
+ NOTREACHED();
+ return;
+ }
if (HasPendingWrite())
timer_.Stop();
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698