cssmalloc.cpp
1 /* 2 * Copyright (c) 2000-2004,2006,2011,2014 Apple Inc. All Rights Reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. Please obtain a copy of the License at 10 * http://www.opensource.apple.com/apsl/ and read it before using this 11 * file. 12 * 13 * The Original Code and all software distributed under the License are 14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 18 * Please see the License for the specific language governing rights and 19 * limitations under the License. 20 * 21 * @APPLE_LICENSE_HEADER_END@ 22 */ 23 24 25 // 26 // cssmalloc - memory allocation in the CDSA world. 27 // 28 // Don't eat heavily before inspecting this code. 29 // 30 #include <security_cdsa_utilities/cssmalloc.h> 31 #include <stdlib.h> 32 #include <errno.h> 33 #include <os/overflow.h> 34 35 36 37 namespace Security { 38 39 40 // 41 // CssmMemoryFunctionsAllocators 42 // 43 void *CssmMemoryFunctionsAllocator::malloc(size_t size) 44 { return functions.malloc(size); } 45 46 void CssmMemoryFunctionsAllocator::free(void *addr) _NOEXCEPT 47 { return functions.free(addr); } 48 49 void *CssmMemoryFunctionsAllocator::realloc(void *addr, size_t size) 50 { return functions.realloc(addr, size); } 51 52 53 // 54 // CssmAllocatorMemoryFunctions 55 // 56 CssmAllocatorMemoryFunctions::CssmAllocatorMemoryFunctions(Allocator &alloc) 57 { 58 AllocRef = &alloc; 59 malloc_func = relayMalloc; 60 free_func = relayFree; 61 realloc_func = relayRealloc; 62 calloc_func = relayCalloc; 63 } 64 65 void *CssmAllocatorMemoryFunctions::relayMalloc(size_t size, void *ref) 66 { return allocator(ref).malloc(size); } 67 68 void CssmAllocatorMemoryFunctions::relayFree(void *mem, void *ref) _NOEXCEPT 69 { allocator(ref).free(mem); } 70 71 void *CssmAllocatorMemoryFunctions::relayRealloc(void *mem, size_t size, void *ref) 72 { return allocator(ref).realloc(mem, size); } 73 74 void *CssmAllocatorMemoryFunctions::relayCalloc(uint32 count, size_t size, void *ref) 75 { 76 // Allocator doesn't have a calloc() method 77 size_t alloc_size = 0; 78 if (os_mul_overflow(count, size, &alloc_size)) { 79 return NULL; 80 } 81 void *mem = allocator(ref).malloc(alloc_size); 82 memset(mem, 0, alloc_size); 83 return mem; 84 } 85 86 87 // 88 // CssmVector 89 // 90 91 92 } // namespace Security