Commit 5ebecd9a authored by Lei Zhang's avatar Lei Zhang Committed by Commit Bot

Add printing::CreateReadOnlySharedMemoryRegionWithData().

Consolidate non-trivial, repeated code that creates shared memory
regions inside sandboxed environments.

Change-Id: I29e0715a9d43fdde030ee0a2286f872b34576c8f
Reviewed-on: https://chromium-review.googlesource.com/1056393
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: default avatarKen Rockot <rockot@chromium.org>
Cr-Commit-Position: refs/heads/master@{#560783}
parent 01c1a77e
......@@ -10,7 +10,7 @@
#include "base/lazy_instance.h"
#include "base/stl_util.h"
#include "mojo/public/cpp/system/platform_handle.h"
#include "components/printing/service/public/cpp/pdf_service_mojo_utils.h"
#include "pdf/pdf.h"
#include "printing/emf_win.h"
#include "ui/gfx/gdi_util.h"
......@@ -163,22 +163,16 @@ base::ReadOnlySharedMemoryRegion PdfToEmfConverter::RenderPdfPageToMetafile(
metafile.FinishPage();
metafile.FinishDocument();
mojo::ScopedSharedBufferHandle emf_handle =
mojo::SharedBufferHandle::Create(metafile.GetDataSize());
mojo::ScopedSharedBufferHandle readonly_handle;
if (emf_handle.is_valid()) {
mojo::ScopedSharedBufferMapping emf_mapping =
emf_handle->Map(metafile.GetDataSize());
if (emf_mapping &&
metafile.GetData(emf_mapping.get(), metafile.GetDataSize())) {
readonly_handle =
emf_handle->Clone(mojo::SharedBufferHandle::AccessMode::READ_ONLY);
}
}
if (!readonly_handle.is_valid())
const uint32_t size = metafile.GetDataSize();
base::MappedReadOnlyRegion region_mapping =
CreateReadOnlySharedMemoryRegion(size);
if (!region_mapping.region.IsValid() || !region_mapping.mapping.IsValid())
return invalid_emf_region;
if (!metafile.GetData(region_mapping.mapping.memory(), size))
return invalid_emf_region;
return mojo::UnwrapReadOnlySharedMemoryRegion(std::move(readonly_handle));
return std::move(region_mapping.region);
}
void PdfToEmfConverter::ConvertPage(uint32_t page_number,
......
......@@ -8,10 +8,10 @@
#include <string>
#include <utility>
#include "components/printing/service/public/cpp/pdf_service_mojo_utils.h"
#include "components/pwg_encoder/bitmap_image.h"
#include "components/pwg_encoder/pwg_encoder.h"
#include "mojo/public/cpp/bindings/strong_binding.h"
#include "mojo/public/cpp/system/platform_handle.h"
#include "pdf/pdf.h"
#include "printing/pdf_render_settings.h"
......@@ -96,22 +96,13 @@ base::ReadOnlySharedMemoryRegion RenderPdfPagesToPwgRaster(
pwg_data += pwg_page;
}
mojo::ScopedSharedBufferHandle pwg_handle =
mojo::SharedBufferHandle::Create(pwg_data.size());
mojo::ScopedSharedBufferHandle readonly_handle;
if (pwg_handle.is_valid()) {
mojo::ScopedSharedBufferMapping pwg_mapping =
pwg_handle->Map(pwg_data.size());
if (pwg_mapping) {
memcpy(pwg_mapping.get(), pwg_data.data(), pwg_data.size());
readonly_handle =
pwg_handle->Clone(mojo::SharedBufferHandle::AccessMode::READ_ONLY);
}
}
if (!readonly_handle.is_valid())
base::MappedReadOnlyRegion region_mapping =
CreateReadOnlySharedMemoryRegion(pwg_data.size());
if (!region_mapping.region.IsValid() || !region_mapping.mapping.IsValid())
return invalid_pwg_region;
return mojo::UnwrapReadOnlySharedMemoryRegion(std::move(readonly_handle));
memcpy(region_mapping.mapping.memory(), pwg_data.data(), pwg_data.size());
return std::move(region_mapping.region);
}
} // namespace
......
......@@ -228,24 +228,15 @@ mojom::PdfCompositor::Status PdfCompositorImpl::CompositeToPdf(
}
doc->close();
const size_t size = wstream.bytesWritten();
mojo::ScopedSharedBufferHandle handle =
mojo::SharedBufferHandle::Create(size);
mojo::ScopedSharedBufferHandle readonly_handle;
if (handle.is_valid()) {
mojo::ScopedSharedBufferMapping mapping = handle->Map(size);
if (mapping) {
wstream.copyToAndReset(mapping.get());
readonly_handle =
handle->Clone(mojo::SharedBufferHandle::AccessMode::READ_ONLY);
}
}
if (!readonly_handle.is_valid()) {
base::MappedReadOnlyRegion region_mapping =
CreateReadOnlySharedMemoryRegion(wstream.bytesWritten());
if (!region_mapping.region.IsValid() || !region_mapping.mapping.IsValid()) {
DLOG(ERROR) << "CompositeToPdf: Cannot create new shared memory region.";
return mojom::PdfCompositor::Status::HANDLE_MAP_ERROR;
}
*region = mojo::UnwrapReadOnlySharedMemoryRegion(std::move(readonly_handle));
wstream.copyToAndReset(region_mapping.mapping.memory());
*region = std::move(region_mapping.region);
return mojom::PdfCompositor::Status::SUCCESS;
}
......
......@@ -7,10 +7,26 @@
#include <utility>
#include "base/memory/shared_memory.h"
#include "base/memory/writable_shared_memory_region.h"
#include "mojo/public/cpp/system/platform_handle.h"
namespace printing {
base::MappedReadOnlyRegion CreateReadOnlySharedMemoryRegion(size_t size) {
mojo::ScopedSharedBufferHandle handle =
mojo::SharedBufferHandle::Create(size);
base::WritableSharedMemoryRegion writable_region =
UnwrapWritableSharedMemoryRegion(std::move(handle));
base::WritableSharedMemoryMapping mapping = writable_region.Map();
if (!mapping.IsValid())
return {};
base::ReadOnlySharedMemoryRegion readonly_region =
base::WritableSharedMemoryRegion::ConvertToReadOnly(
std::move(writable_region));
return {std::move(readonly_region), std::move(mapping)};
}
std::unique_ptr<base::SharedMemory> GetShmFromMojoHandle(
mojo::ScopedSharedBufferHandle handle) {
base::SharedMemoryHandle memory_handle;
......
......@@ -7,6 +7,7 @@
#include <memory>
#include "base/memory/read_only_shared_memory_region.h"
#include "mojo/public/cpp/system/buffer.h"
namespace base {
......@@ -15,6 +16,10 @@ class SharedMemory;
namespace printing {
// Similar to base::ReadOnlySharedMemoryRegion::Create(), except it works inside
// sandboxed environments.
base::MappedReadOnlyRegion CreateReadOnlySharedMemoryRegion(size_t size);
std::unique_ptr<base::SharedMemory> GetShmFromMojoHandle(
mojo::ScopedSharedBufferHandle handle);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment