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 #include "mojo/system/memory.h" 6 7 #include <limits> 8 9 #include "base/logging.h" 10 11 namespace mojo { 12 namespace system { 13 14 // TODO(vtl): Can I make this use the non-templatized function without a 15 // performance hit? 16 template <size_t size> 17 bool VerifyUserPointerForSize(const void* pointer, size_t count) { 18 if (count > std::numeric_limits<size_t>::max() / size) 19 return false; 20 21 // TODO(vtl): If running in kernel mode, do a full verification. For now, just 22 // check that it's non-null if |size| is nonzero. (A faster user mode 23 // implementation is also possible if this check is skipped.) 24 return count == 0 || !!pointer; 25 } 26 27 bool MOJO_SYSTEM_IMPL_EXPORT VerifyUserPointerForSize(const void* pointer, 28 size_t size, 29 size_t count) { 30 if (count > std::numeric_limits<size_t>::max() / size) 31 return false; 32 33 // TODO(vtl): If running in kernel mode, do a full verification. For now, just 34 // check that it's non-null if |size| is nonzero. (A faster user mode 35 // implementation is also possible if this check is skipped.) 36 return count == 0 || !!pointer; 37 } 38 39 // Explicitly instantiate the sizes we need. Add instantiations as needed. 40 template MOJO_SYSTEM_IMPL_EXPORT bool VerifyUserPointerForSize<1>( 41 const void*, size_t); 42 template MOJO_SYSTEM_IMPL_EXPORT bool VerifyUserPointerForSize<4>( 43 const void*, size_t); 44 template MOJO_SYSTEM_IMPL_EXPORT bool VerifyUserPointerForSize<8>( 45 const void*, size_t); 46 47 } // namespace system 48 } // namespace mojo 49