]>
git.ipfire.org Git - thirdparty/openssl.git/blob - crypto/mem.c
2 * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the OpenSSL license (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
13 #include <openssl/crypto.h>
14 #include "internal/cryptlib.h"
17 * the following pointers may be changed as long as 'allow_customize' is set
19 static int allow_customize
= 1;
21 static void *(*malloc_impl
)(size_t, const char *, int)
23 static void *(*realloc_impl
)(void *, size_t, const char *, int)
25 static void (*free_impl
)(void *, const char *, int)
28 #ifndef OPENSSL_NO_CRYPTO_MDEBUG
29 static int call_malloc_debug
= 1;
31 static int call_malloc_debug
= 0;
34 int CRYPTO_set_mem_functions(
35 void *(*m
)(size_t, const char *, int),
36 void *(*r
)(void *, size_t, const char *, int),
37 void (*f
)(void *, const char *, int))
50 int CRYPTO_set_mem_debug(int flag
)
54 call_malloc_debug
= flag
;
58 void CRYPTO_get_mem_functions(
59 void *(**m
)(size_t, const char *, int),
60 void *(**r
)(void *, size_t, const char *, int),
61 void (**f
)(void *, const char *, int))
71 void *CRYPTO_malloc(size_t num
, const char *file
, int line
)
75 if (malloc_impl
!= NULL
&& malloc_impl
!= CRYPTO_malloc
)
76 return malloc_impl(num
, file
, line
);
82 #ifndef OPENSSL_NO_CRYPTO_MDEBUG
83 if (call_malloc_debug
) {
84 CRYPTO_mem_debug_malloc(NULL
, num
, 0, file
, line
);
86 CRYPTO_mem_debug_malloc(ret
, num
, 1, file
, line
);
91 osslargused(file
); osslargused(line
);
98 void *CRYPTO_zalloc(size_t num
, const char *file
, int line
)
100 void *ret
= CRYPTO_malloc(num
, file
, line
);
107 void *CRYPTO_realloc(void *str
, size_t num
, const char *file
, int line
)
109 if (realloc_impl
!= NULL
&& realloc_impl
!= &CRYPTO_realloc
)
110 return realloc_impl(str
, num
, file
, line
);
113 return CRYPTO_malloc(num
, file
, line
);
116 CRYPTO_free(str
, file
, line
);
121 #ifndef OPENSSL_NO_CRYPTO_MDEBUG
122 if (call_malloc_debug
) {
124 CRYPTO_mem_debug_realloc(str
, NULL
, num
, 0, file
, line
);
125 ret
= realloc(str
, num
);
126 CRYPTO_mem_debug_realloc(str
, ret
, num
, 1, file
, line
);
130 osslargused(file
); osslargused(line
);
132 return realloc(str
, num
);
136 void *CRYPTO_clear_realloc(void *str
, size_t old_len
, size_t num
,
137 const char *file
, int line
)
142 return CRYPTO_malloc(num
, file
, line
);
145 CRYPTO_clear_free(str
, old_len
, file
, line
);
149 /* Can't shrink the buffer since memcpy below copies |old_len| bytes. */
151 memset((char*)str
+ num
, 0, old_len
- num
);
155 ret
= CRYPTO_malloc(num
, file
, line
);
157 memcpy(ret
, str
, old_len
);
158 CRYPTO_clear_free(str
, old_len
, file
, line
);
163 void CRYPTO_free(void *str
, const char *file
, int line
)
165 if (free_impl
!= NULL
&& free_impl
!= &CRYPTO_free
) {
166 free_impl(str
, file
, line
);
170 #ifndef OPENSSL_NO_CRYPTO_MDEBUG
171 if (call_malloc_debug
) {
172 CRYPTO_mem_debug_free(str
, 0, file
, line
);
174 CRYPTO_mem_debug_free(str
, 1, file
, line
);
183 void CRYPTO_clear_free(void *str
, size_t num
, const char *file
, int line
)
188 OPENSSL_cleanse(str
, num
);
189 CRYPTO_free(str
, file
, line
);