// Copyright 2018 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef MOJO_PUBLIC_CPP_BASE_BIG_BUFFER_H_ #define MOJO_PUBLIC_CPP_BASE_BIG_BUFFER_H_ #include <cstdint> #include <optional> #include <vector> #include "base/component_export.h" #include "base/containers/heap_array.h" #include "base/containers/span.h" #include "base/memory/raw_span.h" #include "mojo/public/cpp/bindings/struct_traits.h" #include "mojo/public/cpp/system/buffer.h" namespace mojo_base { class BigBuffer; class BigBufferView; namespace internal { // Internal helper used by BigBuffer when backed by shared memory. class COMPONENT_EXPORT(MOJO_BASE) BigBufferSharedMemoryRegion { … }; } // namespace internal // BigBuffer represents a potentially large sequence of bytes. When passed over // mojom (as a mojo_base::mojom::BigBuffer union), it may serialize as either an // inlined array of bytes or as a shared buffer handle with the payload copied // into the corresponding shared memory region. This makes it easier to send // payloads of varying and unbounded size over IPC without fear of hitting // message size limits. // // A BigBuffer may be (implicitly) constructed over any span of bytes, and it // exposes simple |data()| and |size()| accessors akin to what common container // types provide. Users do not need to be concerned with the actual backing // storage used to implement this interface. // // SECURITY NOTE: When shmem is backing the message, it may be writable in the // sending process while being read in the receiving process. If a BigBuffer is // received from an untrustworthy process, you should make a copy of the data // before processing it to avoid time-of-check time-of-use (TOCTOU) bugs. // The |size()| of the data cannot be manipulated. class COMPONENT_EXPORT(MOJO_BASE) BigBuffer { … }; // Similar to BigBuffer, but doesn't *necessarily* own the buffer storage. // Namely, if constructed over a small enough span of memory, it will simply // retain a reference to that memory. This is generally only safe to use for // serialization and deserialization. class COMPONENT_EXPORT(MOJO_BASE) BigBufferView { … }; } // namespace mojo_base #endif // MOJO_PUBLIC_CPP_BASE_BIG_BUFFER_H_