Index: base/file_util_win.cc |
diff --git a/base/file_util_win.cc b/base/file_util_win.cc |
index 8a15370c46331356f576cbdae6a38f30de24b431..74b94063c56393599b5d5413d70198b32b1586ec 100644 |
--- a/base/file_util_win.cc |
+++ b/base/file_util_win.cc |
@@ -63,6 +63,56 @@ bool DevicePathToDriveLetterPath(const FilePath& device_path, |
return true; |
} |
+// Build a security descriptor with the weakest possible file permissions. |
+bool InitLooseSecurityDescriptor(SECURITY_ATTRIBUTES *sa, |
+ SECURITY_DESCRIPTOR *sd) { |
+ DWORD last_error; |
+ |
+ if (!InitializeSecurityDescriptor(sd, SECURITY_DESCRIPTOR_REVISION)) { |
+ last_error = GetLastError(); |
+ LOG(ERROR) << "InitializeSecurityDescriptor failed: GetLastError() = " |
+ << last_error; |
+ return false; |
+ } |
+ |
+ if (!SetSecurityDescriptorDacl(sd, |
+ TRUE, // bDaclPresent: Add one to |sd|. |
+ NULL, // pDacl: NULL means allow all access. |
+ FALSE // bDaclDefaulted: Not defaulted. |
+ )) { |
+ last_error = GetLastError(); |
+ LOG(ERROR) << "SetSecurityDescriptorDacl() failed: GetLastError() = " |
+ << last_error; |
+ return false; |
+ } |
+ |
+ if (!SetSecurityDescriptorGroup(sd, |
+ NULL, // pGroup: No no primary group. |
+ FALSE // bGroupDefaulted: Not defaulted. |
+ )) { |
+ last_error = GetLastError(); |
+ LOG(ERROR) << "SetSecurityDescriptorGroup() failed: GetLastError() = " |
+ << last_error; |
+ return false; |
+ } |
+ |
+ if (!SetSecurityDescriptorSacl(sd, |
+ FALSE, // bSaclPresent: No SACL. |
+ NULL, |
+ FALSE |
+ )) { |
+ last_error = GetLastError(); |
+ LOG(ERROR) << "SetSecurityDescriptorSacl() failed: GetLastError() = " |
+ << last_error; |
+ return false; |
+ } |
+ |
+ sa->nLength = sizeof(SECURITY_ATTRIBUTES); |
+ sa->lpSecurityDescriptor = sd; |
+ sa->bInheritHandle = TRUE; |
+ return true; |
+} |
+ |
} // namespace |
std::wstring GetDirectoryFromPath(const std::wstring& path) { |
@@ -550,7 +600,19 @@ bool CreateTemporaryFileInDir(const FilePath& dir, |
bool CreateTemporaryDirInDir(const FilePath& base_dir, |
const FilePath::StringType& prefix, |
+ bool loosen_permissions, |
FilePath* new_dir) { |
+ SECURITY_ATTRIBUTES sa; |
+ SECURITY_DESCRIPTOR sd; |
+ |
+ LPSECURITY_ATTRIBUTES directory_security_attributes = NULL; |
+ if (loosen_permissions) { |
+ if (InitLooseSecurityDescriptor(&sa, &sd)) |
+ directory_security_attributes = &sa; |
+ else |
+ LOG(ERROR) << "Failed to init security attributes, fall back to NULL."; |
+ } |
+ |
FilePath path_to_create; |
srand(static_cast<uint32>(time(NULL))); |
@@ -565,7 +627,8 @@ bool CreateTemporaryDirInDir(const FilePath& base_dir, |
new_dir_name.append(IntToWString(rand() % kint16max)); |
path_to_create = path_to_create.Append(new_dir_name); |
- if (::CreateDirectory(path_to_create.value().c_str(), NULL)) |
+ if (::CreateDirectory(path_to_create.value().c_str(), |
+ directory_security_attributes)) |
break; |
count++; |
} |
@@ -575,6 +638,7 @@ bool CreateTemporaryDirInDir(const FilePath& base_dir, |
} |
*new_dir = path_to_create; |
+ |
return true; |
} |
@@ -584,7 +648,10 @@ bool CreateNewTempDirectory(const FilePath::StringType& prefix, |
if (!GetTempDir(&system_temp_dir)) |
return false; |
- return CreateTemporaryDirInDir(system_temp_dir, prefix, new_temp_path); |
+ return CreateTemporaryDirInDir(system_temp_dir, |
+ prefix, |
+ false, |
+ new_temp_path); |
} |
bool CreateDirectory(const FilePath& full_path) { |