diagnostics: migrate to new SharedMemory API

In libchrome r780000, base::SharedMemory and base::SharedMemoryHandle
would be deprecated and replaced by
base::{ReadOnly,Writable,Unsafe}SharedMemoryRegion types and
base::{ReadOnly,Writable}SharedMemoryMapping.
Also added fallocate to seccomp policy files for its use in
base::AllocateFileRegion when creating the shared memory region.

BUG=chromium:1094927
TEST=cros_run_unit_tests --board=eve --packages diagnostics
TEST=tast run platform.Diagnostics platform.CrosHealthd* wilco.*

Change-Id: Ic4205a4085242d0a237908e7f201e8d55db6c2ed
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform2/+/2298567
Commit-Queue: Grace Cham <hscham@chromium.org>
Tested-by: Grace Cham <hscham@chromium.org>
Reviewed-by: Oleh Lamzin <lamzin@google.com>
Reviewed-by: Maksim Ivanov <emaxx@chromium.org>
diff --git a/diagnostics/common/mojo_test_utils.cc b/diagnostics/common/mojo_test_utils.cc
index 18cf7f2..c04a94c 100644
--- a/diagnostics/common/mojo_test_utils.cc
+++ b/diagnostics/common/mojo_test_utils.cc
@@ -83,10 +83,11 @@
 std::string GetStringFromMojoHandle(mojo::ScopedHandle handle) {
   if (!handle.is_valid())
     return "";
-  auto shared_memory = GetReadOnlySharedMemoryFromMojoHandle(std::move(handle));
-  DCHECK(shared_memory);
-  return std::string(static_cast<const char*>(shared_memory->memory()),
-                     shared_memory->mapped_size());
+  auto shm_mapping =
+      GetReadOnlySharedMemoryMappingFromMojoHandle(std::move(handle));
+  DCHECK(shm_mapping.IsValid());
+  return std::string(shm_mapping.GetMemoryAs<const char>(),
+                     shm_mapping.mapped_size());
 }
 
 }  // namespace diagnostics
diff --git a/diagnostics/common/mojo_utils.cc b/diagnostics/common/mojo_utils.cc
index f632b6d..787db1f 100644
--- a/diagnostics/common/mojo_utils.cc
+++ b/diagnostics/common/mojo_utils.cc
@@ -10,60 +10,64 @@
 #include <utility>
 
 #include <base/files/file.h>
-#include <base/memory/shared_memory_handle.h>
+#include <base/posix/eintr_wrapper.h>
 #include <mojo/public/c/system/types.h>
 #include <mojo/public/cpp/system/platform_handle.h>
 
 namespace diagnostics {
 
-std::unique_ptr<base::SharedMemory> GetReadOnlySharedMemoryFromMojoHandle(
+base::ReadOnlySharedMemoryMapping GetReadOnlySharedMemoryMappingFromMojoHandle(
     mojo::ScopedHandle handle) {
   base::PlatformFile platform_file;
   auto result = mojo::UnwrapPlatformFile(std::move(handle), &platform_file);
   if (result != MOJO_RESULT_OK) {
-    return nullptr;
+    return base::ReadOnlySharedMemoryMapping();
   }
 
   const int fd(HANDLE_EINTR(dup(platform_file)));
   if (fd < 0) {
-    return nullptr;
+    return base::ReadOnlySharedMemoryMapping();
   }
 
   const int64_t file_size = base::File(fd).GetLength();
   if (file_size <= 0) {
-    return nullptr;
+    return base::ReadOnlySharedMemoryMapping();
   }
 
-  auto shared_memory = std::make_unique<base::SharedMemory>(
-      base::SharedMemoryHandle(
-          base::FileDescriptor(platform_file, true /* iauto_close */),
-          file_size, base::UnguessableToken::Create()),
-      true /* read_only */);
-
-  if (!shared_memory->Map(file_size)) {
-    return nullptr;
-  }
-  return shared_memory;
+  // Use of base::subtle::PlatformSharedMemoryRegion is necessary on process
+  // boundaries to converting between SharedMemoryRegion and its handle (fd).
+  base::ReadOnlySharedMemoryRegion shm_region =
+      base::ReadOnlySharedMemoryRegion::Deserialize(
+          base::subtle::PlatformSharedMemoryRegion::Take(
+              base::subtle::ScopedFDPair(base::ScopedFD(platform_file),
+                                         base::ScopedFD()),
+              base::subtle::PlatformSharedMemoryRegion::Mode::kReadOnly,
+              file_size, base::UnguessableToken::Create()));
+  return shm_region.Map();
 }
 
-mojo::ScopedHandle CreateReadOnlySharedMemoryMojoHandle(
+mojo::ScopedHandle CreateReadOnlySharedMemoryRegionMojoHandle(
     base::StringPiece content) {
   if (content.empty())
     return mojo::ScopedHandle();
-  base::SharedMemory shared_memory;
-  base::SharedMemoryCreateOptions options;
-  options.size = content.length();
-  options.share_read_only = true;
-  if (!shared_memory.Create(base::SharedMemoryCreateOptions(options)) ||
-      !shared_memory.Map(content.length())) {
+  base::MappedReadOnlyRegion region_mapping =
+      base::ReadOnlySharedMemoryRegion::Create(content.length());
+  base::ReadOnlySharedMemoryRegion read_only_region =
+      std::move(region_mapping.region);
+  base::WritableSharedMemoryMapping writable_mapping =
+      std::move(region_mapping.mapping);
+  if (!read_only_region.IsValid() || !writable_mapping.IsValid()) {
     return mojo::ScopedHandle();
   }
-  memcpy(shared_memory.memory(), content.data(), content.length());
-  base::SharedMemoryHandle handle = shared_memory.GetReadOnlyHandle();
-  if (!handle.IsValid()) {
-    return mojo::ScopedHandle();
-  }
-  return mojo::WrapPlatformFile(handle.GetHandle());
+  memcpy(writable_mapping.GetMemoryAs<char>(), content.data(),
+         content.length());
+
+  // Use of base::subtle::PlatformSharedMemoryRegion is necessary on process
+  // boundaries to converting between SharedMemoryRegion and its handle (fd).
+  base::subtle::PlatformSharedMemoryRegion platform_shm =
+      base::ReadOnlySharedMemoryRegion::TakeHandleForSerialization(
+          std::move(read_only_region));
+  return mojo::WrapPlatformFile(platform_shm.PassPlatformHandle().fd.release());
 }
 
 }  // namespace diagnostics
diff --git a/diagnostics/common/mojo_utils.h b/diagnostics/common/mojo_utils.h
index ffc8b56..0bbe49e 100644
--- a/diagnostics/common/mojo_utils.h
+++ b/diagnostics/common/mojo_utils.h
@@ -5,22 +5,20 @@
 #ifndef DIAGNOSTICS_COMMON_MOJO_UTILS_H_
 #define DIAGNOSTICS_COMMON_MOJO_UTILS_H_
 
-#include <memory>
-
-#include <base/memory/shared_memory.h>
+#include <base/memory/read_only_shared_memory_region.h>
 #include <base/strings/string_piece.h>
 #include <mojo/public/cpp/system/handle.h>
 
 namespace diagnostics {
 
 // Allows to get access to the buffer in read only shared memory. It converts
-// mojo::Handle to base::SharedMemory.
+// mojo::Handle to base::ReadOnlySharedMemoryRegion.
 //
 // |handle| must be a valid mojo handle of the non-empty buffer in the shared
 // memory.
 //
-// Returns nullptr if error.
-std::unique_ptr<base::SharedMemory> GetReadOnlySharedMemoryFromMojoHandle(
+// Returns invalid |base::ReadOnlySharedMemoryMapping| if error.
+base::ReadOnlySharedMemoryMapping GetReadOnlySharedMemoryMappingFromMojoHandle(
     mojo::ScopedHandle handle);
 
 // Allocates buffer in shared memory, copies |content| to the buffer and
@@ -29,7 +27,7 @@
 // Allocated shared memory is read only for another process.
 //
 // Returns invalid |mojo::ScopedHandle| if error happened or |content| is empty.
-mojo::ScopedHandle CreateReadOnlySharedMemoryMojoHandle(
+mojo::ScopedHandle CreateReadOnlySharedMemoryRegionMojoHandle(
     base::StringPiece content);
 
 }  // namespace diagnostics
diff --git a/diagnostics/common/mojo_utils_test.cc b/diagnostics/common/mojo_utils_test.cc
index b366474..e89ab7c 100644
--- a/diagnostics/common/mojo_utils_test.cc
+++ b/diagnostics/common/mojo_utils_test.cc
@@ -27,29 +27,30 @@
 TEST_F(MojoUtilsTest, CreateMojoHandleAndRetrieveContent) {
   const base::StringPiece content("{\"key\": \"value\"}");
 
-  mojo::ScopedHandle handle = CreateReadOnlySharedMemoryMojoHandle(content);
+  mojo::ScopedHandle handle =
+      CreateReadOnlySharedMemoryRegionMojoHandle(content);
   EXPECT_TRUE(handle.is_valid());
 
-  std::unique_ptr<base::SharedMemory> shared_memory =
-      GetReadOnlySharedMemoryFromMojoHandle(std::move(handle));
-  ASSERT_TRUE(shared_memory);
+  auto shm_mapping =
+      GetReadOnlySharedMemoryMappingFromMojoHandle(std::move(handle));
+  ASSERT_TRUE(shm_mapping.IsValid());
 
-  base::StringPiece actual(static_cast<char*>(shared_memory->memory()),
-                           shared_memory->mapped_size());
+  base::StringPiece actual(shm_mapping.GetMemoryAs<char>(),
+                           shm_mapping.mapped_size());
   EXPECT_EQ(content, actual);
 }
 
-TEST_F(MojoUtilsTest, GetReadOnlySharedMemoryFromMojoInvalidHandle) {
+TEST_F(MojoUtilsTest, GetReadOnlySharedMemoryRegionFromMojoInvalidHandle) {
   mojo::ScopedHandle handle;
   EXPECT_FALSE(handle.is_valid());
 
-  std::unique_ptr<base::SharedMemory> shared_memory =
-      GetReadOnlySharedMemoryFromMojoHandle(std::move(handle));
-  EXPECT_FALSE(shared_memory);
+  auto shm_mapping =
+      GetReadOnlySharedMemoryMappingFromMojoHandle(std::move(handle));
+  EXPECT_FALSE(shm_mapping.IsValid());
 }
 
 TEST_F(MojoUtilsTest, CreateReadOnlySharedMemoryFromEmptyContent) {
-  mojo::ScopedHandle handle = CreateReadOnlySharedMemoryMojoHandle("");
+  mojo::ScopedHandle handle = CreateReadOnlySharedMemoryRegionMojoHandle("");
   // Cannot create valid handle using empty content line.
   EXPECT_FALSE(handle.is_valid());
 }
diff --git a/diagnostics/cros_health_tool/diag/diag_actions.cc b/diagnostics/cros_health_tool/diag/diag_actions.cc
index e527eb4..f7a5961 100644
--- a/diagnostics/cros_health_tool/diag/diag_actions.cc
+++ b/diagnostics/cros_health_tool/diag/diag_actions.cc
@@ -278,13 +278,13 @@
   // in some form. Print the update to the console to let the user know.
   std::cout << "Progress: " << response->progress_percent << std::endl;
   if (response->output.is_valid()) {
-    auto shared_memory = diagnostics::GetReadOnlySharedMemoryFromMojoHandle(
-        std::move(response->output));
-    if (shared_memory) {
+    auto shm_mapping =
+        diagnostics::GetReadOnlySharedMemoryMappingFromMojoHandle(
+            std::move(response->output));
+    if (shm_mapping.IsValid()) {
       std::cout << "Output: "
-                << std::string(
-                       static_cast<const char*>(shared_memory->memory()),
-                       shared_memory->mapped_size())
+                << std::string(shm_mapping.GetMemoryAs<const char>(),
+                               shm_mapping.mapped_size())
                 << std::endl;
     } else {
       LOG(ERROR) << "Failed to read output.";
diff --git a/diagnostics/cros_healthd/fake_cros_healthd_routine_factory.cc b/diagnostics/cros_healthd/fake_cros_healthd_routine_factory.cc
index c63facc..0b71e80 100644
--- a/diagnostics/cros_healthd/fake_cros_healthd_routine_factory.cc
+++ b/diagnostics/cros_healthd/fake_cros_healthd_routine_factory.cc
@@ -107,7 +107,7 @@
   DCHECK(response);
 
   response->progress_percent = progress_percent_;
-  response->output = CreateReadOnlySharedMemoryMojoHandle(output_);
+  response->output = CreateReadOnlySharedMemoryRegionMojoHandle(output_);
 }
 
 mojo_ipc::DiagnosticRoutineStatusEnum FakeDiagnosticRoutine::GetStatus() {
diff --git a/diagnostics/cros_healthd/routines/battery_discharge/battery_discharge.cc b/diagnostics/cros_healthd/routines/battery_discharge/battery_discharge.cc
index bfe4162..406b7ad 100644
--- a/diagnostics/cros_healthd/routines/battery_discharge/battery_discharge.cc
+++ b/diagnostics/cros_healthd/routines/battery_discharge/battery_discharge.cc
@@ -123,7 +123,7 @@
   response->progress_percent = progress_percent_;
   if (include_output) {
     response->output =
-        CreateReadOnlySharedMemoryMojoHandle(base::StringPiece(output_));
+        CreateReadOnlySharedMemoryRegionMojoHandle(base::StringPiece(output_));
   }
 }
 
diff --git a/diagnostics/cros_healthd/routines/battery_health/battery_health.cc b/diagnostics/cros_healthd/routines/battery_health/battery_health.cc
index 056fdc9..17474c0 100644
--- a/diagnostics/cros_healthd/routines/battery_health/battery_health.cc
+++ b/diagnostics/cros_healthd/routines/battery_health/battery_health.cc
@@ -128,7 +128,7 @@
     for (const auto& key_val : battery_health_log_)
       output += key_val.first + ": " + key_val.second + "\n";
     response->output =
-        CreateReadOnlySharedMemoryMojoHandle(base::StringPiece(output));
+        CreateReadOnlySharedMemoryRegionMojoHandle(base::StringPiece(output));
   }
 }
 
diff --git a/diagnostics/cros_healthd/routines/battery_health/battery_health_test.cc b/diagnostics/cros_healthd/routines/battery_health/battery_health_test.cc
index 0ebe393..0c6dddb 100644
--- a/diagnostics/cros_healthd/routines/battery_health/battery_health_test.cc
+++ b/diagnostics/cros_healthd/routines/battery_health/battery_health_test.cc
@@ -199,12 +199,12 @@
   base::StringPairs actual_output_pairs;
   ASSERT_TRUE(base::SplitStringIntoKeyValuePairs(ConstructOutput(), ':', '\n',
                                                  &expected_output_pairs));
-  auto shared_memory = diagnostics::GetReadOnlySharedMemoryFromMojoHandle(
+  auto shm_mapping = diagnostics::GetReadOnlySharedMemoryMappingFromMojoHandle(
       std::move(update()->output));
-  ASSERT_TRUE(shared_memory);
+  ASSERT_TRUE(shm_mapping.IsValid());
   ASSERT_TRUE(base::SplitStringIntoKeyValuePairs(
-      base::StringPiece(static_cast<const char*>(shared_memory->memory()),
-                        shared_memory->mapped_size()),
+      base::StringPiece(shm_mapping.GetMemoryAs<const char>(),
+                        shm_mapping.mapped_size()),
       ':', '\n', &actual_output_pairs));
   EXPECT_THAT(actual_output_pairs,
               UnorderedElementsAreArray(expected_output_pairs));
diff --git a/diagnostics/cros_healthd/routines/nvme_self_test/nvme_self_test.cc b/diagnostics/cros_healthd/routines/nvme_self_test/nvme_self_test.cc
index 3ec2361..c4a1b3c 100644
--- a/diagnostics/cros_healthd/routines/nvme_self_test/nvme_self_test.cc
+++ b/diagnostics/cros_healthd/routines/nvme_self_test/nvme_self_test.cc
@@ -153,8 +153,8 @@
     // raw data with output.
     if (status_ != mojo_ipc::DiagnosticRoutineStatusEnum::kPassed &&
         status_ != mojo_ipc::DiagnosticRoutineStatusEnum::kCancelled) {
-      response->output =
-          CreateReadOnlySharedMemoryMojoHandle("Raw debugd data: " + output_);
+      response->output = CreateReadOnlySharedMemoryRegionMojoHandle(
+          "Raw debugd data: " + output_);
     }
   }
 }
diff --git a/diagnostics/cros_healthd/routines/nvme_wear_level/nvme_wear_level.cc b/diagnostics/cros_healthd/routines/nvme_wear_level/nvme_wear_level.cc
index 4fde826..c94386a 100644
--- a/diagnostics/cros_healthd/routines/nvme_wear_level/nvme_wear_level.cc
+++ b/diagnostics/cros_healthd/routines/nvme_wear_level/nvme_wear_level.cc
@@ -88,8 +88,8 @@
     // raw data with output.
     if (status_ != mojo_ipc::DiagnosticRoutineStatusEnum::kPassed &&
         status_ != mojo_ipc::DiagnosticRoutineStatusEnum::kCancelled) {
-      response->output =
-          CreateReadOnlySharedMemoryMojoHandle("Raw debugd data: " + output_);
+      response->output = CreateReadOnlySharedMemoryRegionMojoHandle(
+          "Raw debugd data: " + output_);
     }
   }
 }
diff --git a/diagnostics/init/cros_healthd-seccomp-arm.policy b/diagnostics/init/cros_healthd-seccomp-arm.policy
index ef55254..e8f864f 100644
--- a/diagnostics/init/cros_healthd-seccomp-arm.policy
+++ b/diagnostics/init/cros_healthd-seccomp-arm.policy
@@ -76,6 +76,7 @@
 statfs: 1
 ftruncate: 1
 ftruncate64: 1
+fallocate: 1
 shmget: 1
 shmat: 1
 setsid: 1
diff --git a/diagnostics/init/wilco_dtc_supportd-seccomp-amd64.policy b/diagnostics/init/wilco_dtc_supportd-seccomp-amd64.policy
index 615b368..af4bc58 100644
--- a/diagnostics/init/wilco_dtc_supportd-seccomp-amd64.policy
+++ b/diagnostics/init/wilco_dtc_supportd-seccomp-amd64.policy
@@ -23,6 +23,7 @@
 execve: 1
 exit: 1
 exit_group: 1
+fallocate: 1
 fcntl: 1
 fstat: 1
 ftruncate: 1
diff --git a/diagnostics/wilco_dtc_supportd/core_test.cc b/diagnostics/wilco_dtc_supportd/core_test.cc
index c60a50c..2f1936c 100644
--- a/diagnostics/wilco_dtc_supportd/core_test.cc
+++ b/diagnostics/wilco_dtc_supportd/core_test.cc
@@ -745,14 +745,12 @@
         [](const base::Closure& callback,
            const std::string& expected_response_json_message,
            mojo::ScopedHandle response_json_message_handle) {
-          std::unique_ptr<base::SharedMemory> shared_memory =
-              GetReadOnlySharedMemoryFromMojoHandle(
-                  std::move(response_json_message_handle));
-          ASSERT_TRUE(shared_memory);
-          ASSERT_EQ(
-              expected_response_json_message,
-              std::string(static_cast<const char*>(shared_memory->memory()),
-                          shared_memory->mapped_size()));
+          auto shm_mapping = GetReadOnlySharedMemoryMappingFromMojoHandle(
+              std::move(response_json_message_handle));
+          ASSERT_TRUE(shm_mapping.IsValid());
+          ASSERT_EQ(expected_response_json_message,
+                    std::string(shm_mapping.GetMemoryAs<const char>(),
+                                shm_mapping.mapped_size()));
           callback.Run();
         },
         callback, expected_response_json_message);
@@ -915,7 +913,7 @@
           Invoke([kFakeMessageFromUi](
                      base::OnceCallback<void(mojo::ScopedHandle)> callback) {
             std::move(callback).Run(
-                CreateReadOnlySharedMemoryMojoHandle(kFakeMessageFromUi));
+                CreateReadOnlySharedMemoryRegionMojoHandle(kFakeMessageFromUi));
           })));
 
   std::unique_ptr<grpc_api::SendMessageToUiResponse> response;
@@ -1024,7 +1022,7 @@
                        MockMojoClient::MojoPerformWebRequestCallback callback) {
               std::move(callback).Run(
                   MojomWilcoDtcSupportdWebRequestStatus::kOk, kHttpStatusOk,
-                  CreateReadOnlySharedMemoryMojoHandle(kBodyResponse));
+                  CreateReadOnlySharedMemoryRegionMojoHandle(kBodyResponse));
             })));
     fake_wilco_dtc()->PerformWebRequest(
         request, MakeAsyncResponseWriter(run_loop.QuitClosure(), &response));
diff --git a/diagnostics/wilco_dtc_supportd/fake_browser.cc b/diagnostics/wilco_dtc_supportd/fake_browser.cc
index e0b7f71..98f4c0c 100644
--- a/diagnostics/wilco_dtc_supportd/fake_browser.cc
+++ b/diagnostics/wilco_dtc_supportd/fake_browser.cc
@@ -52,8 +52,8 @@
 bool FakeBrowser::SendUiMessageToWilcoDtc(
     const std::string& json_message,
     const base::Callback<void(mojo::ScopedHandle)>& callback) {
-  mojo::ScopedHandle handle =
-      CreateReadOnlySharedMemoryMojoHandle(base::StringPiece(json_message));
+  mojo::ScopedHandle handle = CreateReadOnlySharedMemoryRegionMojoHandle(
+      base::StringPiece(json_message));
   if (!handle.is_valid()) {
     return false;
   }
diff --git a/diagnostics/wilco_dtc_supportd/fake_diagnostics_service.cc b/diagnostics/wilco_dtc_supportd/fake_diagnostics_service.cc
index 138eae2..187ebbd 100644
--- a/diagnostics/wilco_dtc_supportd/fake_diagnostics_service.cc
+++ b/diagnostics/wilco_dtc_supportd/fake_diagnostics_service.cc
@@ -150,7 +150,7 @@
     const std::string& output) {
   routine_update_response_.progress_percent = progress_percent;
   routine_update_response_.output =
-      CreateReadOnlySharedMemoryMojoHandle(output);
+      CreateReadOnlySharedMemoryRegionMojoHandle(output);
   mojo_ipc::InteractiveRoutineUpdate interactive_update;
   interactive_update.user_message = user_message;
   routine_update_response_.routine_update_union->set_interactive_update(
@@ -164,7 +164,7 @@
     const std::string& output) {
   routine_update_response_.progress_percent = progress_percent;
   routine_update_response_.output =
-      CreateReadOnlySharedMemoryMojoHandle(output);
+      CreateReadOnlySharedMemoryRegionMojoHandle(output);
   mojo_ipc::NonInteractiveRoutineUpdate noninteractive_update;
   noninteractive_update.status = status;
   noninteractive_update.status_message = status_message;
diff --git a/diagnostics/wilco_dtc_supportd/mojo_service.cc b/diagnostics/wilco_dtc_supportd/mojo_service.cc
index 3ae1481..b83750e 100644
--- a/diagnostics/wilco_dtc_supportd/mojo_service.cc
+++ b/diagnostics/wilco_dtc_supportd/mojo_service.cc
@@ -29,7 +29,7 @@
     return;
   }
   mojo::ScopedHandle response_json_message_handle =
-      CreateReadOnlySharedMemoryMojoHandle(
+      CreateReadOnlySharedMemoryRegionMojoHandle(
           base::StringPiece(response_json_message));
   std::move(mojo_response_callback)
       .Run(std::move(response_json_message_handle));
@@ -38,19 +38,18 @@
 void ForwardMojoSendtoUiResponse(
     const MojoService::MojomSendWilcoDtcMessageToUiCallback& callback,
     mojo::ScopedHandle response_body_handle) {
-  auto shared_memory =
-      GetReadOnlySharedMemoryFromMojoHandle(std::move(response_body_handle));
-  if (!shared_memory) {
+  auto shm_mapping = GetReadOnlySharedMemoryMappingFromMojoHandle(
+      std::move(response_body_handle));
+  if (!shm_mapping.IsValid()) {
     LOG(ERROR) << "Failed to read data from mojo handle";
     callback.Run(grpc::Status(grpc::StatusCode::UNKNOWN,
                               "Failed to read data from mojo handle"),
                  base::StringPiece());
     return;
   }
-  callback.Run(
-      grpc::Status::OK,
-      base::StringPiece(static_cast<const char*>(shared_memory->memory()),
-                        shared_memory->mapped_size()));
+  callback.Run(grpc::Status::OK,
+               base::StringPiece(shm_mapping.GetMemoryAs<const char>(),
+                                 shm_mapping.mapped_size()));
 }
 
 void ForwardMojoWebResponse(
@@ -62,19 +61,18 @@
     callback.Run(status, http_status, base::StringPiece());
     return;
   }
-  auto shared_memory =
-      GetReadOnlySharedMemoryFromMojoHandle(std::move(response_body_handle));
-  if (!shared_memory) {
+  auto shm_mapping = GetReadOnlySharedMemoryMappingFromMojoHandle(
+      std::move(response_body_handle));
+  if (!shm_mapping.IsValid()) {
     LOG(ERROR) << "Failed to read data from mojo handle";
     callback.Run(
         MojoService::MojomWilcoDtcSupportdWebRequestStatus::kNetworkError, 0,
         base::StringPiece());
     return;
   }
-  callback.Run(
-      status, http_status,
-      base::StringPiece(static_cast<const char*>(shared_memory->memory()),
-                        shared_memory->mapped_size()));
+  callback.Run(status, http_status,
+               base::StringPiece(shm_mapping.GetMemoryAs<const char>(),
+                                 shm_mapping.mapped_size()));
 }
 
 }  // namespace
@@ -95,16 +93,15 @@
 
 void MojoService::SendUiMessageToWilcoDtc(
     mojo::ScopedHandle json_message, SendUiMessageToWilcoDtcCallback callback) {
-  std::unique_ptr<base::SharedMemory> shared_memory =
-      GetReadOnlySharedMemoryFromMojoHandle(std::move(json_message));
-  if (!shared_memory) {
+  auto shm_mapping =
+      GetReadOnlySharedMemoryMappingFromMojoHandle(std::move(json_message));
+  if (!shm_mapping.IsValid()) {
     LOG(ERROR) << "Failed to read data from mojo handle";
     std::move(callback).Run(mojo::ScopedHandle() /* response_json_message */);
     return;
   }
-  base::StringPiece json_message_content(
-      static_cast<const char*>(shared_memory->memory()),
-      shared_memory->mapped_size());
+  base::StringPiece json_message_content(shm_mapping.GetMemoryAs<const char>(),
+                                         shm_mapping.mapped_size());
 
   std::string json_error_message;
   if (!IsJsonValid(json_message_content, &json_error_message)) {
@@ -127,7 +124,7 @@
     const MojomSendWilcoDtcMessageToUiCallback& callback) {
   VLOG(1) << "SendWilcoDtcMessageToUi json_message=" << json_message;
   mojo::ScopedHandle json_message_mojo_handle =
-      CreateReadOnlySharedMemoryMojoHandle(json_message);
+      CreateReadOnlySharedMemoryRegionMojoHandle(json_message);
   if (!json_message_mojo_handle.is_valid()) {
     LOG(ERROR) << "Failed to create a mojo handle.";
     callback.Run(grpc::Status(grpc::StatusCode::UNKNOWN,
@@ -148,7 +145,8 @@
     const std::string& request_body,
     const MojomPerformWebRequestCallback& callback) {
   DCHECK(client_ptr_);
-  mojo::ScopedHandle url_handle = CreateReadOnlySharedMemoryMojoHandle(url);
+  mojo::ScopedHandle url_handle =
+      CreateReadOnlySharedMemoryRegionMojoHandle(url);
   if (!url_handle.is_valid()) {
     LOG(ERROR) << "Failed to create a mojo handle.";
     callback.Run(MojomWilcoDtcSupportdWebRequestStatus::kNetworkError, 0,
@@ -158,7 +156,8 @@
 
   std::vector<mojo::ScopedHandle> header_handles;
   for (const auto& header : headers) {
-    header_handles.push_back(CreateReadOnlySharedMemoryMojoHandle(header));
+    header_handles.push_back(
+        CreateReadOnlySharedMemoryRegionMojoHandle(header));
     if (!header_handles.back().is_valid()) {
       LOG(ERROR) << "Failed to create a mojo handle.";
       callback.Run(MojomWilcoDtcSupportdWebRequestStatus::kNetworkError, 0,
@@ -167,7 +166,7 @@
     }
   }
   mojo::ScopedHandle request_body_handle =
-      CreateReadOnlySharedMemoryMojoHandle(request_body);
+      CreateReadOnlySharedMemoryRegionMojoHandle(request_body);
   // Invalid handle for an empty |request_body| does not cause an error.
   if (!request_body.empty() && !request_body_handle.is_valid()) {
     LOG(ERROR) << "Failed to create a mojo handle.";
diff --git a/diagnostics/wilco_dtc_supportd/mojo_service_test.cc b/diagnostics/wilco_dtc_supportd/mojo_service_test.cc
index f13773b..0a4a1c8 100644
--- a/diagnostics/wilco_dtc_supportd/mojo_service_test.cc
+++ b/diagnostics/wilco_dtc_supportd/mojo_service_test.cc
@@ -94,7 +94,7 @@
           Invoke([kJsonMessageFromUi](
                      MockMojoClient::SendWilcoDtcMessageToUiCallback callback) {
             std::move(callback).Run(
-                CreateReadOnlySharedMemoryMojoHandle(kJsonMessageFromUi));
+                CreateReadOnlySharedMemoryRegionMojoHandle(kJsonMessageFromUi));
           })));
 
   base::RunLoop run_loop;
@@ -144,7 +144,7 @@
                      MockMojoClient::MojoPerformWebRequestCallback callback) {
             std::move(callback).Run(
                 kWebRequestStatus, kHttpStatusOk,
-                CreateReadOnlySharedMemoryMojoHandle(kBodyResponse));
+                CreateReadOnlySharedMemoryRegionMojoHandle(kBodyResponse));
           })));
 
   base::RunLoop run_loop;
diff --git a/diagnostics/wilco_dtc_supportd/routine_service.cc b/diagnostics/wilco_dtc_supportd/routine_service.cc
index 62e9af5..e9b7700 100644
--- a/diagnostics/wilco_dtc_supportd/routine_service.cc
+++ b/diagnostics/wilco_dtc_supportd/routine_service.cc
@@ -178,15 +178,14 @@
     return;
   }
 
-  auto shared_memory =
-      GetReadOnlySharedMemoryFromMojoHandle(std::move(mojo_update->output));
-  if (!shared_memory) {
+  auto shm_mapping = GetReadOnlySharedMemoryMappingFromMojoHandle(
+      std::move(mojo_update->output));
+  if (!shm_mapping.IsValid()) {
     PLOG(ERROR) << "Failed to read data from mojo handle";
     return;
   }
-  grpc_update->set_output(
-      std::string(static_cast<const char*>(shared_memory->memory()),
-                  shared_memory->mapped_size()));
+  grpc_update->set_output(std::string(shm_mapping.GetMemoryAs<const char>(),
+                                      shm_mapping.mapped_size()));
 }
 
 // Converts from gRPC's GetRoutineUpdateRequest::Command to mojo's