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