blob: 73d68b5f0bf84e423b705916d8740c46f4fc8bc2 [file] [log] [blame]
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00001/* crypto/mem.c */
Ralf S. Engelschall58964a41998-12-21 10:56:39 +00002/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59#include <stdio.h>
60#include <stdlib.h>
Bodo Möller458cddc1999-07-19 09:25:35 +000061#include <openssl/crypto.h>
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000062#include "cryptlib.h"
63
Richard Levitte1f575f11999-11-12 02:51:24 +000064
Bodo Möller0cd08cc1999-12-18 05:22:50 +000065static int allow_customize = 1; /* we provide flexible functions for */
66static int allow_customize_debug = 1;/* exchanging memory-related functions at
67 * run-time, but this must be done
68 * before any blocks are actually
69 * allocated; or we'll run into huge
70 * problems when malloc/free pairs
71 * don't match etc. */
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000072
Bodo Möllera5435e82001-01-10 18:09:57 +000073
74
75/* the following pointers may be changed as long as 'allow_customize' is set */
76
Bodo Möller0cd08cc1999-12-18 05:22:50 +000077static void *(*malloc_func)(size_t) = malloc;
Bodo Möllera5435e82001-01-10 18:09:57 +000078static void *default_malloc_ex(size_t num, const char *file, int line)
79 { return malloc_func(num); }
80static void *(*malloc_ex_func)(size_t, const char *file, int line)
81 = default_malloc_ex;
82
Bodo Möller0cd08cc1999-12-18 05:22:50 +000083static void *(*realloc_func)(void *, size_t)= realloc;
Bodo Möllera5435e82001-01-10 18:09:57 +000084static void *default_realloc_ex(void *str, size_t num,
85 const char *file, int line)
86 { return realloc_func(str,num); }
87static void *(*realloc_ex_func)(void *, size_t, const char *file, int line)
88 = default_realloc_ex;
89
Bodo Möller0cd08cc1999-12-18 05:22:50 +000090static void (*free_func)(void *) = free;
91
Bodo Möllera5435e82001-01-10 18:09:57 +000092static void *(*malloc_locked_func)(size_t) = malloc;
93static void *default_malloc_locked_ex(size_t num, const char *file, int line)
94 { return malloc_locked_func(num); }
Richard Levitte65a22e82001-01-10 13:14:58 +000095static void *(*malloc_locked_ex_func)(size_t, const char *file, int line)
Bodo Möllera5435e82001-01-10 18:09:57 +000096 = default_malloc_locked_ex;
Richard Levitte65a22e82001-01-10 13:14:58 +000097
Bodo Möllera5435e82001-01-10 18:09:57 +000098static void (*free_locked_func)(void *) = free;
99
100
101
102/* may be changed as long as 'allow_customize_debug' is set */
Bodo Möller0cd08cc1999-12-18 05:22:50 +0000103/* XXX use correct function pointer types */
Dr. Stephen Henson364ce532011-04-12 13:01:40 +0000104#if defined(CRYPTO_MDEBUG)
Richard Levitte65962682000-05-02 13:36:50 +0000105/* use default functions from mem_dbg.c */
Geoff Thorpe63438292008-11-12 03:58:08 +0000106static void (*malloc_debug_func)(void *,int,const char *,int,int)
Richard Levitte65962682000-05-02 13:36:50 +0000107 = CRYPTO_dbg_malloc;
Geoff Thorpe63438292008-11-12 03:58:08 +0000108static void (*realloc_debug_func)(void *,void *,int,const char *,int,int)
Richard Levitte65962682000-05-02 13:36:50 +0000109 = CRYPTO_dbg_realloc;
110static void (*free_debug_func)(void *,int) = CRYPTO_dbg_free;
111static void (*set_debug_options_func)(long) = CRYPTO_dbg_set_options;
112static long (*get_debug_options_func)(void) = CRYPTO_dbg_get_options;
Richard Levittef3a2a041999-12-18 02:34:37 +0000113#else
Richard Levitte65962682000-05-02 13:36:50 +0000114/* applications can use CRYPTO_malloc_debug_init() to select above case
115 * at run-time */
Geoff Thorpe63438292008-11-12 03:58:08 +0000116static void (*malloc_debug_func)(void *,int,const char *,int,int) = NULL;
117static void (*realloc_debug_func)(void *,void *,int,const char *,int,int)
Richard Levitte65962682000-05-02 13:36:50 +0000118 = NULL;
119static void (*free_debug_func)(void *,int) = NULL;
120static void (*set_debug_options_func)(long) = NULL;
121static long (*get_debug_options_func)(void) = NULL;
Richard Levittef3a2a041999-12-18 02:34:37 +0000122#endif
Richard Levitte9ac42ed1999-12-17 12:56:24 +0000123
Dr. Stephen Hensonc4acfb12011-04-01 15:46:03 +0000124extern void OPENSSL_init(void);
Bodo Möller0cd08cc1999-12-18 05:22:50 +0000125
126int CRYPTO_set_mem_functions(void *(*m)(size_t), void *(*r)(void *, size_t),
127 void (*f)(void *))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000128 {
Dr. Stephen Hensonc4acfb12011-04-01 15:46:03 +0000129 /* Dummy call just to ensure OPENSSL_init() gets linked in */
130 OPENSSL_init();
Bodo Möller0cd08cc1999-12-18 05:22:50 +0000131 if (!allow_customize)
132 return 0;
Bodo Möllera5435e82001-01-10 18:09:57 +0000133 if ((m == 0) || (r == 0) || (f == 0))
Bodo Möller0cd08cc1999-12-18 05:22:50 +0000134 return 0;
Bodo Möllera5435e82001-01-10 18:09:57 +0000135 malloc_func=m; malloc_ex_func=default_malloc_ex;
136 realloc_func=r; realloc_ex_func=default_realloc_ex;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000137 free_func=f;
Bodo Möllera5435e82001-01-10 18:09:57 +0000138 malloc_locked_func=m; malloc_locked_ex_func=default_malloc_locked_ex;
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000139 free_locked_func=f;
Bodo Möller0cd08cc1999-12-18 05:22:50 +0000140 return 1;
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000141 }
142
Richard Levitte65a22e82001-01-10 13:14:58 +0000143int CRYPTO_set_mem_ex_functions(
144 void *(*m)(size_t,const char *,int),
145 void *(*r)(void *, size_t,const char *,int),
146 void (*f)(void *))
147 {
148 if (!allow_customize)
149 return 0;
Bodo Möllera5435e82001-01-10 18:09:57 +0000150 if ((m == 0) || (r == 0) || (f == 0))
151 return 0;
152 malloc_func=0; malloc_ex_func=m;
153 realloc_func=0; realloc_ex_func=r;
154 free_func=f;
155 malloc_locked_func=0; malloc_locked_ex_func=m;
156 free_locked_func=f;
Richard Levitte65a22e82001-01-10 13:14:58 +0000157 return 1;
158 }
159
Bodo Möller0cd08cc1999-12-18 05:22:50 +0000160int CRYPTO_set_locked_mem_functions(void *(*m)(size_t), void (*f)(void *))
Richard Levitte9ac42ed1999-12-17 12:56:24 +0000161 {
Bodo Möller0cd08cc1999-12-18 05:22:50 +0000162 if (!allow_customize)
163 return 0;
164 if ((m == NULL) || (f == NULL))
165 return 0;
Bodo Möllera5435e82001-01-10 18:09:57 +0000166 malloc_locked_func=m; malloc_locked_ex_func=default_malloc_locked_ex;
Bodo Möller0cd08cc1999-12-18 05:22:50 +0000167 free_locked_func=f;
168 return 1;
169 }
170
Richard Levitte65a22e82001-01-10 13:14:58 +0000171int CRYPTO_set_locked_mem_ex_functions(
172 void *(*m)(size_t,const char *,int),
173 void (*f)(void *))
174 {
175 if (!allow_customize)
176 return 0;
Bodo Möllera5435e82001-01-10 18:09:57 +0000177 if ((m == NULL) || (f == NULL))
178 return 0;
179 malloc_locked_func=0; malloc_locked_ex_func=m;
180 free_func=f;
Richard Levitte65a22e82001-01-10 13:14:58 +0000181 return 1;
182 }
183
Geoff Thorpe63438292008-11-12 03:58:08 +0000184int CRYPTO_set_mem_debug_functions(void (*m)(void *,int,const char *,int,int),
185 void (*r)(void *,void *,int,const char *,int,int),
Richard Levitte65962682000-05-02 13:36:50 +0000186 void (*f)(void *,int),
187 void (*so)(long),
188 long (*go)(void))
Bodo Möller0cd08cc1999-12-18 05:22:50 +0000189 {
190 if (!allow_customize_debug)
191 return 0;
Richard Levitte9ac42ed1999-12-17 12:56:24 +0000192 malloc_debug_func=m;
193 realloc_debug_func=r;
194 free_debug_func=f;
195 set_debug_options_func=so;
196 get_debug_options_func=go;
Bodo Möller0cd08cc1999-12-18 05:22:50 +0000197 return 1;
Richard Levitte9ac42ed1999-12-17 12:56:24 +0000198 }
199
Bodo Möllera5435e82001-01-10 18:09:57 +0000200
Bodo Möller0cd08cc1999-12-18 05:22:50 +0000201void CRYPTO_get_mem_functions(void *(**m)(size_t), void *(**r)(void *, size_t),
202 void (**f)(void *))
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000203 {
Bodo Möllerb93642c2001-01-10 19:26:34 +0000204 if (m != NULL) *m = (malloc_ex_func == default_malloc_ex) ?
205 malloc_func : 0;
206 if (r != NULL) *r = (realloc_ex_func == default_realloc_ex) ?
207 realloc_func : 0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000208 if (f != NULL) *f=free_func;
209 }
210
Richard Levitte65a22e82001-01-10 13:14:58 +0000211void CRYPTO_get_mem_ex_functions(
212 void *(**m)(size_t,const char *,int),
213 void *(**r)(void *, size_t,const char *,int),
214 void (**f)(void *))
215 {
Bodo Möllera5435e82001-01-10 18:09:57 +0000216 if (m != NULL) *m = (malloc_ex_func != default_malloc_ex) ?
217 malloc_ex_func : 0;
218 if (r != NULL) *r = (realloc_ex_func != default_realloc_ex) ?
219 realloc_ex_func : 0;
220 if (f != NULL) *f=free_func;
Richard Levitte65a22e82001-01-10 13:14:58 +0000221 }
222
Bodo Möller0cd08cc1999-12-18 05:22:50 +0000223void CRYPTO_get_locked_mem_functions(void *(**m)(size_t), void (**f)(void *))
224 {
Bodo Möllerb93642c2001-01-10 19:26:34 +0000225 if (m != NULL) *m = (malloc_locked_ex_func == default_malloc_locked_ex) ?
226 malloc_locked_func : 0;
Bodo Möller0cd08cc1999-12-18 05:22:50 +0000227 if (f != NULL) *f=free_locked_func;
228 }
229
Richard Levitte65a22e82001-01-10 13:14:58 +0000230void CRYPTO_get_locked_mem_ex_functions(
231 void *(**m)(size_t,const char *,int),
232 void (**f)(void *))
233 {
Bodo Möllera5435e82001-01-10 18:09:57 +0000234 if (m != NULL) *m = (malloc_locked_ex_func != default_malloc_locked_ex) ?
235 malloc_locked_ex_func : 0;
236 if (f != NULL) *f=free_locked_func;
Richard Levitte65a22e82001-01-10 13:14:58 +0000237 }
238
Geoff Thorpe63438292008-11-12 03:58:08 +0000239void CRYPTO_get_mem_debug_functions(void (**m)(void *,int,const char *,int,int),
240 void (**r)(void *,void *,int,const char *,int,int),
Richard Levitte65962682000-05-02 13:36:50 +0000241 void (**f)(void *,int),
242 void (**so)(long),
243 long (**go)(void))
Richard Levitte9ac42ed1999-12-17 12:56:24 +0000244 {
245 if (m != NULL) *m=malloc_debug_func;
246 if (r != NULL) *r=realloc_debug_func;
247 if (f != NULL) *f=free_debug_func;
248 if (so != NULL) *so=set_debug_options_func;
249 if (go != NULL) *go=get_debug_options_func;
250 }
251
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000252
Geoff Thorpe63438292008-11-12 03:58:08 +0000253void *CRYPTO_malloc_locked(int num, const char *file, int line)
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000254 {
Richard Levitte65962682000-05-02 13:36:50 +0000255 void *ret = NULL;
Richard Levitte9ac42ed1999-12-17 12:56:24 +0000256
Richard Levitte6781efb2003-12-01 12:06:15 +0000257 if (num <= 0) return NULL;
Richard Levitted5234c72003-02-19 11:54:42 +0000258
Bodo Möller0cd08cc1999-12-18 05:22:50 +0000259 allow_customize = 0;
Richard Levittef3a2a041999-12-18 02:34:37 +0000260 if (malloc_debug_func != NULL)
Bodo Möller0cd08cc1999-12-18 05:22:50 +0000261 {
262 allow_customize_debug = 0;
Richard Levittef3a2a041999-12-18 02:34:37 +0000263 malloc_debug_func(NULL, num, file, line, 0);
Bodo Möller0cd08cc1999-12-18 05:22:50 +0000264 }
Richard Levitte65a22e82001-01-10 13:14:58 +0000265 ret = malloc_locked_ex_func(num,file,line);
Richard Levitte8d28d5f2000-12-13 17:15:03 +0000266#ifdef LEVITTE_DEBUG_MEM
267 fprintf(stderr, "LEVITTE_DEBUG_MEM: > 0x%p (%d)\n", ret, num);
Richard Levitte9ac42ed1999-12-17 12:56:24 +0000268#endif
Richard Levittef3a2a041999-12-18 02:34:37 +0000269 if (malloc_debug_func != NULL)
270 malloc_debug_func(ret, num, file, line, 1);
Richard Levitte9ac42ed1999-12-17 12:56:24 +0000271
Andy Polyakovb2dba9b2007-05-14 21:35:25 +0000272#ifndef OPENSSL_CPUID_OBJ
Richard Levittedf29cc82002-11-27 12:24:05 +0000273 /* Create a dependency on the value of 'cleanse_ctr' so our memory
274 * sanitisation function can't be optimised out. NB: We only do
275 * this for >2Kb so the overhead doesn't bother us. */
276 if(ret && (num > 2048))
Andy Polyakovb2dba9b2007-05-14 21:35:25 +0000277 { extern unsigned char cleanse_ctr;
Richard Levittedf29cc82002-11-27 12:24:05 +0000278 ((unsigned char *)ret)[0] = cleanse_ctr;
Andy Polyakovb2dba9b2007-05-14 21:35:25 +0000279 }
280#endif
Richard Levittedf29cc82002-11-27 12:24:05 +0000281
Richard Levitte9ac42ed1999-12-17 12:56:24 +0000282 return ret;
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000283 }
284
Ulf Möller6b691a51999-04-19 21:31:43 +0000285void CRYPTO_free_locked(void *str)
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000286 {
Richard Levittef3a2a041999-12-18 02:34:37 +0000287 if (free_debug_func != NULL)
288 free_debug_func(str, 0);
Richard Levitte8d28d5f2000-12-13 17:15:03 +0000289#ifdef LEVITTE_DEBUG_MEM
290 fprintf(stderr, "LEVITTE_DEBUG_MEM: < 0x%p\n", str);
Richard Levitte9ac42ed1999-12-17 12:56:24 +0000291#endif
Bodo Möllera5435e82001-01-10 18:09:57 +0000292 free_locked_func(str);
Richard Levittef3a2a041999-12-18 02:34:37 +0000293 if (free_debug_func != NULL)
294 free_debug_func(NULL, 1);
Ralf S. Engelschalldfeab061998-12-21 11:00:56 +0000295 }
296
Geoff Thorpe63438292008-11-12 03:58:08 +0000297void *CRYPTO_malloc(int num, const char *file, int line)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000298 {
Richard Levitte65962682000-05-02 13:36:50 +0000299 void *ret = NULL;
Richard Levitte9ac42ed1999-12-17 12:56:24 +0000300
Richard Levitte6781efb2003-12-01 12:06:15 +0000301 if (num <= 0) return NULL;
Richard Levitted5234c72003-02-19 11:54:42 +0000302
Bodo Möller0cd08cc1999-12-18 05:22:50 +0000303 allow_customize = 0;
Richard Levittef3a2a041999-12-18 02:34:37 +0000304 if (malloc_debug_func != NULL)
Bodo Möller0cd08cc1999-12-18 05:22:50 +0000305 {
306 allow_customize_debug = 0;
Richard Levittef3a2a041999-12-18 02:34:37 +0000307 malloc_debug_func(NULL, num, file, line, 0);
Bodo Möller0cd08cc1999-12-18 05:22:50 +0000308 }
Richard Levitte65a22e82001-01-10 13:14:58 +0000309 ret = malloc_ex_func(num,file,line);
Richard Levitte8d28d5f2000-12-13 17:15:03 +0000310#ifdef LEVITTE_DEBUG_MEM
311 fprintf(stderr, "LEVITTE_DEBUG_MEM: > 0x%p (%d)\n", ret, num);
Richard Levitte9ac42ed1999-12-17 12:56:24 +0000312#endif
Richard Levittef3a2a041999-12-18 02:34:37 +0000313 if (malloc_debug_func != NULL)
314 malloc_debug_func(ret, num, file, line, 1);
Richard Levitte9ac42ed1999-12-17 12:56:24 +0000315
Andy Polyakovb2dba9b2007-05-14 21:35:25 +0000316#ifndef OPENSSL_CPUID_OBJ
Richard Levittedf29cc82002-11-27 12:24:05 +0000317 /* Create a dependency on the value of 'cleanse_ctr' so our memory
318 * sanitisation function can't be optimised out. NB: We only do
319 * this for >2Kb so the overhead doesn't bother us. */
320 if(ret && (num > 2048))
Andy Polyakovb2dba9b2007-05-14 21:35:25 +0000321 { extern unsigned char cleanse_ctr;
Richard Levittedf29cc82002-11-27 12:24:05 +0000322 ((unsigned char *)ret)[0] = cleanse_ctr;
Andy Polyakovb2dba9b2007-05-14 21:35:25 +0000323 }
324#endif
Richard Levittedf29cc82002-11-27 12:24:05 +0000325
Richard Levitte9ac42ed1999-12-17 12:56:24 +0000326 return ret;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000327 }
Ben Laurie6caa4ed2008-10-26 18:40:52 +0000328char *CRYPTO_strdup(const char *str, const char *file, int line)
329 {
330 char *ret = CRYPTO_malloc(strlen(str)+1, file, line);
331
332 strcpy(ret, str);
333 return ret;
334 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000335
Geoff Thorpe63438292008-11-12 03:58:08 +0000336void *CRYPTO_realloc(void *str, int num, const char *file, int line)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000337 {
Richard Levitte65962682000-05-02 13:36:50 +0000338 void *ret = NULL;
Richard Levitte9ac42ed1999-12-17 12:56:24 +0000339
Richard Levitte04728832002-08-01 10:08:37 +0000340 if (str == NULL)
341 return CRYPTO_malloc(num, file, line);
Richard Levitted5234c72003-02-19 11:54:42 +0000342
Richard Levitte6781efb2003-12-01 12:06:15 +0000343 if (num <= 0) return NULL;
Richard Levitted5234c72003-02-19 11:54:42 +0000344
Richard Levittef3a2a041999-12-18 02:34:37 +0000345 if (realloc_debug_func != NULL)
346 realloc_debug_func(str, NULL, num, file, line, 0);
Richard Levitte65a22e82001-01-10 13:14:58 +0000347 ret = realloc_ex_func(str,num,file,line);
Richard Levitte8d28d5f2000-12-13 17:15:03 +0000348#ifdef LEVITTE_DEBUG_MEM
349 fprintf(stderr, "LEVITTE_DEBUG_MEM: | 0x%p -> 0x%p (%d)\n", str, ret, num);
Richard Levitte9ac42ed1999-12-17 12:56:24 +0000350#endif
Richard Levittef3a2a041999-12-18 02:34:37 +0000351 if (realloc_debug_func != NULL)
352 realloc_debug_func(str, ret, num, file, line, 1);
Richard Levitte9ac42ed1999-12-17 12:56:24 +0000353
354 return ret;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000355 }
356
Geoff Thorpe63438292008-11-12 03:58:08 +0000357void *CRYPTO_realloc_clean(void *str, int old_len, int num, const char *file,
358 int line)
Ben Laurie54a656e2002-11-13 15:43:43 +0000359 {
360 void *ret = NULL;
361
362 if (str == NULL)
363 return CRYPTO_malloc(num, file, line);
Richard Levitted5234c72003-02-19 11:54:42 +0000364
Richard Levitte6781efb2003-12-01 12:06:15 +0000365 if (num <= 0) return NULL;
Richard Levitted5234c72003-02-19 11:54:42 +0000366
Ben Laurie54a656e2002-11-13 15:43:43 +0000367 if (realloc_debug_func != NULL)
368 realloc_debug_func(str, NULL, num, file, line, 0);
369 ret=malloc_ex_func(num,file,line);
370 if(ret)
Richard Levitte83eb4122003-10-07 12:09:39 +0000371 {
Ben Laurie54a656e2002-11-13 15:43:43 +0000372 memcpy(ret,str,old_len);
Richard Levitte83eb4122003-10-07 12:09:39 +0000373 OPENSSL_cleanse(str,old_len);
374 free_func(str);
375 }
Ben Laurie54a656e2002-11-13 15:43:43 +0000376#ifdef LEVITTE_DEBUG_MEM
Richard Levitte83eb4122003-10-07 12:09:39 +0000377 fprintf(stderr,
378 "LEVITTE_DEBUG_MEM: | 0x%p -> 0x%p (%d)\n",
379 str, ret, num);
Ben Laurie54a656e2002-11-13 15:43:43 +0000380#endif
381 if (realloc_debug_func != NULL)
382 realloc_debug_func(str, ret, num, file, line, 1);
383
384 return ret;
385 }
386
Ulf Möller6b691a51999-04-19 21:31:43 +0000387void CRYPTO_free(void *str)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000388 {
Richard Levittef3a2a041999-12-18 02:34:37 +0000389 if (free_debug_func != NULL)
390 free_debug_func(str, 0);
Richard Levitte8d28d5f2000-12-13 17:15:03 +0000391#ifdef LEVITTE_DEBUG_MEM
392 fprintf(stderr, "LEVITTE_DEBUG_MEM: < 0x%p\n", str);
Richard Levitte9ac42ed1999-12-17 12:56:24 +0000393#endif
Bodo Möllera5435e82001-01-10 18:09:57 +0000394 free_func(str);
Richard Levittef3a2a041999-12-18 02:34:37 +0000395 if (free_debug_func != NULL)
396 free_debug_func(NULL, 1);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000397 }
398
Geoff Thorpe63438292008-11-12 03:58:08 +0000399void *CRYPTO_remalloc(void *a, int num, const char *file, int line)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000400 {
Richard Levitte26a3a482000-06-01 22:19:21 +0000401 if (a != NULL) OPENSSL_free(a);
Geoff Thorpe63438292008-11-12 03:58:08 +0000402 a=(char *)OPENSSL_malloc(num);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000403 return(a);
404 }
405
Bodo Möller0cd08cc1999-12-18 05:22:50 +0000406void CRYPTO_set_mem_debug_options(long bits)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000407 {
Richard Levittef3a2a041999-12-18 02:34:37 +0000408 if (set_debug_options_func != NULL)
409 set_debug_options_func(bits);
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000410 }
411
Ralf S. Engelschall667ac4e2000-02-11 09:47:18 +0000412long CRYPTO_get_mem_debug_options(void)
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000413 {
Richard Levittef3a2a041999-12-18 02:34:37 +0000414 if (get_debug_options_func != NULL)
415 return get_debug_options_func();
Bodo Möller0cd08cc1999-12-18 05:22:50 +0000416 return 0;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +0000417 }