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

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

Issue 2875453002: Add a size parameter to SharedMemoryHandle. (Closed)
Patch Set: Remove extraneous period. Created 3 years, 7 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/memory/shared_memory_unittest.cc ('k') | base/metrics/field_trial.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) 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> 7 #include <aclapi.h>
8 #include <stddef.h> 8 #include <stddef.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 10
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
220 // So, we generate a random name when we need to enforce read-only. 220 // So, we generate a random name when we need to enforce read-only.
221 uint64_t rand_values[4]; 221 uint64_t rand_values[4];
222 RandBytes(&rand_values, sizeof(rand_values)); 222 RandBytes(&rand_values, sizeof(rand_values));
223 name_ = StringPrintf(L"CrSharedMem_%016llx%016llx%016llx%016llx", 223 name_ = StringPrintf(L"CrSharedMem_%016llx%016llx%016llx%016llx",
224 rand_values[0], rand_values[1], 224 rand_values[0], rand_values[1],
225 rand_values[2], rand_values[3]); 225 rand_values[2], rand_values[3]);
226 } 226 }
227 DCHECK(!name_.empty()); 227 DCHECK(!name_.empty());
228 shm_ = SharedMemoryHandle( 228 shm_ = SharedMemoryHandle(
229 CreateFileMappingWithReducedPermissions(&sa, rounded_size, name_.c_str()), 229 CreateFileMappingWithReducedPermissions(&sa, rounded_size, name_.c_str()),
230 UnguessableToken::Create()); 230 rounded_size, UnguessableToken::Create());
231 if (!shm_.IsValid()) { 231 if (!shm_.IsValid()) {
232 // The error is logged within CreateFileMappingWithReducedPermissions(). 232 // The error is logged within CreateFileMappingWithReducedPermissions().
233 return false; 233 return false;
234 } 234 }
235 235
236 requested_size_ = options.size; 236 requested_size_ = options.size;
237 237
238 // Check if the shared memory pre-exists. 238 // Check if the shared memory pre-exists.
239 if (GetLastError() == ERROR_ALREADY_EXISTS) { 239 if (GetLastError() == ERROR_ALREADY_EXISTS) {
240 // If the file already existed, set requested_size_ to 0 to show that 240 // If the file already existed, set requested_size_ to 0 to show that
(...skipping 26 matching lines...) Expand all
267 read_only_ = read_only; 267 read_only_ = read_only;
268 268
269 // This form of sharing shared memory is deprecated. https://crbug.com/345734. 269 // This form of sharing shared memory is deprecated. https://crbug.com/345734.
270 // However, we can't get rid of it without a significant refactor because its 270 // However, we can't get rid of it without a significant refactor because its
271 // used to communicate between two versions of the same service process, very 271 // used to communicate between two versions of the same service process, very
272 // early in the life cycle. 272 // early in the life cycle.
273 // Technically, we should also pass the GUID from the original shared memory 273 // Technically, we should also pass the GUID from the original shared memory
274 // region. We don't do that - this means that we will overcount this memory, 274 // region. We don't do that - this means that we will overcount this memory,
275 // which thankfully isn't relevant since Chrome only communicates with a 275 // which thankfully isn't relevant since Chrome only communicates with a
276 // single version of the service process. 276 // single version of the service process.
277 // We pass the size |0|, which is a dummy size and wrong, but otherwise
278 // harmless.
277 shm_ = SharedMemoryHandle( 279 shm_ = SharedMemoryHandle(
278 OpenFileMapping(access, false, name_.empty() ? nullptr : name_.c_str()), 280 OpenFileMapping(access, false, name_.empty() ? nullptr : name_.c_str()),
279 UnguessableToken::Create()); 281 0u, UnguessableToken::Create());
280 if (!shm_.IsValid()) 282 if (!shm_.IsValid())
281 return false; 283 return false;
282 // If a name specified assume it's an external section. 284 // If a name specified assume it's an external section.
283 if (!name_.empty()) 285 if (!name_.empty())
284 external_section_ = true; 286 external_section_ = true;
285 // Note: size_ is not set in this case. 287 // Note: size_ is not set in this case.
286 return true; 288 return true;
287 } 289 }
288 290
289 bool SharedMemory::MapAt(off_t offset, size_t bytes) { 291 bool SharedMemory::MapAt(off_t offset, size_t bytes) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 return true; 323 return true;
322 } 324 }
323 325
324 SharedMemoryHandle SharedMemory::GetReadOnlyHandle() { 326 SharedMemoryHandle SharedMemory::GetReadOnlyHandle() {
325 HANDLE result; 327 HANDLE result;
326 ProcessHandle process = GetCurrentProcess(); 328 ProcessHandle process = GetCurrentProcess();
327 if (!::DuplicateHandle(process, shm_.GetHandle(), process, &result, 329 if (!::DuplicateHandle(process, shm_.GetHandle(), process, &result,
328 FILE_MAP_READ | SECTION_QUERY, FALSE, 0)) { 330 FILE_MAP_READ | SECTION_QUERY, FALSE, 0)) {
329 return SharedMemoryHandle(); 331 return SharedMemoryHandle();
330 } 332 }
331 SharedMemoryHandle handle = SharedMemoryHandle(result, shm_.GetGUID()); 333 SharedMemoryHandle handle =
334 SharedMemoryHandle(result, shm_.GetSize(), shm_.GetGUID());
332 handle.SetOwnershipPassesToIPC(true); 335 handle.SetOwnershipPassesToIPC(true);
333 return handle; 336 return handle;
334 } 337 }
335 338
336 void SharedMemory::Close() { 339 void SharedMemory::Close() {
337 if (shm_.IsValid()) { 340 if (shm_.IsValid()) {
338 shm_.Close(); 341 shm_.Close();
339 shm_ = SharedMemoryHandle(); 342 shm_ = SharedMemoryHandle();
340 } 343 }
341 } 344 }
342 345
343 SharedMemoryHandle SharedMemory::handle() const { 346 SharedMemoryHandle SharedMemory::handle() const {
344 return shm_; 347 return shm_;
345 } 348 }
346 349
347 SharedMemoryHandle SharedMemory::TakeHandle() { 350 SharedMemoryHandle SharedMemory::TakeHandle() {
348 SharedMemoryHandle handle(shm_); 351 SharedMemoryHandle handle(shm_);
349 handle.SetOwnershipPassesToIPC(true); 352 handle.SetOwnershipPassesToIPC(true);
350 shm_ = SharedMemoryHandle(); 353 shm_ = SharedMemoryHandle();
351 memory_ = nullptr; 354 memory_ = nullptr;
352 mapped_size_ = 0; 355 mapped_size_ = 0;
353 return handle; 356 return handle;
354 } 357 }
355 358
356 } // namespace base 359 } // namespace base
OLDNEW
« no previous file with comments | « base/memory/shared_memory_unittest.cc ('k') | base/metrics/field_trial.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698