diff --git a/include/polarssl/config.h b/include/polarssl/config.h index be1005710..b191e3174 100644 --- a/include/polarssl/config.h +++ b/include/polarssl/config.h @@ -3,7 +3,7 @@ * * \brief Configuration options (set of defines) * - * Copyright (C) 2006-2013, Brainspark B.V. + * Copyright (C) 2006-2014, Brainspark B.V. * * This file is part of PolarSSL (http://www.polarssl.org) * Lead Maintainer: Paul Bakker @@ -114,6 +114,24 @@ */ #define POLARSSL_HAVE_IPV6 +/** + * \def POLARSSL_PLATFORM_MEMORY + * + * Enable the memory allocation layer. + * + * By default PolarSSL uses the system-provided malloc() and free(). + * This allows different allocators (self-implemented or provided) to be + * provided to the platform abstraction layer. + * + * Enabling POLARSSL_PLATFORM_MEMORY will provide "platform_set_malloc_free()" + * to allow you to set an alternative malloc() and free() function pointer. + * + * Requires: POLARSSL_PLATFORM_C + * + * Enable this layer to allow use of alternative memory allocators. + */ +//#define POLARSSL_PLATFORM_MEMORY + /** * \def POLARSSL_PLATFORM_XXX_ALT * @@ -642,7 +660,6 @@ * function for 'debug output' of allocated memory. * * Requires: POLARSSL_MEMORY_BUFFER_ALLOC_C - * fprintf() * * Uncomment this macro to let the buffer allocator print out error messages. */ @@ -1426,17 +1443,8 @@ /** * \def POLARSSL_MEMORY_C - * - * Enable the memory allocation layer. - * By default PolarSSL uses the system-provided malloc() and free(). - * (As long as POLARSSL_MEMORY_STDMALLOC and POLARSSL_MEMORY_STDFREE - * are defined and unmodified) - * - * This allows different allocators (self-implemented or provided) - * - * Enable this layer to allow use of alternative memory allocators. + * Deprecated since 1.3.5. Please use POLARSSL_PLATFORM_MEMORY instead. */ -//#define POLARSSL_MEMORY_C /** * \def POLARSSL_MEMORY_BUFFER_ALLOC_C @@ -1447,7 +1455,8 @@ * * Module: library/memory_buffer_alloc.c * - * Requires: POLARSSL_MEMORY_C + * Requires: POLARSSL_PLATFORM_C + * POLARSSL_PLATFORM_MEMORY (to use it within PolarSSL) * * Enable this module to enable the buffer memory allocator. */ @@ -1995,12 +2004,12 @@ #define ENTROPY_MAX_SOURCES 20 /**< Maximum number of sources supported */ #define ENTROPY_MAX_GATHER 128 /**< Maximum amount requested from entropy sources */ -// Memory options +// Memory buffer allocator options #define MEMORY_ALIGN_MULTIPLE 4 /**< Align on multiples of this value */ -#define POLARSSL_MEMORY_STDMALLOC malloc /**< Default allocator to use, can be undefined */ -#define POLARSSL_MEMORY_STDFREE free /**< Default free to use, can be undefined */ // Platform options +#define POLARSSL_PLATFORM_STD_MALLOC malloc /**< Default allocator to use, can be undefined */ +#define POLARSSL_PLATFORM_STD_FREE free /**< Default free to use, can be undefined */ #define POLARSSL_PLATFORM_STD_PRINTF printf /**< Default printf to use, can be undefined */ #define POLARSSL_PLATFORM_STD_FPRINTF fprintf /**< Default fprintf to use, can be undefined */ @@ -2143,7 +2152,8 @@ #error "POLARSSL_KEY_EXCHANGE_RSA_ENABLED defined, but not all prerequisites" #endif -#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) && !defined(POLARSSL_MEMORY_C) +#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) && \ + ( !defined(POLARSSL_PLATFORM_C) || !defined(POLARSSL_PLATFORM_MEMORY) ) #error "POLARSSL_MEMORY_BUFFER_ALLOC_C defined, but not all prerequisites" #endif diff --git a/include/polarssl/memory.h b/include/polarssl/memory.h index 6a3dab94b..64690bed9 100644 --- a/include/polarssl/memory.h +++ b/include/polarssl/memory.h @@ -1,9 +1,9 @@ /** * \file memory.h * - * \brief Memory allocation layer + * \brief Memory allocation layer (Deprecated to platform layer) * - * Copyright (C) 2006-2013, Brainspark B.V. + * Copyright (C) 2006-2014, Brainspark B.V. * * This file is part of PolarSSL (http://www.polarssl.org) * Lead Maintainer: Paul Bakker @@ -31,101 +31,18 @@ #include -#if !defined(POLARSSL_CONFIG_OPTIONS) -#define POLARSSL_MEMORY_ALIGN_MULTIPLE 4 /**< Align on multiples of this value */ - -#define POLARSSL_MEMORY_STDMALLOC malloc /**< Default allocator to use, can be undefined */ -#define POLARSSL_MEMORY_STDFREE free /**< Default free to use, can be undefined */ -#endif /* POLARSSL_CONFIG_OPTIONS */ - -#define MEMORY_VERIFY_NONE 0 -#define MEMORY_VERIFY_ALLOC (1 << 0) -#define MEMORY_VERIFY_FREE (1 << 1) -#define MEMORY_VERIFY_ALWAYS (MEMORY_VERIFY_ALLOC | MEMORY_VERIFY_FREE) - -#ifdef __cplusplus -extern "C" { +#if defined(POLARSSL_MEMORY_C) && !defined(POLARSSL_PLATFORM_MEMORY) +#define POLARSSL_PLATFORM_MEMORY #endif -/* - * The function pointers for malloc and free - */ -extern void * (*polarssl_malloc)( size_t len ); -extern void (*polarssl_free)( void *ptr ); +#include "platform.h" +#include "memory_buffer_alloc.h" -/** - * \brief Set your own memory implementation function pointers - * - * \param malloc_func the malloc function implementation - * \param free_func the free function implementation - * - * \return 0 if successful - */ int memory_set_own( void * (*malloc_func)( size_t ), - void (*free_func)( void * ) ); - -#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) -/** - * \brief Initialize use of stack-based memory allocator. - * The stack-based allocator does memory management inside the - * presented buffer and does not call malloc() and free(). - * It sets the global polarssl_malloc() and polarssl_free() pointers - * to its own functions. - * (Provided polarssl_malloc() and polarssl_free() are thread-safe if - * POLARSSL_THREADING_C is defined) - * - * \note This code is not optimized and provides a straight-forward - * implementation of a stack-based memory allocator. - * - * \param buf buffer to use as heap - * \param len size of the buffer - * - * \return 0 if successful - */ -int memory_buffer_alloc_init( unsigned char *buf, size_t len ); - -/** - * \brief Free the mutex for thread-safety and clear remaining memory - */ -void memory_buffer_alloc_free(); - -/** - * \brief Determine when the allocator should automatically verify the state - * of the entire chain of headers / meta-data. - * (Default: MEMORY_VERIFY_NONE) - * - * \param verify One of MEMORY_VERIFY_NONE, MEMORY_VERIFY_ALLOC, - * MEMORY_VERIFY_FREE or MEMORY_VERIFY_ALWAYS - */ -void memory_buffer_set_verify( int verify ); - -#if defined(POLARSSL_MEMORY_DEBUG) -/** - * \brief Print out the status of the allocated memory (primarily for use - * after a program should have de-allocated all memory) - * Prints out a list of 'still allocated' blocks and their stack - * trace if POLARSSL_MEMORY_BACKTRACE is defined. - */ -void memory_buffer_alloc_status(); -#endif /* POLARSSL_MEMORY_DEBUG */ - -/** - * \brief Verifies that all headers in the memory buffer are correct - * and contain sane values. Helps debug buffer-overflow errors. - * - * Prints out first failure if POLARSSL_MEMORY_DEBUG is defined. - * Prints out full header information if POLARSSL_MEMORY_DEBUG_HEADERS - * is defined. (Includes stack trace information for each block if - * POLARSSL_MEMORY_BACKTRACE is defined as well). - * - * \returns 0 if verified, 1 otherwise - */ -int memory_buffer_alloc_verify(); - -#endif /* POLARSSL_MEMORY_BUFFER_ALLOC_C */ - -#ifdef __cplusplus + void (*free_func)( void * ) ) +{ + return platform_set_malloc_free( malloc_func, free_func ); } -#endif + #endif /* memory.h */ diff --git a/include/polarssl/memory_buffer_alloc.h b/include/polarssl/memory_buffer_alloc.h new file mode 100644 index 000000000..053b1dd41 --- /dev/null +++ b/include/polarssl/memory_buffer_alloc.h @@ -0,0 +1,108 @@ +/** + * \file memory_buffer_alloc.h + * + * \brief Buffer-based memory allocator + * + * Copyright (C) 2006-2014, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef POLARSSL_MEMORY_BUFFER_ALLOC_H +#define POLARSSL_MEMORY_BUFFER_ALLOC_H + +#include "config.h" + +#include + +#if !defined(POLARSSL_CONFIG_OPTIONS) +#define POLARSSL_MEMORY_ALIGN_MULTIPLE 4 /**< Align on multiples of this value */ +#endif /* POLARSSL_CONFIG_OPTIONS */ + +#define MEMORY_VERIFY_NONE 0 +#define MEMORY_VERIFY_ALLOC (1 << 0) +#define MEMORY_VERIFY_FREE (1 << 1) +#define MEMORY_VERIFY_ALWAYS (MEMORY_VERIFY_ALLOC | MEMORY_VERIFY_FREE) + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Initialize use of stack-based memory allocator. + * The stack-based allocator does memory management inside the + * presented buffer and does not call malloc() and free(). + * It sets the global polarssl_malloc() and polarssl_free() pointers + * to its own functions. + * (Provided polarssl_malloc() and polarssl_free() are thread-safe if + * POLARSSL_THREADING_C is defined) + * + * \note This code is not optimized and provides a straight-forward + * implementation of a stack-based memory allocator. + * + * \param buf buffer to use as heap + * \param len size of the buffer + * + * \return 0 if successful + */ +int memory_buffer_alloc_init( unsigned char *buf, size_t len ); + +/** + * \brief Free the mutex for thread-safety and clear remaining memory + */ +void memory_buffer_alloc_free(); + +/** + * \brief Determine when the allocator should automatically verify the state + * of the entire chain of headers / meta-data. + * (Default: MEMORY_VERIFY_NONE) + * + * \param verify One of MEMORY_VERIFY_NONE, MEMORY_VERIFY_ALLOC, + * MEMORY_VERIFY_FREE or MEMORY_VERIFY_ALWAYS + */ +void memory_buffer_set_verify( int verify ); + +#if defined(POLARSSL_MEMORY_DEBUG) +/** + * \brief Print out the status of the allocated memory (primarily for use + * after a program should have de-allocated all memory) + * Prints out a list of 'still allocated' blocks and their stack + * trace if POLARSSL_MEMORY_BACKTRACE is defined. + */ +void memory_buffer_alloc_status(); +#endif /* POLARSSL_MEMORY_DEBUG */ + +/** + * \brief Verifies that all headers in the memory buffer are correct + * and contain sane values. Helps debug buffer-overflow errors. + * + * Prints out first failure if POLARSSL_MEMORY_DEBUG is defined. + * Prints out full header information if POLARSSL_MEMORY_DEBUG_HEADERS + * is defined. (Includes stack trace information for each block if + * POLARSSL_MEMORY_BACKTRACE is defined as well). + * + * \returns 0 if verified, 1 otherwise + */ +int memory_buffer_alloc_verify(); + +#ifdef __cplusplus +} +#endif + +#endif /* memory_buffer_alloc.h */ diff --git a/include/polarssl/platform.h b/include/polarssl/platform.h index 22a1f464c..08832b3c3 100644 --- a/include/polarssl/platform.h +++ b/include/polarssl/platform.h @@ -38,13 +38,27 @@ extern "C" { #if !defined(POLARSSL_CONFIG_OPTIONS) #define POLARSSL_PLATFORM_STD_PRINTF printf /**< Default printf to use */ #define POLARSSL_PLATFORM_STD_FPRINTF fprintf /**< Default fprintf to use */ +#define POLARSSL_PLATFORM_STD_MALLOC malloc /**< Default allocator to use */ +#define POLARSSL_PLATFORM_STD_FREE free /**< Default free to use */ #endif /* POLARSSL_CONFIG_OPTIONS */ /* * The function pointers for malloc and free */ #if defined(POLARSSL_MEMORY_C) -#include "memory.h" +extern void * (*polarssl_malloc)( size_t len ); +extern void (*polarssl_free)( void *ptr ); + +/** + * \brief Set your own memory implementation function pointers + * + * \param malloc_func the malloc function implementation + * \param free_func the free function implementation + * + * \return 0 if successful + */ +int platform_set_malloc_free( void * (*malloc_func)( size_t ), + void (*free_func)( void * ) ); #else #include #define polarssl_malloc malloc diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index d948ca0c4..2d7455963 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -32,7 +32,6 @@ set(src md2.c md4.c md5.c - memory.c memory_buffer_alloc.c net.c oid.c diff --git a/library/Makefile b/library/Makefile index 931602426..a4a3ce724 100644 --- a/library/Makefile +++ b/library/Makefile @@ -46,7 +46,7 @@ OBJS= aes.o aesni.o arc4.o \ error.o gcm.o havege.o \ hmac_drbg.o \ md.o md_wrap.o md2.o \ - md4.o md5.o memory.o \ + md4.o md5.o \ memory_buffer_alloc.o net.o \ oid.o \ padlock.o pbkdf2.o pem.o \ diff --git a/library/memory.c b/library/memory.c deleted file mode 100644 index 93ca37916..000000000 --- a/library/memory.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Memory allocation layer - * - * Copyright (C) 2006-2013, Brainspark B.V. - * - * This file is part of PolarSSL (http://www.polarssl.org) - * Lead Maintainer: Paul Bakker - * - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include "polarssl/config.h" - -#if defined(POLARSSL_MEMORY_C) - -#include "polarssl/memory.h" - -#if !defined(POLARSSL_MEMORY_STDMALLOC) -static void *memory_malloc_uninit( size_t len ) -{ - ((void) len); - return( NULL ); -} - -#define POLARSSL_MEMORY_STDMALLOC memory_malloc_uninit -#endif /* !POLARSSL_MEMORY_STDMALLOC */ - -#if !defined(POLARSSL_MEMORY_STDFREE) -static void memory_free_uninit( void *ptr ) -{ - ((void) ptr); -} - -#define POLARSSL_MEMORY_STDFREE memory_free_uninit -#endif /* !POLARSSL_MEMORY_STDFREE */ - -void * (*polarssl_malloc)( size_t ) = POLARSSL_MEMORY_STDMALLOC; -void (*polarssl_free)( void * ) = POLARSSL_MEMORY_STDFREE; - -int memory_set_own( void * (*malloc_func)( size_t ), - void (*free_func)( void * ) ) -{ - polarssl_malloc = malloc_func; - polarssl_free = free_func; - - return( 0 ); -} - -#endif /* POLARSSL_MEMORY_C */ diff --git a/library/memory_buffer_alloc.c b/library/memory_buffer_alloc.c index fef43312f..21968914f 100644 --- a/library/memory_buffer_alloc.c +++ b/library/memory_buffer_alloc.c @@ -25,9 +25,9 @@ #include "polarssl/config.h" -#if defined(POLARSSL_MEMORY_C) && defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) +#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) -#include "polarssl/memory.h" +#include "polarssl/memory_buffer_alloc.h" #include @@ -544,11 +544,10 @@ int memory_buffer_alloc_init( unsigned char *buf, size_t len ) #if defined(POLARSSL_THREADING_C) polarssl_mutex_init( &heap.mutex ); - polarssl_malloc = buffer_alloc_malloc_mutexed; - polarssl_free = buffer_alloc_free_mutexed; + platform_set_malloc_free( buffer_alloc_malloc_mutexed, + buffer_alloc_free_mutexed ); #else - polarssl_malloc = buffer_alloc_malloc; - polarssl_free = buffer_alloc_free; + platform_set_malloc_free( buffer_alloc_malloc, buffer_alloc_free ); #endif heap.buf = buf; @@ -570,4 +569,4 @@ void memory_buffer_alloc_free() memset( &heap, 0, sizeof(buffer_alloc_ctx) ); } -#endif /* POLARSSL_MEMORY_C && POLARSSL_MEMORY_BUFFER_ALLOC_C */ +#endif /* POLARSSL_MEMORY_BUFFER_ALLOC_C */ diff --git a/library/platform.c b/library/platform.c index 32f949ff0..823b17d13 100644 --- a/library/platform.c +++ b/library/platform.c @@ -29,6 +29,38 @@ #include "polarssl/platform.h" +#if defined(POLARSSL_PLATFORM_MEMORY) +#if !defined(POLARSSL_PLATFORM_STD_MALLOC) +static void *platform_malloc_uninit( size_t len ) +{ + ((void) len); + return( NULL ); +} + +#define POLARSSL_PLATFORM_STD_MALLOC memory_malloc_uninit +#endif /* !POLARSSL_PLATFORM_STD_MALLOC */ + +#if !defined(POLARSSL_PLATFORM_STD_FREE) +static void platform_free_uninit( void *ptr ) +{ + ((void) ptr); +} + +#define POLARSSL_PLATFORM_STD_FREE memory_free_uninit +#endif /* !POLARSSL_PLATFORM_STD_FREE */ + +void * (*polarssl_malloc)( size_t ) = POLARSSL_PLATFORM_STD_MALLOC; +void (*polarssl_free)( void * ) = POLARSSL_PLATFORM_STD_FREE; + +int platform_set_malloc_free( void * (*malloc_func)( size_t ), + void (*free_func)( void * ) ) +{ + polarssl_malloc = malloc_func; + polarssl_free = free_func; + return( 0 ); +} +#endif /* POLARSSL_PLATFORM_MEMORY */ + #if defined(POLARSSL_PLATFORM_PRINTF_ALT) #if !defined(POLARSSL_PLATFORM_STD_PRINTF) /*