| //===-- sanitizer_allocator_checks.h ----------------------------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // Various checks shared between ThreadSanitizer, MemorySanitizer, etc. memory |
| // allocators. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef SANITIZER_ALLOCATOR_CHECKS_H |
| #define SANITIZER_ALLOCATOR_CHECKS_H |
| |
| #include "sanitizer_internal_defs.h" |
| #include "sanitizer_common.h" |
| #include "sanitizer_platform.h" |
| |
| namespace __sanitizer { |
| |
| // The following is defined in a separate compilation unit to avoid pulling in |
| // sanitizer_errno.h in this header, which leads to conflicts when other system |
| // headers include errno.h. This is usually the result of an unlikely event, |
| // and as such we do not care as much about having it inlined. |
| void SetErrnoToENOMEM(); |
| |
| // A common errno setting logic shared by almost all sanitizer allocator APIs. |
| inline void *SetErrnoOnNull(void *ptr) { |
| if (UNLIKELY(!ptr)) |
| SetErrnoToENOMEM(); |
| return ptr; |
| } |
| |
| // In case of the check failure, the caller of the following Check... functions |
| // should "return POLICY::OnBadRequest();" where POLICY is the current allocator |
| // failure handling policy. |
| |
| // Checks aligned_alloc() parameters, verifies that the alignment is a power of |
| // two and that the size is a multiple of alignment for POSIX implementation, |
| // and a bit relaxed requirement for non-POSIX ones, that the size is a multiple |
| // of alignment. |
| inline bool CheckAlignedAllocAlignmentAndSize(uptr alignment, uptr size) { |
| #if SANITIZER_POSIX |
| return alignment != 0 && IsPowerOfTwo(alignment) && |
| (size & (alignment - 1)) == 0; |
| #else |
| return alignment != 0 && size % alignment == 0; |
| #endif |
| } |
| |
| // Checks posix_memalign() parameters, verifies that alignment is a power of two |
| // and a multiple of sizeof(void *). |
| inline bool CheckPosixMemalignAlignment(uptr alignment) { |
| return alignment != 0 && IsPowerOfTwo(alignment) && |
| (alignment % sizeof(void *)) == 0; |
| } |
| |
| // Returns true if calloc(size, n) call overflows on size*n calculation. |
| inline bool CheckForCallocOverflow(uptr size, uptr n) { |
| if (!size) |
| return false; |
| uptr max = (uptr)-1L; |
| return (max / size) < n; |
| } |
| |
| // Returns true if the size passed to pvalloc overflows when rounded to the next |
| // multiple of page_size. |
| inline bool CheckForPvallocOverflow(uptr size, uptr page_size) { |
| return RoundUpTo(size, page_size) < size; |
| } |
| |
| } // namespace __sanitizer |
| |
| #endif // SANITIZER_ALLOCATOR_CHECKS_H |