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

Side by Side Diff: base/memory/shared_memory_win.cc

Issue 444323005: Add DACL and fix test for anonymous read-only memory (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: more tests Created 6 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « base/memory/shared_memory_unittest.cc ('k') | no next file » | 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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/memory/shared_memory.h" 5 #include "base/memory/shared_memory.h"
6 6
7 #include <aclapi.h>
8
7 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/scoped_ptr.h"
8 #include "base/rand_util.h" 11 #include "base/rand_util.h"
9 #include "base/strings/stringprintf.h" 12 #include "base/strings/stringprintf.h"
10 #include "base/strings/utf_string_conversions.h" 13 #include "base/strings/utf_string_conversions.h"
11 14
12 namespace { 15 namespace {
13 16
14 // Returns the length of the memory section starting at the supplied address. 17 // Returns the length of the memory section starting at the supplied address.
15 size_t GetMemorySectionSize(void* address) { 18 size_t GetMemorySectionSize(void* address) {
16 MEMORY_BASIC_INFORMATION memory_info; 19 MEMORY_BASIC_INFORMATION memory_info;
17 if (!::VirtualQuery(address, &memory_info, sizeof(memory_info))) 20 if (!::VirtualQuery(address, &memory_info, sizeof(memory_info)))
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 return false; 113 return false;
111 114
112 // Check maximum accounting for overflow. 115 // Check maximum accounting for overflow.
113 if (options.size > 116 if (options.size >
114 static_cast<size_t>(std::numeric_limits<int>::max()) - kSectionMask) 117 static_cast<size_t>(std::numeric_limits<int>::max()) - kSectionMask)
115 return false; 118 return false;
116 119
117 size_t rounded_size = (options.size + kSectionMask) & ~kSectionMask; 120 size_t rounded_size = (options.size + kSectionMask) & ~kSectionMask;
118 name_ = ASCIIToWide(options.name_deprecated == NULL ? "" : 121 name_ = ASCIIToWide(options.name_deprecated == NULL ? "" :
119 *options.name_deprecated); 122 *options.name_deprecated);
123 SECURITY_ATTRIBUTES sa = { sizeof(sa), NULL, FALSE };
124 SECURITY_DESCRIPTOR sd;
125 ACL dacl;
126
120 if (options.share_read_only && name_.empty()) { 127 if (options.share_read_only && name_.empty()) {
128 // Add an empty DACL to enforce anonymous read-only sections.
129 sa.lpSecurityDescriptor = &sd;
130 if (!InitializeAcl(&dacl, sizeof(dacl), ACL_REVISION))
131 return false;
132 if (!InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION))
133 return false;
134 if (!SetSecurityDescriptorDacl(&sd, TRUE, &dacl, FALSE))
135 return false;
136
121 // Windows ignores DACLs on certain unnamed objects (like shared sections). 137 // Windows ignores DACLs on certain unnamed objects (like shared sections).
122 // So, we generate a random name when we need to enforce read-only. 138 // So, we generate a random name when we need to enforce read-only.
123 uint64_t rand_values[4]; 139 uint64_t rand_values[4];
124 base::RandBytes(&rand_values, sizeof(rand_values)); 140 base::RandBytes(&rand_values, sizeof(rand_values));
125 name_ = base::StringPrintf(L"CrSharedMem_%016x%016x%016x%016x", 141 name_ = base::StringPrintf(L"CrSharedMem_%016x%016x%016x%016x",
126 rand_values[0], rand_values[1], 142 rand_values[0], rand_values[1],
127 rand_values[2], rand_values[3]); 143 rand_values[2], rand_values[3]);
128 } 144 }
129 mapped_file_ = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, 145 mapped_file_ = CreateFileMapping(INVALID_HANDLE_VALUE, &sa,
130 PAGE_READWRITE, 0, static_cast<DWORD>(rounded_size), name_.c_str()); 146 PAGE_READWRITE, 0, static_cast<DWORD>(rounded_size), name_.c_str());
131 if (!mapped_file_) 147 if (!mapped_file_)
132 return false; 148 return false;
133 149
134 requested_size_ = options.size; 150 requested_size_ = options.size;
135 151
136 // Check if the shared memory pre-exists. 152 // Check if the shared memory pre-exists.
137 if (GetLastError() == ERROR_ALREADY_EXISTS) { 153 if (GetLastError() == ERROR_ALREADY_EXISTS) {
138 // If the file already existed, set requested_size_ to 0 to show that 154 // If the file already existed, set requested_size_ to 0 to show that
139 // we don't know the size. 155 // we don't know the size.
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 void SharedMemory::UnlockDeprecated() { 278 void SharedMemory::UnlockDeprecated() {
263 DCHECK(lock_ != NULL); 279 DCHECK(lock_ != NULL);
264 ReleaseMutex(lock_); 280 ReleaseMutex(lock_);
265 } 281 }
266 282
267 SharedMemoryHandle SharedMemory::handle() const { 283 SharedMemoryHandle SharedMemory::handle() const {
268 return mapped_file_; 284 return mapped_file_;
269 } 285 }
270 286
271 } // namespace base 287 } // namespace base
OLDNEW
« no previous file with comments | « base/memory/shared_memory_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698