1 /* 2 * alloc.c 3 * 4 * memory allocation and deallocation 5 * 6 * David A. McGrew 7 * Cisco Systems, Inc. 8 */ 9 /* 10 * 11 * Copyright (c) 2001-2006 Cisco Systems, Inc. 12 * All rights reserved. 13 * 14 * Redistribution and use in source and binary forms, with or without 15 * modification, are permitted provided that the following conditions 16 * are met: 17 * 18 * Redistributions of source code must retain the above copyright 19 * notice, this list of conditions and the following disclaimer. 20 * 21 * Redistributions in binary form must reproduce the above 22 * copyright notice, this list of conditions and the following 23 * disclaimer in the documentation and/or other materials provided 24 * with the distribution. 25 * 26 * Neither the name of the Cisco Systems, Inc. nor the names of its 27 * contributors may be used to endorse or promote products derived 28 * from this software without specific prior written permission. 29 * 30 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 31 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 32 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 33 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 34 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 35 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 36 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 37 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 40 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 41 * OF THE POSSIBILITY OF SUCH DAMAGE. 42 * 43 */ 44 45 #include "alloc.h" 46 #include "crypto_kernel.h" 47 48 /* the debug module for memory allocation */ 49 50 debug_module_t mod_alloc = { 51 0, /* debugging is off by default */ 52 "alloc" /* printable name for module */ 53 }; 54 55 /* 56 * Nota bene: the debugging statements for crypto_alloc() and 57 * crypto_free() have identical prefixes, which include the addresses 58 * of the memory locations on which they are operating. This fact can 59 * be used to locate memory leaks, by turning on memory debugging, 60 * grepping for 'alloc', then matching alloc and free calls by 61 * address. 62 */ 63 64 #ifdef SRTP_KERNEL_LINUX 65 66 #include <linux/interrupt.h> 67 68 void * 69 crypto_alloc(size_t size) { 70 void *ptr; 71 72 ptr = kmalloc(size, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL); 73 74 if (ptr) { 75 debug_print(mod_alloc, "(location: %p) allocated", ptr); 76 } else 77 debug_print(mod_alloc, "allocation failed (asked for %d bytes)\n", size); 78 79 return ptr; 80 } 81 82 void 83 crypto_free(void *ptr) { 84 85 debug_print(mod_alloc, "(location: %p) freed", ptr); 86 87 kfree(ptr); 88 } 89 90 91 #elif defined(HAVE_STDLIB_H) 92 93 void * 94 crypto_alloc(size_t size) { 95 void *ptr; 96 97 ptr = malloc(size); 98 99 if (ptr) { 100 debug_print(mod_alloc, "(location: %p) allocated", ptr); 101 } else 102 debug_print(mod_alloc, "allocation failed (asked for %d bytes)\n", size); 103 104 return ptr; 105 } 106 107 void 108 crypto_free(void *ptr) { 109 110 debug_print(mod_alloc, "(location: %p) freed", ptr); 111 112 free(ptr); 113 } 114 115 #else /* we need to define our own memory allocation routines */ 116 117 #error no memory allocation defined yet 118 119 #endif 120