| Index: base/memory/shared_memory_win.cc
|
| diff --git a/base/memory/shared_memory_win.cc b/base/memory/shared_memory_win.cc
|
| index cc177ab3f2155625965c117b00947282d566af6d..3c1054fd5d3c5693981eeb979ece4c6999c12b06 100644
|
| --- a/base/memory/shared_memory_win.cc
|
| +++ b/base/memory/shared_memory_win.cc
|
| @@ -5,6 +5,8 @@
|
| #include "base/memory/shared_memory.h"
|
|
|
| #include "base/logging.h"
|
| +#include "base/rand_util.h"
|
| +#include "base/strings/stringprintf.h"
|
| #include "base/strings/utf_string_conversions.h"
|
|
|
| namespace {
|
| @@ -114,10 +116,18 @@ bool SharedMemory::Create(const SharedMemoryCreateOptions& options) {
|
|
|
| size_t rounded_size = (options.size + kSectionMask) & ~kSectionMask;
|
| name_ = ASCIIToWide(options.name_deprecated == NULL ? "" :
|
| - *options.name_deprecated);
|
| + *options.name_deprecated);
|
| + if (options.share_read_only && name_.empty()) {
|
| + // Windows ignores DACLs on certain unnamed objects (like shared sections).
|
| + // So, we generate a random name when we need to enforce read-only.
|
| + uint64_t rand_values[4];
|
| + base::RandBytes(&rand_values, sizeof(rand_values));
|
| + name_ = base::StringPrintf(L"CrSharedMem_%016x%016x%016x%016x",
|
| + rand_values[0], rand_values[1],
|
| + rand_values[2], rand_values[3]);
|
| + }
|
| mapped_file_ = CreateFileMapping(INVALID_HANDLE_VALUE, NULL,
|
| - PAGE_READWRITE, 0, static_cast<DWORD>(rounded_size),
|
| - name_.empty() ? NULL : name_.c_str());
|
| + PAGE_READWRITE, 0, static_cast<DWORD>(rounded_size), name_.c_str());
|
| if (!mapped_file_)
|
| return false;
|
|
|
|
|