- add sources.
[platform/framework/web/crosswalk.git] / src / mojo / system / memory.h
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef MOJO_SYSTEM_MEMORY_H_
6 #define MOJO_SYSTEM_MEMORY_H_
7
8 #include <stddef.h>
9
10 #include "mojo/public/system/system_export.h"
11
12 namespace mojo {
13 namespace system {
14
15 // This is just forward-declared, with the definition and explicit
16 // instantiations in the .cc file. This is used by |VerifyUserPointer<T>()|
17 // below, and you should use that instead.
18 template <size_t size>
19 bool MOJO_SYSTEM_EXPORT VerifyUserPointerForSize(const void* pointer,
20                                                  size_t count);
21
22 // Verify that |count * sizeof(T)| bytes can be read from the user |pointer|
23 // insofar as possible/necessary (note: this is done carefully since |count *
24 // sizeof(T)| may overflow a |size_t|. |count| may be zero. If |T| is |void|,
25 // then the size of each element is taken to be a single byte.
26 //
27 // For example, if running in kernel mode, this should be a full verification
28 // that the given memory is owned and readable by the user process. In user
29 // mode, if crashes are acceptable, this may do nothing at all (and always
30 // return true).
31 template <typename T>
32 bool VerifyUserPointer(const T* pointer, size_t count) {
33   return VerifyUserPointerForSize<sizeof(T)>(pointer, count);
34 }
35
36 // Special-case |T| equals |void| so that the size is in bytes, as indicated
37 // above.
38 template <>
39 inline bool VerifyUserPointer<void>(const void* pointer, size_t count) {
40   return VerifyUserPointerForSize<1>(pointer, count);
41 }
42
43 }  // namespace system
44 }  // namespace mojo
45
46 #endif  // MOJO_SYSTEM_MEMORY_H_