提交 a5435e8b 编写于 作者: B Bodo Möller

After discussion with Richard, change the new API for extended memory

allocation callbacks so that it is no longer visible to applications
that these live at a different call level than conventional memory
allocation callbacks.
上级 72e2d913
...@@ -12,30 +12,26 @@ ...@@ -12,30 +12,26 @@
call failed, free the DSA structure. call failed, free the DSA structure.
[Bodo Moeller] [Bodo Moeller]
*) Add another call level for memory allocation routines, thereby *) Allowing defining memory allocation callbacks that will be given
allowing memory allocation callbacks that can be given file file name and line number information in additional arguments
name and line number information. The basic functionality (a const char* and an int). The basic functionality remains, as
remains, as well as the original possibility to just replace well as the original possibility to just replace malloc(),
malloc(), realloc() and free(). The new functions that can be realloc() and free() by functions that do not know about these
registered help users provide variants of malloc(), realloc() additional arguments. To register and find out the current
and free() that take two extra arguments, a const char* and an settings for extended allocation functions, the following
int. To register and find out the current settings for those functions are provided:
hooks, the following functions are provided:
CRYPTO_set_mem_ex_functions CRYPTO_set_mem_ex_functions
CRYPTO_set_locked_mem_ex_functions CRYPTO_set_locked_mem_ex_functions
CRYPTO_get_mem_ex_functions CRYPTO_get_mem_ex_functions
CRYPTO_get_locked_mem_ex_functions CRYPTO_get_locked_mem_ex_functions
They work the same way as the corresponding CRYPTO_set_mem_functions These work the same way as CRYPTO_set_mem_functions and friends.
and friends with one exception: giving NULL as arguments will restore CRYPTO_get_[locked_]mem_functions now writes 0 where such an
the internal hooks to internal routines and will still make the above extended allocation function is enabled.
functions return 1 and not 0. Similarly, CRYPTO_get_[locked_]mem_ex_functions writes 0 where
a conventional allocation function is enabled.
This functionality was created as a direct request to add the [Richard Levitte, Bodo Moeller]
possibility to interface with the Windows debugging routines
_malloc_dbg, _realloc_dbg and _free_dbg.
[Richard Levitte]
*) Fix to uni2asc() to cope with zero length Unicode strings. *) Fix to uni2asc() to cope with zero length Unicode strings.
These are present in some PKCS#12 files. These are present in some PKCS#12 files.
......
...@@ -70,28 +70,36 @@ static int allow_customize_debug = 1;/* exchanging memory-related functions at ...@@ -70,28 +70,36 @@ static int allow_customize_debug = 1;/* exchanging memory-related functions at
* problems when malloc/free pairs * problems when malloc/free pairs
* don't match etc. */ * don't match etc. */
/* may be changed as long as `allow_customize' is set */
static void *(*malloc_locked_func)(size_t) = malloc;
static void (*free_locked_func)(void *) = free; /* the following pointers may be changed as long as 'allow_customize' is set */
static void *(*malloc_func)(size_t) = malloc; static void *(*malloc_func)(size_t) = malloc;
static void *default_malloc_ex(size_t num, const char *file, int line)
{ return malloc_func(num); }
static void *(*malloc_ex_func)(size_t, const char *file, int line)
= default_malloc_ex;
static void *(*realloc_func)(void *, size_t)= realloc; static void *(*realloc_func)(void *, size_t)= realloc;
static void *default_realloc_ex(void *str, size_t num,
const char *file, int line)
{ return realloc_func(str,num); }
static void *(*realloc_ex_func)(void *, size_t, const char *file, int line)
= default_realloc_ex;
static void (*free_func)(void *) = free; static void (*free_func)(void *) = free;
static void *crypto_i_malloc_ex(size_t, const char *file, int line); static void *(*malloc_locked_func)(size_t) = malloc;
static void *crypto_i_realloc_ex(void *, size_t, const char *file, int line); static void *default_malloc_locked_ex(size_t num, const char *file, int line)
static void crypto_i_free_ex(void *); { return malloc_locked_func(num); }
static void *(*malloc_locked_ex_func)(size_t, const char *file, int line) static void *(*malloc_locked_ex_func)(size_t, const char *file, int line)
= crypto_i_malloc_ex; = default_malloc_locked_ex;
static void (*free_locked_ex_func)(void *)
= crypto_i_free_ex; static void (*free_locked_func)(void *) = free;
static void *(*malloc_ex_func)(size_t, const char *file, int line)
= crypto_i_malloc_ex;
static void *(*realloc_ex_func)(void *, size_t, const char *file, int line)
= crypto_i_realloc_ex;
static void (*free_ex_func)(void *)
= crypto_i_free_ex;
/* may be changed as long as `allow_customize_debug' is set */
/* may be changed as long as 'allow_customize_debug' is set */
/* XXX use correct function pointer types */ /* XXX use correct function pointer types */
#ifdef CRYPTO_MDEBUG #ifdef CRYPTO_MDEBUG
/* use default functions from mem_dbg.c */ /* use default functions from mem_dbg.c */
...@@ -119,12 +127,12 @@ int CRYPTO_set_mem_functions(void *(*m)(size_t), void *(*r)(void *, size_t), ...@@ -119,12 +127,12 @@ int CRYPTO_set_mem_functions(void *(*m)(size_t), void *(*r)(void *, size_t),
{ {
if (!allow_customize) if (!allow_customize)
return 0; return 0;
if ((m == NULL) || (r == NULL) || (f == NULL)) if ((m == 0) || (r == 0) || (f == 0))
return 0; return 0;
malloc_func=m; malloc_func=m; malloc_ex_func=default_malloc_ex;
realloc_func=r; realloc_func=r; realloc_ex_func=default_realloc_ex;
free_func=f; free_func=f;
malloc_locked_func=m; malloc_locked_func=m; malloc_locked_ex_func=default_malloc_locked_ex;
free_locked_func=f; free_locked_func=f;
return 1; return 1;
} }
...@@ -136,14 +144,13 @@ int CRYPTO_set_mem_ex_functions( ...@@ -136,14 +144,13 @@ int CRYPTO_set_mem_ex_functions(
{ {
if (!allow_customize) if (!allow_customize)
return 0; return 0;
if (m == NULL) m = crypto_i_malloc_ex; if ((m == 0) || (r == 0) || (f == 0))
if (r == NULL) r = crypto_i_realloc_ex; return 0;
if (f == NULL) f = crypto_i_free_ex; malloc_func=0; malloc_ex_func=m;
malloc_ex_func=m; realloc_func=0; realloc_ex_func=r;
realloc_ex_func=r; free_func=f;
free_ex_func=f; malloc_locked_func=0; malloc_locked_ex_func=m;
malloc_locked_ex_func=m; free_locked_func=f;
free_locked_ex_func=f;
return 1; return 1;
} }
...@@ -153,7 +160,7 @@ int CRYPTO_set_locked_mem_functions(void *(*m)(size_t), void (*f)(void *)) ...@@ -153,7 +160,7 @@ int CRYPTO_set_locked_mem_functions(void *(*m)(size_t), void (*f)(void *))
return 0; return 0;
if ((m == NULL) || (f == NULL)) if ((m == NULL) || (f == NULL))
return 0; return 0;
malloc_locked_func=m; malloc_locked_func=m; malloc_locked_ex_func=default_malloc_locked_ex;
free_locked_func=f; free_locked_func=f;
return 1; return 1;
} }
...@@ -164,10 +171,10 @@ int CRYPTO_set_locked_mem_ex_functions( ...@@ -164,10 +171,10 @@ int CRYPTO_set_locked_mem_ex_functions(
{ {
if (!allow_customize) if (!allow_customize)
return 0; return 0;
if (m == NULL) m = crypto_i_malloc_ex; if ((m == NULL) || (f == NULL))
if (f == NULL) f = crypto_i_free_ex; return 0;
malloc_locked_ex_func=m; malloc_locked_func=0; malloc_locked_ex_func=m;
free_locked_ex_func=f; free_func=f;
return 1; return 1;
} }
...@@ -187,6 +194,7 @@ int CRYPTO_set_mem_debug_functions(void (*m)(void *,int,const char *,int,int), ...@@ -187,6 +194,7 @@ int CRYPTO_set_mem_debug_functions(void (*m)(void *,int,const char *,int,int),
return 1; return 1;
} }
void CRYPTO_get_mem_functions(void *(**m)(size_t), void *(**r)(void *, size_t), void CRYPTO_get_mem_functions(void *(**m)(size_t), void *(**r)(void *, size_t),
void (**f)(void *)) void (**f)(void *))
{ {
...@@ -200,9 +208,11 @@ void CRYPTO_get_mem_ex_functions( ...@@ -200,9 +208,11 @@ void CRYPTO_get_mem_ex_functions(
void *(**r)(void *, size_t,const char *,int), void *(**r)(void *, size_t,const char *,int),
void (**f)(void *)) void (**f)(void *))
{ {
if (m != NULL) *m=malloc_ex_func; if (m != NULL) *m = (malloc_ex_func != default_malloc_ex) ?
if (r != NULL) *r=realloc_ex_func; malloc_ex_func : 0;
if (f != NULL) *f=free_ex_func; if (r != NULL) *r = (realloc_ex_func != default_realloc_ex) ?
realloc_ex_func : 0;
if (f != NULL) *f=free_func;
} }
void CRYPTO_get_locked_mem_functions(void *(**m)(size_t), void (**f)(void *)) void CRYPTO_get_locked_mem_functions(void *(**m)(size_t), void (**f)(void *))
...@@ -215,8 +225,9 @@ void CRYPTO_get_locked_mem_ex_functions( ...@@ -215,8 +225,9 @@ void CRYPTO_get_locked_mem_ex_functions(
void *(**m)(size_t,const char *,int), void *(**m)(size_t,const char *,int),
void (**f)(void *)) void (**f)(void *))
{ {
if (m != NULL) *m=malloc_locked_ex_func; if (m != NULL) *m = (malloc_locked_ex_func != default_malloc_locked_ex) ?
if (f != NULL) *f=free_locked_ex_func; malloc_locked_ex_func : 0;
if (f != NULL) *f=free_locked_func;
} }
void CRYPTO_get_mem_debug_functions(void (**m)(void *,int,const char *,int,int), void CRYPTO_get_mem_debug_functions(void (**m)(void *,int,const char *,int,int),
...@@ -260,7 +271,7 @@ void CRYPTO_free_locked(void *str) ...@@ -260,7 +271,7 @@ void CRYPTO_free_locked(void *str)
#ifdef LEVITTE_DEBUG_MEM #ifdef LEVITTE_DEBUG_MEM
fprintf(stderr, "LEVITTE_DEBUG_MEM: < 0x%p\n", str); fprintf(stderr, "LEVITTE_DEBUG_MEM: < 0x%p\n", str);
#endif #endif
free_locked_ex_func(str); free_locked_func(str);
if (free_debug_func != NULL) if (free_debug_func != NULL)
free_debug_func(NULL, 1); free_debug_func(NULL, 1);
} }
...@@ -308,7 +319,7 @@ void CRYPTO_free(void *str) ...@@ -308,7 +319,7 @@ void CRYPTO_free(void *str)
#ifdef LEVITTE_DEBUG_MEM #ifdef LEVITTE_DEBUG_MEM
fprintf(stderr, "LEVITTE_DEBUG_MEM: < 0x%p\n", str); fprintf(stderr, "LEVITTE_DEBUG_MEM: < 0x%p\n", str);
#endif #endif
free_ex_func(str); free_func(str);
if (free_debug_func != NULL) if (free_debug_func != NULL)
free_debug_func(NULL, 1); free_debug_func(NULL, 1);
} }
...@@ -333,19 +344,3 @@ long CRYPTO_get_mem_debug_options(void) ...@@ -333,19 +344,3 @@ long CRYPTO_get_mem_debug_options(void)
return get_debug_options_func(); return get_debug_options_func();
return 0; return 0;
} }
static void *crypto_i_malloc_ex(size_t num, const char *file, int line)
{
return malloc_func(num);
}
static void *crypto_i_realloc_ex(void *str, size_t num,
const char *file, int line)
{
return realloc_func(str,num);
}
static void crypto_i_free_ex(void *str)
{
free_func(str);
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册