mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
64 lines
2.1 KiB
C++
64 lines
2.1 KiB
C++
// Copyright 2014 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_BOUNDS_CHECKER_H_
|
|
#define MOJO_PUBLIC_CPP_BINDINGS_LIB_BOUNDS_CHECKER_H_
|
|
|
|
#include <stdint.h>
|
|
|
|
#include "mojo/public/cpp/system/macros.h"
|
|
|
|
namespace mojo {
|
|
|
|
class Handle;
|
|
|
|
namespace internal {
|
|
|
|
// BoundsChecker is used to validate object sizes, pointers and handle indices
|
|
// for payload of incoming messages.
|
|
class BoundsChecker {
|
|
public:
|
|
// [data, data + data_num_bytes) specifies the initial valid memory range.
|
|
// [0, num_handles) specifies the initial valid range of handle indices.
|
|
BoundsChecker(const void* data, uint32_t data_num_bytes, size_t num_handles);
|
|
|
|
~BoundsChecker();
|
|
|
|
// Claims the specified memory range.
|
|
// The method succeeds if the range is valid to claim. (Please see
|
|
// the comments for IsValidRange().)
|
|
// On success, the valid memory range is shrinked to begin right after the end
|
|
// of the claimed range.
|
|
bool ClaimMemory(const void* position, uint32_t num_bytes);
|
|
|
|
// Claims the specified encoded handle (which is basically a handle index).
|
|
// The method succeeds if:
|
|
// - |encoded_handle|'s value is |kEncodedInvalidHandleValue|.
|
|
// - the handle is contained inside the valid range of handle indices. In this
|
|
// case, the valid range is shinked to begin right after the claimed handle.
|
|
bool ClaimHandle(const Handle& encoded_handle);
|
|
|
|
// Returns true if the specified range is not empty, and the range is
|
|
// contained inside the valid memory range.
|
|
bool IsValidRange(const void* position, uint32_t num_bytes) const;
|
|
|
|
private:
|
|
bool InternalIsValidRange(uintptr_t begin, uintptr_t end) const;
|
|
|
|
// [data_begin_, data_end_) is the valid memory range.
|
|
uintptr_t data_begin_;
|
|
uintptr_t data_end_;
|
|
|
|
// [handle_begin_, handle_end_) is the valid handle index range.
|
|
uint32_t handle_begin_;
|
|
uint32_t handle_end_;
|
|
|
|
MOJO_DISALLOW_COPY_AND_ASSIGN(BoundsChecker);
|
|
};
|
|
|
|
} // namespace internal
|
|
} // namespace mojo
|
|
|
|
#endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_BOUNDS_CHECKER_H_
|