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

Side by Side Diff: base/files/file_util_win.cc

Issue 2687713003: Stop base::OpenFile from leaking fds/handles into child procs. (Closed)
Patch Set: gab comments Created 3 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 unified diff | Download patch
« no previous file with comments | « base/files/file_util_unittest.cc ('k') | build/sanitizers/lsan_suppressions.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/files/file_util.h" 5 #include "base/files/file_util.h"
6 6
7 #include <windows.h> 7 #include <windows.h>
8 #include <io.h> 8 #include <io.h>
9 #include <psapi.h> 9 #include <psapi.h>
10 #include <shellapi.h> 10 #include <shellapi.h>
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 if (recursive && (!DeleteFileRecursive(current, pattern, true) || 63 if (recursive && (!DeleteFileRecursive(current, pattern, true) ||
64 !RemoveDirectory(current.value().c_str()))) 64 !RemoveDirectory(current.value().c_str())))
65 return false; 65 return false;
66 } else if (!::DeleteFile(current.value().c_str())) { 66 } else if (!::DeleteFile(current.value().c_str())) {
67 return false; 67 return false;
68 } 68 }
69 } 69 }
70 return true; 70 return true;
71 } 71 }
72 72
73 // Appends |mode_char| to |mode| before the optional character set encoding; see
74 // https://msdn.microsoft.com/library/yeby3zcb.aspx for details.
75 void AppendModeCharacter(base::char16 mode_char, base::string16* mode) {
76 size_t comma_pos = mode->find(L',');
77 mode->insert(comma_pos == base::string16::npos ? mode->length() : comma_pos,
78 1, mode_char);
79 }
80
73 } // namespace 81 } // namespace
74 82
75 FilePath MakeAbsoluteFilePath(const FilePath& input) { 83 FilePath MakeAbsoluteFilePath(const FilePath& input) {
76 ThreadRestrictions::AssertIOAllowed(); 84 ThreadRestrictions::AssertIOAllowed();
77 wchar_t file_path[MAX_PATH]; 85 wchar_t file_path[MAX_PATH];
78 if (!_wfullpath(file_path, input.value().c_str(), MAX_PATH)) 86 if (!_wfullpath(file_path, input.value().c_str(), MAX_PATH))
79 return FilePath(); 87 return FilePath();
80 return FilePath(file_path); 88 return FilePath(file_path);
81 } 89 }
82 90
(...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after
587 results->is_directory = 595 results->is_directory =
588 (attr.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; 596 (attr.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0;
589 results->last_modified = Time::FromFileTime(attr.ftLastWriteTime); 597 results->last_modified = Time::FromFileTime(attr.ftLastWriteTime);
590 results->last_accessed = Time::FromFileTime(attr.ftLastAccessTime); 598 results->last_accessed = Time::FromFileTime(attr.ftLastAccessTime);
591 results->creation_time = Time::FromFileTime(attr.ftCreationTime); 599 results->creation_time = Time::FromFileTime(attr.ftCreationTime);
592 600
593 return true; 601 return true;
594 } 602 }
595 603
596 FILE* OpenFile(const FilePath& filename, const char* mode) { 604 FILE* OpenFile(const FilePath& filename, const char* mode) {
605 // 'N' is unconditionally added below, so be sure there is not one already
606 // present before a comma in |mode|.
607 DCHECK(
608 strchr(mode, 'N') == nullptr ||
609 (strchr(mode, ',') != nullptr && strchr(mode, 'N') > strchr(mode, ',')));
597 ThreadRestrictions::AssertIOAllowed(); 610 ThreadRestrictions::AssertIOAllowed();
598 string16 w_mode = ASCIIToUTF16(mode); 611 string16 w_mode = ASCIIToUTF16(mode);
612 AppendModeCharacter(L'N', &w_mode);
599 return _wfsopen(filename.value().c_str(), w_mode.c_str(), _SH_DENYNO); 613 return _wfsopen(filename.value().c_str(), w_mode.c_str(), _SH_DENYNO);
600 } 614 }
601 615
602 FILE* FileToFILE(File file, const char* mode) { 616 FILE* FileToFILE(File file, const char* mode) {
603 if (!file.IsValid()) 617 if (!file.IsValid())
604 return NULL; 618 return NULL;
605 int fd = 619 int fd =
606 _open_osfhandle(reinterpret_cast<intptr_t>(file.GetPlatformFile()), 0); 620 _open_osfhandle(reinterpret_cast<intptr_t>(file.GetPlatformFile()), 0);
607 if (fd < 0) 621 if (fd < 0)
608 return NULL; 622 return NULL;
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
828 // Like Move, this function is not transactional, so we just 842 // Like Move, this function is not transactional, so we just
829 // leave the copied bits behind if deleting from_path fails. 843 // leave the copied bits behind if deleting from_path fails.
830 // If to_path exists previously then we have already overwritten 844 // If to_path exists previously then we have already overwritten
831 // it by now, we don't get better off by deleting the new bits. 845 // it by now, we don't get better off by deleting the new bits.
832 } 846 }
833 return false; 847 return false;
834 } 848 }
835 849
836 } // namespace internal 850 } // namespace internal
837 } // namespace base 851 } // namespace base
OLDNEW
« no previous file with comments | « base/files/file_util_unittest.cc ('k') | build/sanitizers/lsan_suppressions.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698