1/* 2 * Copyright (c) 2000-2001 Apple Computer, Inc. All Rights Reserved. 3 * 4 * The contents of this file constitute Original Code as defined in and are 5 * subject to the Apple Public Source License Version 1.2 (the 'License'). 6 * You may not use this file except in compliance with the License. Please obtain 7 * a copy of the License at http://www.apple.com/publicsource and read it before 8 * using this file. 9 * 10 * This Original Code and all software distributed under the License are 11 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS 12 * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT 13 * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 14 * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the 15 * specific language governing rights and limitations under the License. 16 */ 17 18 19/* crypto/mem.c */ 20/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 21 * All rights reserved. 22 * 23 * This package is an SSL implementation written 24 * by Eric Young (eay@cryptsoft.com). 25 * The implementation was written so as to conform with Netscapes SSL. 26 * 27 * This library is free for commercial and non-commercial use as long as 28 * the following conditions are aheared to. The following conditions 29 * apply to all code found in this distribution, be it the RC4, RSA, 30 * lhash, DES, etc., code; not just the SSL code. The SSL documentation 31 * included with this distribution is covered by the same copyright terms 32 * except that the holder is Tim Hudson (tjh@cryptsoft.com). 33 * 34 * Copyright remains Eric Young's, and as such any Copyright notices in 35 * the code are not to be removed. 36 * If this package is used in a product, Eric Young should be given attribution 37 * as the author of the parts of the library used. 38 * This can be in the form of a textual message at program startup or 39 * in documentation (online or textual) provided with the package. 40 * 41 * Redistribution and use in source and binary forms, with or without 42 * modification, are permitted provided that the following conditions 43 * are met: 44 * 1. Redistributions of source code must retain the copyright 45 * notice, this list of conditions and the following disclaimer. 46 * 2. Redistributions in binary form must reproduce the above copyright 47 * notice, this list of conditions and the following disclaimer in the 48 * documentation and/or other materials provided with the distribution. 49 * 3. All advertising materials mentioning features or use of this software 50 * must display the following acknowledgement: 51 * "This product includes cryptographic software written by 52 * Eric Young (eay@cryptsoft.com)" 53 * The word 'cryptographic' can be left out if the rouines from the library 54 * being used are not cryptographic related :-). 55 * 4. If you include any Windows specific code (or a derivative thereof) from 56 * the apps directory (application code) you must include an acknowledgement: 57 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 58 * 59 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 60 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 61 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 62 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 63 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 64 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 65 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 66 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 67 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 68 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 69 * SUCH DAMAGE. 70 * 71 * The licence and distribution terms for any publically available version or 72 * derivative of this code cannot be changed. i.e. this code cannot simply be 73 * copied and put under another distribution licence 74 * [including the GNU Public Licence.] 75 */ 76 77#include <stdio.h> 78#include <stdlib.h> 79#include <openssl/crypto.h> 80#include "cryptlib.h" 81 82 83static int allow_customize = 1; /* we provide flexible functions for */ 84static int allow_customize_debug = 1;/* exchanging memory-related functions at 85 * run-time, but this must be done 86 * before any blocks are actually 87 * allocated; or we'll run into huge 88 * problems when malloc/free pairs 89 * don't match etc. */ 90 91/* may be changed as long as `allow_customize' is set */ 92static void *(*malloc_locked_func)(size_t) = malloc; 93static void (*free_locked_func)(void *) = free; 94static void *(*malloc_func)(size_t) = malloc; 95static void *(*realloc_func)(void *, size_t)= realloc; 96static void (*free_func)(void *) = free; 97 98/* may be changed as long as `allow_customize_debug' is set */ 99/* XXX use correct function pointer types */ 100#ifdef CRYPTO_MDEBUG 101 /* use default functions from mem_dbg.c */ 102 static void (*malloc_debug_func)()= (void (*)())CRYPTO_dbg_malloc; 103 static void (*realloc_debug_func)()= (void (*)())CRYPTO_dbg_realloc; 104 static void (*free_debug_func)()= (void (*)())CRYPTO_dbg_free; 105 static void (*set_debug_options_func)()= (void (*)())CRYPTO_dbg_set_options; 106 static long (*get_debug_options_func)()= (long (*)())CRYPTO_dbg_get_options; 107#else 108 /* applications can use CRYPTO_malloc_debug_init() to select above case 109 * at run-time */ 110 static void (*malloc_debug_func)()= NULL; 111 static void (*realloc_debug_func)()= NULL; 112 static void (*free_debug_func)()= NULL; 113 static void (*set_debug_options_func)()= NULL; 114 static long (*get_debug_options_func)()= NULL; 115#endif 116 117 118int CRYPTO_set_mem_functions(void *(*m)(size_t), void *(*r)(void *, size_t), 119 void (*f)(void *)) 120 { 121 if (!allow_customize) 122 return 0; 123 if ((m == NULL) || (r == NULL) || (f == NULL)) 124 return 0; 125 malloc_func=m; 126 realloc_func=r; 127 free_func=f; 128 malloc_locked_func=m; 129 free_locked_func=f; 130 return 1; 131 } 132 133int CRYPTO_set_locked_mem_functions(void *(*m)(size_t), void (*f)(void *)) 134 { 135 if (!allow_customize) 136 return 0; 137 if ((m == NULL) || (f == NULL)) 138 return 0; 139 malloc_locked_func=m; 140 free_locked_func=f; 141 return 1; 142 } 143 144int CRYPTO_set_mem_debug_functions(void (*m)(), void (*r)(), void (*f)(),void (*so)(),long (*go)()) 145 { 146 if (!allow_customize_debug) 147 return 0; 148 malloc_debug_func=m; 149 realloc_debug_func=r; 150 free_debug_func=f; 151 set_debug_options_func=so; 152 get_debug_options_func=go; 153 return 1; 154 } 155 156void CRYPTO_get_mem_functions(void *(**m)(size_t), void *(**r)(void *, size_t), 157 void (**f)(void *)) 158 { 159 if (m != NULL) *m=malloc_func; 160 if (r != NULL) *r=realloc_func; 161 if (f != NULL) *f=free_func; 162 } 163 164void CRYPTO_get_locked_mem_functions(void *(**m)(size_t), void (**f)(void *)) 165 { 166 if (m != NULL) *m=malloc_locked_func; 167 if (f != NULL) *f=free_locked_func; 168 } 169 170void CRYPTO_get_mem_debug_functions(void (**m)(), void (**r)(), void (**f)(),void (**so)(),long (**go)()) 171 { 172 if (m != NULL) *m=malloc_debug_func; 173 if (r != NULL) *r=realloc_debug_func; 174 if (f != NULL) *f=free_debug_func; 175 if (so != NULL) *so=set_debug_options_func; 176 if (go != NULL) *go=get_debug_options_func; 177 } 178 179 180void *CRYPTO_malloc_locked(int num, const char *file, int line) 181 { 182 char *ret = NULL; 183 184 allow_customize = 0; 185 if (malloc_debug_func != NULL) 186 { 187 allow_customize_debug = 0; 188 malloc_debug_func(NULL, num, file, line, 0); 189 } 190 ret = malloc_locked_func(num); 191#ifdef LEVITTE_DEBUG 192 fprintf(stderr, "LEVITTE_DEBUG: > 0x%p (%d)\n", ret, num); 193#endif 194 if (malloc_debug_func != NULL) 195 malloc_debug_func(ret, num, file, line, 1); 196 197 return ret; 198 } 199 200void CRYPTO_free_locked(void *str) 201 { 202 if (free_debug_func != NULL) 203 free_debug_func(str, 0); 204#ifdef LEVITTE_DEBUG 205 fprintf(stderr, "LEVITTE_DEBUG: < 0x%p\n", str); 206#endif 207 free_locked_func(str); 208 if (free_debug_func != NULL) 209 free_debug_func(NULL, 1); 210 } 211 212void *CRYPTO_malloc(int num, const char *file, int line) 213 { 214 char *ret = NULL; 215 216 allow_customize = 0; 217 if (malloc_debug_func != NULL) 218 { 219 allow_customize_debug = 0; 220 malloc_debug_func(NULL, num, file, line, 0); 221 } 222 ret = malloc_func(num); 223#ifdef LEVITTE_DEBUG 224 fprintf(stderr, "LEVITTE_DEBUG: > 0x%p (%d)\n", ret, num); 225#endif 226 if (malloc_debug_func != NULL) 227 malloc_debug_func(ret, num, file, line, 1); 228 229 return ret; 230 } 231 232void *CRYPTO_realloc(void *str, int num, const char *file, int line) 233 { 234 char *ret = NULL; 235 236 if (realloc_debug_func != NULL) 237 realloc_debug_func(str, NULL, num, file, line, 0); 238 ret = realloc_func(str,num); 239#ifdef LEVITTE_DEBUG 240 fprintf(stderr, "LEVITTE_DEBUG: | 0x%p -> 0x%p (%d)\n", str, ret, num); 241#endif 242 if (realloc_debug_func != NULL) 243 realloc_debug_func(str, ret, num, file, line, 1); 244 245 return ret; 246 } 247 248void CRYPTO_free(void *str) 249 { 250 if (free_debug_func != NULL) 251 free_debug_func(str, 0); 252#ifdef LEVITTE_DEBUG 253 fprintf(stderr, "LEVITTE_DEBUG: < 0x%p\n", str); 254#endif 255 free_func(str); 256 if (free_debug_func != NULL) 257 free_debug_func(NULL, 1); 258 } 259 260void *CRYPTO_remalloc(void *a, int num, const char *file, int line) 261 { 262 if (a != NULL) Free(a); 263 a=(char *)Malloc(num); 264 return(a); 265 } 266 267 268void CRYPTO_set_mem_debug_options(long bits) 269 { 270 if (set_debug_options_func != NULL) 271 set_debug_options_func(bits); 272 } 273 274long CRYPTO_get_mem_debug_options(void) 275 { 276 if (get_debug_options_func != NULL) 277 return get_debug_options_func(); 278 return 0; 279 } 280