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

Unified Diff: base/file_util_win.cc

Issue 8128: Make sure it's possible to download to a network share.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 12 years, 2 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
« base/file_util.h ('K') | « base/file_util.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/file_util_win.cc
===================================================================
--- base/file_util_win.cc (revision 3832)
+++ base/file_util_win.cc (working copy)
@@ -535,47 +535,24 @@
bool RenameFileAndResetSecurityDescriptor(
const std::wstring& source_file_path,
const std::wstring& target_file_path) {
- // The MoveFile API does not reset the security descriptor on the target
- // file. To ensure that the target file gets the correct security descriptor
- // we create the target file initially in the target path, read its security
- // descriptor and stamp this descriptor on the target file after the MoveFile
- // API completes.
- ScopedHandle temp_file_handle_for_security_desc(
- CreateFileW(target_file_path.c_str(), GENERIC_READ | GENERIC_WRITE,
- FILE_SHARE_READ, NULL, OPEN_ALWAYS,
- FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE,
- NULL));
- if (!temp_file_handle_for_security_desc.IsValid())
- return false;
+ // The parameters to SHFileOperation must be terminated with 2 NULL chars.
+ std::wstring source = source_file_path;
+ std::wstring target = target_file_path;
- // Check how much we should allocate for the security descriptor.
- unsigned long security_descriptor_size_in_bytes = 0;
- GetFileSecurity(target_file_path.c_str(), DACL_SECURITY_INFORMATION, NULL, 0,
- &security_descriptor_size_in_bytes);
- if (ERROR_INSUFFICIENT_BUFFER != GetLastError() ||
- security_descriptor_size_in_bytes == 0)
- return false;
+ source.append(1, L'\0');
+ target.append(1, L'\0');
- scoped_array<char> security_descriptor(
- new char[security_descriptor_size_in_bytes]);
+ SHFILEOPSTRUCT move_info = {0};
+ move_info.wFunc = FO_MOVE;
+ move_info.pFrom = source.c_str();
+ move_info.pTo = target.c_str();
+ move_info.fFlags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI |
+ FOF_NOCONFIRMMKDIR | FOF_NOCOPYSECURITYATTRIBS;
rvargas (doing something else) 2008/10/24 18:00:23 nit: don't we want to use FOF_RENAMEONCOLLISION?
- if (!GetFileSecurity(target_file_path.c_str(), DACL_SECURITY_INFORMATION,
- security_descriptor.get(),
- security_descriptor_size_in_bytes,
- &security_descriptor_size_in_bytes)) {
- return false;
- }
-
- temp_file_handle_for_security_desc.Set(INVALID_HANDLE_VALUE);
-
- if (!MoveFileEx(source_file_path.c_str(), target_file_path.c_str(),
- MOVEFILE_COPY_ALLOWED)) {
- return false;
- }
-
- return !!SetFileSecurity(target_file_path.c_str(),
- DACL_SECURITY_INFORMATION,
- security_descriptor.get());
+ if (0 != SHFileOperation(&move_info))
+ return false;
amit 2008/10/24 17:45:34 Would be nice to log an error if this fails.
+
+ return true;
}
// Gets the current working directory for the process.
« base/file_util.h ('K') | « base/file_util.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698