| // Copyright 2013 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_SYSTEM_MEMORY_H_ |
| #define MOJO_SYSTEM_MEMORY_H_ |
| |
| #include <stddef.h> |
| |
| #include "mojo/public/c/system/macros.h" |
| #include "mojo/system/system_impl_export.h" |
| |
| namespace mojo { |
| namespace system { |
| |
| namespace internal { |
| |
| template <size_t size, size_t alignment> |
| bool MOJO_SYSTEM_IMPL_EXPORT VerifyUserPointerHelper(const void* pointer); |
| |
| // Note: This is also used by options_validation.h. |
| template <size_t size, size_t alignment> |
| bool MOJO_SYSTEM_IMPL_EXPORT VerifyUserPointerWithCountHelper( |
| const void* pointer, |
| size_t count); |
| |
| } // namespace internal |
| |
| // Verify (insofar as possible/necessary) that a |T| can be read from the user |
| // |pointer|. |
| template <typename T> |
| bool VerifyUserPointer(const T* pointer) { |
| return internal::VerifyUserPointerHelper<sizeof(T), MOJO_ALIGNOF(T)>(pointer); |
| } |
| |
| // Verify (insofar as possible/necessary) that |count| |T|s can be read from the |
| // user |pointer|; |count| may be zero. (This is done carefully since |count * |
| // sizeof(T)| may overflow a |size_t|.) |
| template <typename T> |
| bool VerifyUserPointerWithCount(const T* pointer, size_t count) { |
| return internal::VerifyUserPointerWithCountHelper<sizeof(T), |
| MOJO_ALIGNOF(T)>(pointer, |
| count); |
| } |
| |
| // Verify that |size| bytes (which may be zero) can be read from the user |
| // |pointer|, and that |pointer| has the specified |alignment| (if |size| is |
| // nonzero). |
| template <size_t alignment> |
| bool MOJO_SYSTEM_IMPL_EXPORT VerifyUserPointerWithSize(const void* pointer, |
| size_t size); |
| |
| } // namespace system |
| } // namespace mojo |
| |
| #endif // MOJO_SYSTEM_MEMORY_H_ |