Xuyi Wang / wolfSSL

Dependents:   OS

Committer:
wolfSSL
Date:
Thu Apr 28 00:57:21 2016 +0000
Revision:
4:1b0d80432c79
wolfSSL 3.9.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wolfSSL 4:1b0d80432c79 1 /* memory.c
wolfSSL 4:1b0d80432c79 2 *
wolfSSL 4:1b0d80432c79 3 * Copyright (C) 2006-2016 wolfSSL Inc.
wolfSSL 4:1b0d80432c79 4 *
wolfSSL 4:1b0d80432c79 5 * This file is part of wolfSSL.
wolfSSL 4:1b0d80432c79 6 *
wolfSSL 4:1b0d80432c79 7 * wolfSSL is free software; you can redistribute it and/or modify
wolfSSL 4:1b0d80432c79 8 * it under the terms of the GNU General Public License as published by
wolfSSL 4:1b0d80432c79 9 * the Free Software Foundation; either version 2 of the License, or
wolfSSL 4:1b0d80432c79 10 * (at your option) any later version.
wolfSSL 4:1b0d80432c79 11 *
wolfSSL 4:1b0d80432c79 12 * wolfSSL is distributed in the hope that it will be useful,
wolfSSL 4:1b0d80432c79 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
wolfSSL 4:1b0d80432c79 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
wolfSSL 4:1b0d80432c79 15 * GNU General Public License for more details.
wolfSSL 4:1b0d80432c79 16 *
wolfSSL 4:1b0d80432c79 17 * You should have received a copy of the GNU General Public License
wolfSSL 4:1b0d80432c79 18 * along with this program; if not, write to the Free Software
wolfSSL 4:1b0d80432c79 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
wolfSSL 4:1b0d80432c79 20 */
wolfSSL 4:1b0d80432c79 21
wolfSSL 4:1b0d80432c79 22
wolfSSL 4:1b0d80432c79 23 #ifdef HAVE_CONFIG_H
wolfSSL 4:1b0d80432c79 24 #include <config.h>
wolfSSL 4:1b0d80432c79 25 #endif
wolfSSL 4:1b0d80432c79 26
wolfSSL 4:1b0d80432c79 27 #include <wolfssl/wolfcrypt/settings.h>
wolfSSL 4:1b0d80432c79 28
wolfSSL 4:1b0d80432c79 29 /* check old macros @wc_fips */
wolfSSL 4:1b0d80432c79 30 #if defined(USE_CYASSL_MEMORY) && !defined(USE_WOLFSSL_MEMORY)
wolfSSL 4:1b0d80432c79 31 #define USE_WOLFSSL_MEMORY
wolfSSL 4:1b0d80432c79 32 #endif
wolfSSL 4:1b0d80432c79 33 #if defined(CYASSL_MALLOC_CHECK) && !defined(WOLFSSL_MALLOC_CHECK)
wolfSSL 4:1b0d80432c79 34 #define WOLFSSL_MALLOC_CHECK
wolfSSL 4:1b0d80432c79 35 #endif
wolfSSL 4:1b0d80432c79 36
wolfSSL 4:1b0d80432c79 37 #ifdef USE_WOLFSSL_MEMORY
wolfSSL 4:1b0d80432c79 38
wolfSSL 4:1b0d80432c79 39 #include <wolfssl/wolfcrypt/memory.h>
wolfSSL 4:1b0d80432c79 40 #include <wolfssl/wolfcrypt/error-crypt.h>
wolfSSL 4:1b0d80432c79 41
wolfSSL 4:1b0d80432c79 42 #ifdef WOLFSSL_MALLOC_CHECK
wolfSSL 4:1b0d80432c79 43 #include <stdio.h>
wolfSSL 4:1b0d80432c79 44 #endif
wolfSSL 4:1b0d80432c79 45
wolfSSL 4:1b0d80432c79 46 /* Set these to default values initially. */
wolfSSL 4:1b0d80432c79 47 static wolfSSL_Malloc_cb malloc_function = 0;
wolfSSL 4:1b0d80432c79 48 static wolfSSL_Free_cb free_function = 0;
wolfSSL 4:1b0d80432c79 49 static wolfSSL_Realloc_cb realloc_function = 0;
wolfSSL 4:1b0d80432c79 50
wolfSSL 4:1b0d80432c79 51 int wolfSSL_SetAllocators(wolfSSL_Malloc_cb mf,
wolfSSL 4:1b0d80432c79 52 wolfSSL_Free_cb ff,
wolfSSL 4:1b0d80432c79 53 wolfSSL_Realloc_cb rf)
wolfSSL 4:1b0d80432c79 54 {
wolfSSL 4:1b0d80432c79 55 int res = 0;
wolfSSL 4:1b0d80432c79 56
wolfSSL 4:1b0d80432c79 57 if (mf)
wolfSSL 4:1b0d80432c79 58 malloc_function = mf;
wolfSSL 4:1b0d80432c79 59 else
wolfSSL 4:1b0d80432c79 60 res = BAD_FUNC_ARG;
wolfSSL 4:1b0d80432c79 61
wolfSSL 4:1b0d80432c79 62 if (ff)
wolfSSL 4:1b0d80432c79 63 free_function = ff;
wolfSSL 4:1b0d80432c79 64 else
wolfSSL 4:1b0d80432c79 65 res = BAD_FUNC_ARG;
wolfSSL 4:1b0d80432c79 66
wolfSSL 4:1b0d80432c79 67 if (rf)
wolfSSL 4:1b0d80432c79 68 realloc_function = rf;
wolfSSL 4:1b0d80432c79 69 else
wolfSSL 4:1b0d80432c79 70 res = BAD_FUNC_ARG;
wolfSSL 4:1b0d80432c79 71
wolfSSL 4:1b0d80432c79 72 return res;
wolfSSL 4:1b0d80432c79 73 }
wolfSSL 4:1b0d80432c79 74
wolfSSL 4:1b0d80432c79 75
wolfSSL 4:1b0d80432c79 76 void* wolfSSL_Malloc(size_t size)
wolfSSL 4:1b0d80432c79 77 {
wolfSSL 4:1b0d80432c79 78 void* res = 0;
wolfSSL 4:1b0d80432c79 79
wolfSSL 4:1b0d80432c79 80 if (malloc_function)
wolfSSL 4:1b0d80432c79 81 res = malloc_function(size);
wolfSSL 4:1b0d80432c79 82 else
wolfSSL 4:1b0d80432c79 83 res = malloc(size);
wolfSSL 4:1b0d80432c79 84
wolfSSL 4:1b0d80432c79 85 #ifdef WOLFSSL_MALLOC_CHECK
wolfSSL 4:1b0d80432c79 86 if (res == NULL)
wolfSSL 4:1b0d80432c79 87 puts("wolfSSL_malloc failed");
wolfSSL 4:1b0d80432c79 88 #endif
wolfSSL 4:1b0d80432c79 89
wolfSSL 4:1b0d80432c79 90 return res;
wolfSSL 4:1b0d80432c79 91 }
wolfSSL 4:1b0d80432c79 92
wolfSSL 4:1b0d80432c79 93 void wolfSSL_Free(void *ptr)
wolfSSL 4:1b0d80432c79 94 {
wolfSSL 4:1b0d80432c79 95 if (free_function)
wolfSSL 4:1b0d80432c79 96 free_function(ptr);
wolfSSL 4:1b0d80432c79 97 else
wolfSSL 4:1b0d80432c79 98 free(ptr);
wolfSSL 4:1b0d80432c79 99 }
wolfSSL 4:1b0d80432c79 100
wolfSSL 4:1b0d80432c79 101 void* wolfSSL_Realloc(void *ptr, size_t size)
wolfSSL 4:1b0d80432c79 102 {
wolfSSL 4:1b0d80432c79 103 void* res = 0;
wolfSSL 4:1b0d80432c79 104
wolfSSL 4:1b0d80432c79 105 if (realloc_function)
wolfSSL 4:1b0d80432c79 106 res = realloc_function(ptr, size);
wolfSSL 4:1b0d80432c79 107 else
wolfSSL 4:1b0d80432c79 108 res = realloc(ptr, size);
wolfSSL 4:1b0d80432c79 109
wolfSSL 4:1b0d80432c79 110 return res;
wolfSSL 4:1b0d80432c79 111 }
wolfSSL 4:1b0d80432c79 112
wolfSSL 4:1b0d80432c79 113 #endif /* USE_WOLFSSL_MEMORY */
wolfSSL 4:1b0d80432c79 114
wolfSSL 4:1b0d80432c79 115
wolfSSL 4:1b0d80432c79 116 #ifdef HAVE_IO_POOL
wolfSSL 4:1b0d80432c79 117
wolfSSL 4:1b0d80432c79 118 /* Example for user io pool, shared build may need definitions in lib proper */
wolfSSL 4:1b0d80432c79 119
wolfSSL 4:1b0d80432c79 120 #include <wolfssl/wolfcrypt/types.h>
wolfSSL 4:1b0d80432c79 121 #include <stdlib.h>
wolfSSL 4:1b0d80432c79 122
wolfSSL 4:1b0d80432c79 123 #ifndef HAVE_THREAD_LS
wolfSSL 4:1b0d80432c79 124 #error "Oops, simple I/O pool example needs thread local storage"
wolfSSL 4:1b0d80432c79 125 #endif
wolfSSL 4:1b0d80432c79 126
wolfSSL 4:1b0d80432c79 127
wolfSSL 4:1b0d80432c79 128 /* allow simple per thread in and out pools */
wolfSSL 4:1b0d80432c79 129 /* use 17k size sense max record size is 16k plus overhead */
wolfSSL 4:1b0d80432c79 130 static THREAD_LS_T byte pool_in[17*1024];
wolfSSL 4:1b0d80432c79 131 static THREAD_LS_T byte pool_out[17*1024];
wolfSSL 4:1b0d80432c79 132
wolfSSL 4:1b0d80432c79 133
wolfSSL 4:1b0d80432c79 134 void* XMALLOC(size_t n, void* heap, int type)
wolfSSL 4:1b0d80432c79 135 {
wolfSSL 4:1b0d80432c79 136 (void)heap;
wolfSSL 4:1b0d80432c79 137
wolfSSL 4:1b0d80432c79 138 if (type == DYNAMIC_TYPE_IN_BUFFER) {
wolfSSL 4:1b0d80432c79 139 if (n < sizeof(pool_in))
wolfSSL 4:1b0d80432c79 140 return pool_in;
wolfSSL 4:1b0d80432c79 141 else
wolfSSL 4:1b0d80432c79 142 return NULL;
wolfSSL 4:1b0d80432c79 143 }
wolfSSL 4:1b0d80432c79 144
wolfSSL 4:1b0d80432c79 145 if (type == DYNAMIC_TYPE_OUT_BUFFER) {
wolfSSL 4:1b0d80432c79 146 if (n < sizeof(pool_out))
wolfSSL 4:1b0d80432c79 147 return pool_out;
wolfSSL 4:1b0d80432c79 148 else
wolfSSL 4:1b0d80432c79 149 return NULL;
wolfSSL 4:1b0d80432c79 150 }
wolfSSL 4:1b0d80432c79 151
wolfSSL 4:1b0d80432c79 152 return malloc(n);
wolfSSL 4:1b0d80432c79 153 }
wolfSSL 4:1b0d80432c79 154
wolfSSL 4:1b0d80432c79 155 void* XREALLOC(void *p, size_t n, void* heap, int type)
wolfSSL 4:1b0d80432c79 156 {
wolfSSL 4:1b0d80432c79 157 (void)heap;
wolfSSL 4:1b0d80432c79 158
wolfSSL 4:1b0d80432c79 159 if (type == DYNAMIC_TYPE_IN_BUFFER) {
wolfSSL 4:1b0d80432c79 160 if (n < sizeof(pool_in))
wolfSSL 4:1b0d80432c79 161 return pool_in;
wolfSSL 4:1b0d80432c79 162 else
wolfSSL 4:1b0d80432c79 163 return NULL;
wolfSSL 4:1b0d80432c79 164 }
wolfSSL 4:1b0d80432c79 165
wolfSSL 4:1b0d80432c79 166 if (type == DYNAMIC_TYPE_OUT_BUFFER) {
wolfSSL 4:1b0d80432c79 167 if (n < sizeof(pool_out))
wolfSSL 4:1b0d80432c79 168 return pool_out;
wolfSSL 4:1b0d80432c79 169 else
wolfSSL 4:1b0d80432c79 170 return NULL;
wolfSSL 4:1b0d80432c79 171 }
wolfSSL 4:1b0d80432c79 172
wolfSSL 4:1b0d80432c79 173 return realloc(p, n);
wolfSSL 4:1b0d80432c79 174 }
wolfSSL 4:1b0d80432c79 175
wolfSSL 4:1b0d80432c79 176
wolfSSL 4:1b0d80432c79 177 /* unit api calls, let's make sure visible with WOLFSSL_API */
wolfSSL 4:1b0d80432c79 178 WOLFSSL_API void XFREE(void *p, void* heap, int type)
wolfSSL 4:1b0d80432c79 179 {
wolfSSL 4:1b0d80432c79 180 (void)heap;
wolfSSL 4:1b0d80432c79 181
wolfSSL 4:1b0d80432c79 182 if (type == DYNAMIC_TYPE_IN_BUFFER)
wolfSSL 4:1b0d80432c79 183 return; /* do nothing, static pool */
wolfSSL 4:1b0d80432c79 184
wolfSSL 4:1b0d80432c79 185 if (type == DYNAMIC_TYPE_OUT_BUFFER)
wolfSSL 4:1b0d80432c79 186 return; /* do nothing, static pool */
wolfSSL 4:1b0d80432c79 187
wolfSSL 4:1b0d80432c79 188 free(p);
wolfSSL 4:1b0d80432c79 189 }
wolfSSL 4:1b0d80432c79 190
wolfSSL 4:1b0d80432c79 191 #endif /* HAVE_IO_POOL */
wolfSSL 4:1b0d80432c79 192
wolfSSL 4:1b0d80432c79 193