Add a random name to anonymous shared memory sections

This prevents Windows from ignoring the DACL on unnamed sections.

BUG=338538
[email protected],[email protected]

Review URL: https://codereview.chromium.org/412043002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@285195 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/base/memory/shared_memory_win.cc b/base/memory/shared_memory_win.cc
index cc177ab..3c1054fd 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 @@
 
   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;