diff options
author | Doug MacEachern <dougm@apache.org> | 2002-03-15 00:31:23 +0100 |
---|---|---|
committer | Doug MacEachern <dougm@apache.org> | 2002-03-15 00:31:23 +0100 |
commit | 97b148c3b51dd80bff9008f68191aa392ad06a5a (patch) | |
tree | feb6e59615e6fec5372da19d6772d55fc3a34e3e | |
parent | FYI... (diff) | |
download | apache2-97b148c3b51dd80bff9008f68191aa392ad06a5a.tar.xz apache2-97b148c3b51dd80bff9008f68191aa392ad06a5a.zip |
PR:
Obtained from:
Submitted by: Madhusudan Mathihalli <madhusudan_mathihalli@hp.com>
Reviewed by: dougm
implement SSLSessionCache shmht and shmcb based on apr_rmm and apr_shm
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@93942 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to '')
-rw-r--r-- | CHANGES | 3 | ||||
-rw-r--r-- | modules/ssl/mod_ssl.h | 20 | ||||
-rw-r--r-- | modules/ssl/ssl_engine_config.c | 50 | ||||
-rw-r--r-- | modules/ssl/ssl_scache.c | 34 | ||||
-rw-r--r-- | modules/ssl/ssl_scache_shmcb.c | 184 | ||||
-rw-r--r-- | modules/ssl/ssl_scache_shmht.c | 123 | ||||
-rw-r--r-- | modules/ssl/ssl_util_table.c | 107 | ||||
-rw-r--r-- | modules/ssl/ssl_util_table.h | 2 |
8 files changed, 286 insertions, 237 deletions
@@ -1,5 +1,8 @@ Changes with Apache 2.0.34-dev + *) implement SSLSessionCache shmht and shmcb based on apr_rmm and + apr_shm. [Madhusudan Mathihalli <madhusudan_mathihalli@hp.com>] + *) Fix apxs -g handling. Move config_vars.mk from the top build directory to the build directory. PR 10163 [Jeff Trawick] diff --git a/modules/ssl/mod_ssl.h b/modules/ssl/mod_ssl.h index 84a62589a1..705e14cf05 100644 --- a/modules/ssl/mod_ssl.h +++ b/modules/ssl/mod_ssl.h @@ -108,6 +108,8 @@ #include "apr_fnmatch.h" #include "apr_strings.h" #include "apr_dbm.h" +#include "apr_rmm.h" +#include "apr_shm.h" #include "apr_optional.h" /* OpenSSL headers */ @@ -488,9 +490,8 @@ typedef struct { int nSessionCacheMode; char *szSessionCacheDataFile; int nSessionCacheDataSize; -#if 0 /* XXX */ - AP_MM *pSessionCacheDataMM; -#endif + apr_shm_t *pSessionCacheDataMM; + apr_rmm_t *pSessionCacheDataRMM; apr_table_t *tSessionCacheDataTable; ssl_mutexmode_t nMutexMode; char *szMutexFile; @@ -679,22 +680,22 @@ SSL_SESSION *ssl_scache_dbm_retrieve(server_rec *, UCHAR *, int); void ssl_scache_dbm_remove(server_rec *, UCHAR *, int); void ssl_scache_dbm_expire(server_rec *); void ssl_scache_dbm_status(server_rec *, apr_pool_t *, void (*)(char *, void *), void *); -#if 0 /* XXX */ -void ssl_scache_shmht_init(server_rec *, pool *); + +void ssl_scache_shmht_init(server_rec *, apr_pool_t *); void ssl_scache_shmht_kill(server_rec *); BOOL ssl_scache_shmht_store(server_rec *, UCHAR *, int, time_t, SSL_SESSION *); SSL_SESSION *ssl_scache_shmht_retrieve(server_rec *, UCHAR *, int); void ssl_scache_shmht_remove(server_rec *, UCHAR *, int); void ssl_scache_shmht_expire(server_rec *); -void ssl_scache_shmht_status(server_rec *, pool *, void (*)(char *, void *), void *); -void ssl_scache_shmcb_init(server_rec *, pool *); +void ssl_scache_shmht_status(server_rec *, apr_pool_t *, void (*)(char *, void *), void *); + +void ssl_scache_shmcb_init(server_rec *, apr_pool_t *); void ssl_scache_shmcb_kill(server_rec *); BOOL ssl_scache_shmcb_store(server_rec *, UCHAR *, int, time_t, SSL_SESSION *); SSL_SESSION *ssl_scache_shmcb_retrieve(server_rec *, UCHAR *, int); void ssl_scache_shmcb_remove(server_rec *, UCHAR *, int); void ssl_scache_shmcb_expire(server_rec *); -void ssl_scache_shmcb_status(server_rec *, pool *, void (*)(char *, void *), void *); -#endif +void ssl_scache_shmcb_status(server_rec *, apr_pool_t *, void (*)(char *, void *), void *); /* Pass Phrase Support */ void ssl_pphrase_Handle(server_rec *, apr_pool_t *); @@ -768,4 +769,5 @@ char *ssl_util_algotypestr(ssl_algo_t); char *ssl_util_ptxtsub(apr_pool_t *, const char *, const char *, char *); void ssl_util_thread_setup(server_rec *, apr_pool_t *); +#define APR_SHM_MAXSIZE (64 * 1024 * 1024) #endif /* __MOD_SSL_H__ */ diff --git a/modules/ssl/ssl_engine_config.c b/modules/ssl/ssl_engine_config.c index ee6f375ec7..5138c9f38f 100644 --- a/modules/ssl/ssl_engine_config.c +++ b/modules/ssl/ssl_engine_config.c @@ -95,9 +95,8 @@ SSLModConfigRec *ssl_config_global_create(server_rec *s) mc->nSessionCacheMode = SSL_SCMODE_UNSET; mc->szSessionCacheDataFile = NULL; mc->nSessionCacheDataSize = 0; -#if 0 /* XXX */ mc->pSessionCacheDataMM = NULL; -#endif + mc->pSessionCacheDataRMM = NULL; mc->tSessionCacheDataTable = NULL; mc->nMutexMode = SSL_MUTEXMODE_UNSET; mc->szMutexFile = NULL; @@ -803,6 +802,9 @@ const char *ssl_cmd_SSLVerifyDepth(cmd_parms *cmd, void *ctx, return NULL; } +#define MODSSL_NO_SHARED_MEMORY_ERROR \ + "SSLSessionCache: shared memory cache not useable on this platform" + const char *ssl_cmd_SSLSessionCache(cmd_parms *cmd, void *ctx, const char *arg) { @@ -828,16 +830,10 @@ const char *ssl_cmd_SSLSessionCache(cmd_parms *cmd, void *ctx, mc->nSessionCacheMode = SSL_SCMODE_DBM; mc->szSessionCacheDataFile = ap_server_root_relative(mc->pPool, arg+4); } - else if (((arglen > 4) && strcEQn(arg, "shm:", 4)) || - ((arglen > 6) && strcEQn(arg, "shmht:", 6))) - { -#if 0 /* XXX */ - if (!ap_mm_useable()) { - return "SSLSessionCache: shared memory cache " - "not useable on this platform"; - } + else if ((arglen > 6) && strcEQn(arg, "shmht:", 6)) { +#if !APR_HAS_SHARED_MEMORY + return MODSSL_NO_SHARED_MEMORY_ERROR; #endif - mc->nSessionCacheMode = SSL_SCMODE_SHMHT; colon = ap_strchr_c(arg, ':'); mc->szSessionCacheDataFile = @@ -862,13 +858,7 @@ const char *ssl_cmd_SSLSessionCache(cmd_parms *cmd, void *ctx, "size has to be >= 8192 bytes"; } -#if 0 /* XXX */ - maxsize = ap_mm_core_maxsegsize(); -#else - maxsize = 1024 * 512; -#endif - - if (mc->nSessionCacheDataSize >= maxsize) { + if (mc->nSessionCacheDataSize >= APR_SHM_MAXSIZE) { return apr_psprintf(cmd->pool, "SSLSessionCache: Invalid argument: " "size has to be < %d bytes on this " @@ -876,22 +866,22 @@ const char *ssl_cmd_SSLSessionCache(cmd_parms *cmd, void *ctx, } } } - else if ((arglen > 6) && strcEQn(arg, "shmcb:", 6)) { -#if 0 /* XXX */ - if (!ap_mm_useable()) { - return "SSLSessionCache: shared memory cache " - "not useable on this platform"; - } + else if (((arglen > 4) && strcEQn(arg, "shm:", 4)) || + ((arglen > 6) && strcEQn(arg, "shmcb:", 6))) { +#if !APR_HAS_SHARED_MEMORY + return MODSSL_NO_SHARED_MEMORY_ERROR; #endif mc->nSessionCacheMode = SSL_SCMODE_SHMCB; - mc->szSessionCacheDataFile = ap_server_root_relative(mc->pPool, arg+6); + colon = ap_strchr_c(arg, ':'); + mc->szSessionCacheDataFile = + ap_server_root_relative(mc->pPool, colon+1); mc->tSessionCacheDataTable = NULL; mc->nSessionCacheDataSize = 1024*512; /* 512KB */ if ((cp = strchr(mc->szSessionCacheDataFile, '('))) { *cp++ = NUL; - if ((cp2 = strchr(cp, ')'))) { + if (!(cp2 = strchr(cp, ')'))) { return "SSLSessionCache: Invalid argument: " "no closing parenthesis"; } @@ -906,13 +896,7 @@ const char *ssl_cmd_SSLSessionCache(cmd_parms *cmd, void *ctx, } -#if 0 /* XXX */ - maxsize = ap_mm_core_maxsegsize(); -#else - maxsize = 1024 * 512; -#endif - - if (mc->nSessionCacheDataSize >= maxsize) { + if (mc->nSessionCacheDataSize >= APR_SHM_MAXSIZE) { return apr_psprintf(cmd->pool, "SSLSessionCache: Invalid argument: " "size has to be < %d bytes on this " diff --git a/modules/ssl/ssl_scache.c b/modules/ssl/ssl_scache.c index b945ff64f7..839add7a62 100644 --- a/modules/ssl/ssl_scache.c +++ b/modules/ssl/ssl_scache.c @@ -75,12 +75,22 @@ void ssl_scache_init(server_rec *s, apr_pool_t *p) if (mc->nSessionCacheMode == SSL_SCMODE_DBM) ssl_scache_dbm_init(s, p); -#if 0 /* XXX */ - else if (mc->nSessionCacheMode == SSL_SCMODE_SHMHT) - ssl_scache_shmht_init(s, p); - else if (mc->nSessionCacheMode == SSL_SCMODE_SHMCB) - ssl_scache_shmcb_init(s, p); -#endif + else if ((mc->nSessionCacheMode == SSL_SCMODE_SHMHT) || + (mc->nSessionCacheMode == SSL_SCMODE_SHMCB)) { + void *data; + const char *userdata_key = "ssl_scache_init"; + + apr_pool_userdata_get(&data, userdata_key, s->process->pool); + if (!data) { + apr_pool_userdata_setn((const void *)1, userdata_key, + apr_pool_cleanup_null, s->process->pool); + return; + } + if (mc->nSessionCacheMode == SSL_SCMODE_SHMHT) + ssl_scache_shmht_init(s, p); + else if (mc->nSessionCacheMode == SSL_SCMODE_SHMCB) + ssl_scache_shmcb_init(s, p); + } return; } @@ -90,12 +100,10 @@ void ssl_scache_kill(server_rec *s) if (mc->nSessionCacheMode == SSL_SCMODE_DBM) ssl_scache_dbm_kill(s); -#if 0 /* XXX */ else if (mc->nSessionCacheMode == SSL_SCMODE_SHMHT) ssl_scache_shmht_kill(s); else if (mc->nSessionCacheMode == SSL_SCMODE_SHMCB) ssl_scache_shmcb_kill(s); -#endif return; } @@ -106,12 +114,10 @@ BOOL ssl_scache_store(server_rec *s, UCHAR *id, int idlen, time_t expiry, SSL_SE if (mc->nSessionCacheMode == SSL_SCMODE_DBM) rv = ssl_scache_dbm_store(s, id, idlen, expiry, sess); -#if 0 /* XXX */ else if (mc->nSessionCacheMode == SSL_SCMODE_SHMHT) rv = ssl_scache_shmht_store(s, id, idlen, expiry, sess); else if (mc->nSessionCacheMode == SSL_SCMODE_SHMCB) rv = ssl_scache_shmcb_store(s, id, idlen, expiry, sess); -#endif return rv; } @@ -122,12 +128,10 @@ SSL_SESSION *ssl_scache_retrieve(server_rec *s, UCHAR *id, int idlen) if (mc->nSessionCacheMode == SSL_SCMODE_DBM) sess = ssl_scache_dbm_retrieve(s, id, idlen); -#if 0 /* XXX */ else if (mc->nSessionCacheMode == SSL_SCMODE_SHMHT) sess = ssl_scache_shmht_retrieve(s, id, idlen); else if (mc->nSessionCacheMode == SSL_SCMODE_SHMCB) sess = ssl_scache_shmcb_retrieve(s, id, idlen); -#endif return sess; } @@ -137,12 +141,10 @@ void ssl_scache_remove(server_rec *s, UCHAR *id, int idlen) if (mc->nSessionCacheMode == SSL_SCMODE_DBM) ssl_scache_dbm_remove(s, id, idlen); -#if 0 /* XXX */ else if (mc->nSessionCacheMode == SSL_SCMODE_SHMHT) ssl_scache_shmht_remove(s, id, idlen); else if (mc->nSessionCacheMode == SSL_SCMODE_SHMCB) ssl_scache_shmcb_remove(s, id, idlen); -#endif return; } @@ -152,12 +154,10 @@ void ssl_scache_status(server_rec *s, apr_pool_t *p, void (*func)(char *, void * if (mc->nSessionCacheMode == SSL_SCMODE_DBM) ssl_scache_dbm_status(s, p, func, arg); -#if 0 /* XXX */ else if (mc->nSessionCacheMode == SSL_SCMODE_SHMHT) ssl_scache_shmht_status(s, p, func, arg); else if (mc->nSessionCacheMode == SSL_SCMODE_SHMCB) ssl_scache_shmcb_status(s, p, func, arg); -#endif return; } @@ -167,12 +167,10 @@ void ssl_scache_expire(server_rec *s) if (mc->nSessionCacheMode == SSL_SCMODE_DBM) ssl_scache_dbm_expire(s); -#if 0 /* XXX */ else if (mc->nSessionCacheMode == SSL_SCMODE_SHMHT) ssl_scache_shmht_expire(s); else if (mc->nSessionCacheMode == SSL_SCMODE_SHMCB) ssl_scache_shmcb_expire(s); -#endif return; } diff --git a/modules/ssl/ssl_scache_shmcb.c b/modules/ssl/ssl_scache_shmcb.c index f3cb80fd10..508bf9395b 100644 --- a/modules/ssl/ssl_scache_shmcb.c +++ b/modules/ssl/ssl_scache_shmcb.c @@ -59,8 +59,6 @@ #include "mod_ssl.h" -#if 0 /* XXX */ - /* * This shared memory based SSL session cache implementation was * originally written by Geoff Thorpe <geoff@eu.c2.net> for C2Net Europe @@ -178,24 +176,6 @@ * so as to decrease "struct-bloat". sigh. */ typedef struct { -#if 0 - unsigned char division_mask; - unsigned int division_offset; - unsigned int division_size; - unsigned int queue_size; - unsigned int index_num; - unsigned int index_offset; - unsigned int index_size; - unsigned int cache_data_offset; - unsigned int cache_data_size; - unsigned long num_stores; - unsigned long num_expiries; - unsigned long num_scrolled; - unsigned long num_retrieves_hit; - unsigned long num_retrieves_miss; - unsigned long num_removes_hit; - unsigned long num_removes_miss; -#else unsigned long num_stores; unsigned long num_expiries; unsigned long num_scrolled; @@ -208,11 +188,10 @@ typedef struct { unsigned int queue_size; unsigned int cache_data_offset; unsigned int cache_data_size; + unsigned char division_mask; unsigned int index_num; unsigned int index_offset; unsigned int index_size; - unsigned char division_mask; -#endif } SHMCBHeader; /* @@ -262,13 +241,38 @@ typedef struct { memcpys can hardly make a dent on the massive memmove operations this cache technique avoids, nor the overheads of ASN en/decoding. */ static unsigned int shmcb_get_safe_uint(unsigned int *); -static void shmcb_set_safe_uint(unsigned int *, unsigned int); +static void shmcb_set_safe_uint_ex(unsigned char *, const unsigned char *); +#define shmcb_set_safe_uint(pdest, src) \ + do { \ + unsigned int tmp_uint = src; \ + shmcb_set_safe_uint_ex((unsigned char *)pdest, \ + (const unsigned char *)(&tmp_uint)); \ + } while(0) #if 0 /* Unused so far */ static unsigned long shmcb_get_safe_ulong(unsigned long *); -static void shmcb_set_safe_ulong(unsigned long *, unsigned long); +static void shmcb_set_safe_ulong_ex(unsigned char *, const unsigned char *); +#define shmcb_set_safe_ulong(pdest, src) \ + do { \ + unsigned long tmp_ulong = src; \ + shmcb_set_safe_ulong_ex((unsigned char *)pdest, \ + (const unsigned char *)(&tmp_ulong)); \ + } while(0) #endif static time_t shmcb_get_safe_time(time_t *); -static void shmcb_set_safe_time(time_t *, time_t); +static void shmcb_set_safe_time_ex(unsigned char *, const unsigned char *); +#define shmcb_set_safe_time(pdest, src) \ + do { \ + time_t tmp_time = src; \ + shmcb_set_safe_time_ex((unsigned char *)pdest, \ + (const unsigned char *)(&tmp_time)); \ + } while(0) + +/* This is necessary simply so that the size passed to memset() is not a + * compile-time constant, preventing the compiler from optimising it. */ +static void shmcb_safe_clear(void *ptr, size_t size) +{ + memset(ptr, 0, size); +} /* Underlying functions for session-caching */ static BOOL shmcb_init_memory(server_rec *, void *, unsigned int); @@ -306,81 +310,65 @@ static BOOL shmcb_remove_session_id(server_rec *, SHMCBQueue *, SHMCBCache *, UC static unsigned int shmcb_get_safe_uint(unsigned int *ptr) { - unsigned char *from; unsigned int ret; - - from = (unsigned char *)ptr; - memcpy(&ret, from, sizeof(unsigned int)); + shmcb_set_safe_uint_ex((unsigned char *)(&ret), + (const unsigned char *)ptr); return ret; } -static void shmcb_set_safe_uint(unsigned int *ptr, unsigned int val) +static void shmcb_set_safe_uint_ex(unsigned char *dest, + const unsigned char *src) { - unsigned char *to, *from; - - to = (unsigned char *)ptr; - from = (unsigned char *)(&val); - memcpy(to, from, sizeof(unsigned int)); + memcpy(dest, src, sizeof(unsigned int)); } #if 0 /* Unused so far */ static unsigned long shmcb_get_safe_ulong(unsigned long *ptr) { - unsigned char *from; unsigned long ret; - - from = (unsigned char *)ptr; - memcpy(&ret, from, sizeof(unsigned long)); + shmcb_set_safe_ulong_ex((unsigned char *)(&ret), + (const unsigned char *)ptr); return ret; } -static void shmcb_set_safe_ulong(unsigned long *ptr, unsigned long val) +static void shmcb_set_safe_ulong_ex(unsigned char *dest, + const unsigned char *src) { - unsigned char *to, *from; - - to = (unsigned char *)ptr; - from = (unsigned char *)(&val); - memcpy(to, from, sizeof(unsigned long)); + memcpy(dest, src, sizeof(unsigned long)); } #endif static time_t shmcb_get_safe_time(time_t * ptr) { - unsigned char *from; time_t ret; - - from = (unsigned char *)ptr; - memcpy(&ret, from, sizeof(time_t)); + shmcb_set_safe_time_ex((unsigned char *)(&ret), + (const unsigned char *)ptr); return ret; } -static void shmcb_set_safe_time(time_t * ptr, time_t val) +static void shmcb_set_safe_time_ex(unsigned char *dest, + const unsigned char *src) { - unsigned char *to, *from; - - to = (unsigned char *)ptr; - from = (unsigned char *)(&val); - memcpy(to, from, sizeof(time_t)); + memcpy(dest, src, sizeof(time_t)); } - /* ** ** High-Level "handlers" as per ssl_scache.c ** */ -static void *shmcb_malloc(size_t size) +static void *shmcb_malloc(SSLModConfigRec *mc, size_t size) { - SSLModConfigRec *mc = myModConfig(); - return ap_mm_malloc(mc->pSessionCacheDataMM, size); + apr_rmm_off_t off = apr_rmm_malloc(mc->pSessionCacheDataRMM, size); + return apr_rmm_addr_get(mc->pSessionCacheDataRMM, off); } -void ssl_scache_shmcb_init(server_rec *s, pool *p) +void ssl_scache_shmcb_init(server_rec *s, apr_pool_t *p) { - SSLModConfigRec *mc = myModConfig(); - AP_MM *mm; + SSLModConfigRec *mc = myModConfig(s); void *shm_segment = NULL; int avail, avail_orig; + apr_status_t rv; /* * Create shared memory segment @@ -389,23 +377,29 @@ void ssl_scache_shmcb_init(server_rec *s, pool *p) ssl_log(s, SSL_LOG_ERROR, "SSLSessionCache required"); ssl_die(); } - if ((mm = ap_mm_create(mc->nSessionCacheDataSize, - mc->szSessionCacheDataFile)) == NULL) { + + if ((rv = apr_shm_create(&(mc->pSessionCacheDataMM), + mc->nSessionCacheDataSize, + mc->szSessionCacheDataFile, + mc->pPool)) != APR_SUCCESS) { ssl_log(s, SSL_LOG_ERROR, - "Cannot allocate shared memory: %s", ap_mm_error()); + "Cannot allocate shared memory: %d", rv); ssl_die(); } - mc->pSessionCacheDataMM = mm; - /* - * Make sure the child processes have access to the underlying files - */ - ap_mm_permission(mm, SSL_MM_FILE_MODE, ap_user_id, -1); + if ((rv = apr_rmm_init(&(mc->pSessionCacheDataRMM), NULL, + apr_shm_baseaddr_get(mc->pSessionCacheDataMM), + mc->nSessionCacheDataSize, + mc->pPool)) != APR_SUCCESS) { + ssl_log(s, SSL_LOG_ERROR, + "Cannot initialize rmm: %d", rv); + ssl_die(); + } /* * Create cache inside the shared memory segment */ - avail = avail_orig = ap_mm_available(mm); + avail_orig = avail = mc->nSessionCacheDataSize - apr_rmm_overhead_get(0); ssl_log(s, SSL_LOG_TRACE, "Shared-memory segment has %u available", avail); @@ -415,11 +409,11 @@ void ssl_scache_shmcb_init(server_rec *s, pool *p) * and error and output trace information. */ while ((shm_segment == NULL) && ((avail_orig - avail) * 100 < avail_orig)) { - shm_segment = shmcb_malloc(avail); + shm_segment = shmcb_malloc(mc, avail); if (shm_segment == NULL) { ssl_log(s, SSL_LOG_TRACE, "shmcb_malloc attempt for %u bytes failed", avail); - avail -= 2; + avail -= 4; } } if (shm_segment == NULL) { @@ -447,10 +441,15 @@ void ssl_scache_shmcb_init(server_rec *s, pool *p) void ssl_scache_shmcb_kill(server_rec *s) { - SSLModConfigRec *mc = myModConfig(); + SSLModConfigRec *mc = myModConfig(s); + + if (mc->pSessionCacheDataRMM != NULL) { + apr_rmm_destroy(mc->pSessionCacheDataRMM); + mc->pSessionCacheDataRMM = NULL; + } if (mc->pSessionCacheDataMM != NULL) { - ap_mm_destroy(mc->pSessionCacheDataMM); + apr_shm_destroy(mc->pSessionCacheDataMM); mc->pSessionCacheDataMM = NULL; } return; @@ -459,7 +458,7 @@ void ssl_scache_shmcb_kill(server_rec *s) BOOL ssl_scache_shmcb_store(server_rec *s, UCHAR *id, int idlen, time_t timeout, SSL_SESSION * pSession) { - SSLModConfigRec *mc = myModConfig(); + SSLModConfigRec *mc = myModConfig(s); void *shm_segment; BOOL to_return = FALSE; @@ -480,7 +479,7 @@ BOOL ssl_scache_shmcb_store(server_rec *s, UCHAR *id, int idlen, SSL_SESSION *ssl_scache_shmcb_retrieve(server_rec *s, UCHAR *id, int idlen) { - SSLModConfigRec *mc = myModConfig(); + SSLModConfigRec *mc = myModConfig(s); void *shm_segment; SSL_SESSION *pSession; @@ -501,7 +500,7 @@ SSL_SESSION *ssl_scache_shmcb_retrieve(server_rec *s, UCHAR *id, int idlen) void ssl_scache_shmcb_remove(server_rec *s, UCHAR *id, int idlen) { - SSLModConfigRec *mc = myModConfig(); + SSLModConfigRec *mc = myModConfig(s); void *shm_segment; /* We've kludged our pointer into the other cache's member variable. */ @@ -517,10 +516,10 @@ void ssl_scache_shmcb_expire(server_rec *s) return; } -void ssl_scache_shmcb_status(server_rec *s, pool *p, +void ssl_scache_shmcb_status(server_rec *s, apr_pool_t *p, void (*func) (char *, void *), void *arg) { - SSLModConfigRec *mc = myModConfig(); + SSLModConfigRec *mc = myModConfig(s); SHMCBHeader *header; SHMCBQueue queue; SHMCBCache cache; @@ -569,36 +568,36 @@ void ssl_scache_shmcb_status(server_rec *s, pool *p, } index_pct = (100 * total) / (header->index_num * (header->division_mask + 1)); cache_pct = (100 * cache_total) / (header->cache_data_size * (header->division_mask + 1)); - func(ap_psprintf(p, "cache type: <b>SHMCB</b>, shared memory: <b>%d</b> " + func(apr_psprintf(p, "cache type: <b>SHMCB</b>, shared memory: <b>%d</b> " "bytes, current sessions: <b>%d</b><br>", mc->nSessionCacheDataSize, total), arg); - func(ap_psprintf(p, "sub-caches: <b>%d</b>, indexes per sub-cache: " + func(apr_psprintf(p, "sub-caches: <b>%d</b>, indexes per sub-cache: " "<b>%d</b><br>", (int) header->division_mask + 1, (int) header->index_num), arg); if (non_empty_divisions != 0) { average_expiry = (time_t)(expiry_total / (double)non_empty_divisions); - func(ap_psprintf(p, "time left on oldest entries' SSL sessions: "), arg); + func(apr_psprintf(p, "time left on oldest entries' SSL sessions: "), arg); if (now < average_expiry) - func(ap_psprintf(p, "avg: <b>%d</b> seconds, (range: %d...%d)<br>", + func(apr_psprintf(p, "avg: <b>%d</b> seconds, (range: %d...%d)<br>", (int)(average_expiry - now), (int) (min_expiry - now), (int)(max_expiry - now)), arg); else - func(ap_psprintf(p, "expiry threshold: <b>Calculation Error!</b>" + func(apr_psprintf(p, "expiry threshold: <b>Calculation Error!</b>" "<br>"), arg); } - func(ap_psprintf(p, "index usage: <b>%d%%</b>, cache usage: <b>%d%%</b>" + func(apr_psprintf(p, "index usage: <b>%d%%</b>, cache usage: <b>%d%%</b>" "<br>", index_pct, cache_pct), arg); - func(ap_psprintf(p, "total sessions stored since starting: <b>%lu</b><br>", + func(apr_psprintf(p, "total sessions stored since starting: <b>%lu</b><br>", header->num_stores), arg); - func(ap_psprintf(p, "total sessions expired since starting: <b>%lu</b><br>", + func(apr_psprintf(p,"total sessions expired since starting: <b>%lu</b><br>", header->num_expiries), arg); - func(ap_psprintf(p, "total (pre-expiry) sessions scrolled out of the " + func(apr_psprintf(p, "total (pre-expiry) sessions scrolled out of the " "cache: <b>%lu</b><br>", header->num_scrolled), arg); - func(ap_psprintf(p, "total retrieves since starting: <b>%lu</b> hit, " + func(apr_psprintf(p, "total retrieves since starting: <b>%lu</b> hit, " "<b>%lu</b> miss<br>", header->num_retrieves_hit, header->num_retrieves_miss), arg); - func(ap_psprintf(p, "total removes since starting: <b>%lu</b> hit, " + func(apr_psprintf(p, "total removes since starting: <b>%lu</b> hit, " "<b>%lu</b> miss<br>", header->num_removes_hit, header->num_removes_miss), arg); ssl_log(s, SSL_LOG_TRACE, "leaving shmcb_status"); @@ -1342,6 +1341,3 @@ end: ssl_log(s, SSL_LOG_TRACE, "leaving shmcb_remove_session_id"); return to_return; } - -#endif /* XXX */ - diff --git a/modules/ssl/ssl_scache_shmht.c b/modules/ssl/ssl_scache_shmht.c index 6b6aa2592a..98c4468863 100644 --- a/modules/ssl/ssl_scache_shmht.c +++ b/modules/ssl/ssl_scache_shmht.c @@ -59,35 +59,46 @@ #include "mod_ssl.h" -#if 0 /* XXX */ - /* * Wrapper functions for table library which resemble malloc(3) & Co * but use the variants from the MM shared memory library. */ -static void *ssl_scache_shmht_malloc(size_t size) +static void *ssl_scache_shmht_malloc(void *opt_param, size_t size) { - SSLModConfigRec *mc = myModConfig(); - return ap_mm_malloc(mc->pSessionCacheDataMM, size); + SSLModConfigRec *mc = myModConfig((server_rec *)opt_param); + + apr_rmm_off_t off = apr_rmm_calloc(mc->pSessionCacheDataRMM, size); + return apr_rmm_addr_get(mc->pSessionCacheDataRMM, off); } -static void *ssl_scache_shmht_calloc(size_t number, size_t size) +static void *ssl_scache_shmht_calloc(void *opt_param, + size_t number, size_t size) { - SSLModConfigRec *mc = myModConfig(); - return ap_mm_calloc(mc->pSessionCacheDataMM, number, size); + SSLModConfigRec *mc = myModConfig((server_rec *)opt_param); + + apr_rmm_off_t off = apr_rmm_calloc(mc->pSessionCacheDataRMM, (number*size)); +ssl_log((server_rec *)opt_param, SSL_LOG_ERROR, + "rmm calloc returning %ld %ld size %d", + off, apr_rmm_addr_get(mc->pSessionCacheDataRMM, off), (number * size)); + + return apr_rmm_addr_get(mc->pSessionCacheDataRMM, off); } -static void *ssl_scache_shmht_realloc(void *ptr, size_t size) +static void *ssl_scache_shmht_realloc(void *opt_param, void *ptr, size_t size) { - SSLModConfigRec *mc = myModConfig(); - return ap_mm_realloc(mc->pSessionCacheDataMM, ptr, size); + SSLModConfigRec *mc = myModConfig((server_rec *)opt_param); + + apr_rmm_off_t off = apr_rmm_realloc(mc->pSessionCacheDataRMM, ptr, size); + return apr_rmm_addr_get(mc->pSessionCacheDataRMM, off); } -static void ssl_scache_shmht_free(void *ptr) +static void ssl_scache_shmht_free(void *opt_param, void *ptr) { - SSLModConfigRec *mc = myModConfig(); - ap_mm_free(mc->pSessionCacheDataMM, ptr); + SSLModConfigRec *mc = myModConfig((server_rec *)opt_param); + + apr_rmm_off_t off = apr_rmm_offset_get(mc->pSessionCacheDataRMM, ptr); + apr_rmm_free(mc->pSessionCacheDataRMM, off); return; } @@ -96,14 +107,14 @@ static void ssl_scache_shmht_free(void *ptr) * based on a hash table inside a shared memory segment. */ -void ssl_scache_shmht_init(server_rec *s, pool *p) +void ssl_scache_shmht_init(server_rec *s, apr_pool_t *p) { - SSLModConfigRec *mc = myModConfig(); - AP_MM *mm; + SSLModConfigRec *mc = myModConfig(s); table_t *ta; int ta_errno; - int avail; + apr_size_t avail; int n; + apr_status_t rv; /* * Create shared memory segment @@ -112,35 +123,47 @@ void ssl_scache_shmht_init(server_rec *s, pool *p) ssl_log(s, SSL_LOG_ERROR, "SSLSessionCache required"); ssl_die(); } - if ((mm = ap_mm_create(mc->nSessionCacheDataSize, - mc->szSessionCacheDataFile)) == NULL) { - ssl_log(s, SSL_LOG_ERROR, - "Cannot allocate shared memory: %s", ap_mm_error()); + + if ((rv = apr_shm_create(&(mc->pSessionCacheDataMM), + mc->nSessionCacheDataSize, + mc->szSessionCacheDataFile, mc->pPool)) != APR_SUCCESS) { + ssl_log(s, SSL_LOG_ERROR, + "Cannot allocate shared memory: %d", rv); ssl_die(); } - mc->pSessionCacheDataMM = mm; - /* - * Make sure the childs have access to the underlaying files - */ - ap_mm_permission(mm, SSL_MM_FILE_MODE, ap_user_id, -1); + if ((rv = apr_rmm_init(&(mc->pSessionCacheDataRMM), NULL, + apr_shm_baseaddr_get(mc->pSessionCacheDataMM), + mc->nSessionCacheDataSize, mc->pPool)) != APR_SUCCESS) { + ssl_log(s, SSL_LOG_ERROR, + "Cannot initialize rmm: %d", rv); + ssl_die(); + } +ssl_log(s, SSL_LOG_ERROR, "initialize MM %ld RMM %ld", + mc->pSessionCacheDataMM, mc->pSessionCacheDataRMM); /* * Create hash table in shared memory segment */ - avail = ap_mm_available(mm); + avail = mc->nSessionCacheDataSize; n = (avail/2) / 1024; n = n < 10 ? 10 : n; + + /* + * Passing server_rec as opt_param to table_alloc so that we can do + * logging if required ssl_util_table. Otherwise, mc is sufficient. + */ if ((ta = table_alloc(n, &ta_errno, ssl_scache_shmht_malloc, ssl_scache_shmht_calloc, ssl_scache_shmht_realloc, - ssl_scache_shmht_free )) == NULL) { + ssl_scache_shmht_free, s )) == NULL) { ssl_log(s, SSL_LOG_ERROR, "Cannot allocate hash table in shared memory: %s", table_strerror(ta_errno)); ssl_die(); } + table_attr(ta, TABLE_FLAG_AUTO_ADJUST|TABLE_FLAG_ADJUST_DOWN); table_set_data_alignment(ta, sizeof(char *)); table_clear(ta); @@ -157,10 +180,15 @@ void ssl_scache_shmht_init(server_rec *s, pool *p) void ssl_scache_shmht_kill(server_rec *s) { - SSLModConfigRec *mc = myModConfig(); + SSLModConfigRec *mc = myModConfig(s); + + if (mc->pSessionCacheDataRMM != NULL) { + apr_rmm_destroy(mc->pSessionCacheDataRMM); + mc->pSessionCacheDataRMM = NULL; + } if (mc->pSessionCacheDataMM != NULL) { - ap_mm_destroy(mc->pSessionCacheDataMM); + apr_shm_destroy(mc->pSessionCacheDataMM); mc->pSessionCacheDataMM = NULL; } return; @@ -168,7 +196,7 @@ void ssl_scache_shmht_kill(server_rec *s) BOOL ssl_scache_shmht_store(server_rec *s, UCHAR *id, int idlen, time_t expiry, SSL_SESSION *sess) { - SSLModConfigRec *mc = myModConfig(); + SSLModConfigRec *mc = myModConfig(s); void *vp; UCHAR ucaData[SSL_SESSION_MAX_DER]; int nData; @@ -199,7 +227,7 @@ BOOL ssl_scache_shmht_store(server_rec *s, UCHAR *id, int idlen, time_t expiry, SSL_SESSION *ssl_scache_shmht_retrieve(server_rec *s, UCHAR *id, int idlen) { - SSLModConfigRec *mc = myModConfig(); + SSLModConfigRec *mc = myModConfig(s); void *vp; SSL_SESSION *sess = NULL; UCHAR *ucpData; @@ -245,7 +273,7 @@ SSL_SESSION *ssl_scache_shmht_retrieve(server_rec *s, UCHAR *id, int idlen) void ssl_scache_shmht_remove(server_rec *s, UCHAR *id, int idlen) { - SSLModConfigRec *mc = myModConfig(); + SSLModConfigRec *mc = myModConfig(s); /* remove value under key in table */ ssl_mutex_on(s); @@ -256,7 +284,7 @@ void ssl_scache_shmht_remove(server_rec *s, UCHAR *id, int idlen) void ssl_scache_shmht_expire(server_rec *s) { - SSLModConfigRec *mc = myModConfig(); + SSLModConfigRec *mc = myModConfig(s); SSLSrvConfigRec *sc = mySrvConfig(s); static time_t tLast = 0; table_linear_t iterator; @@ -292,6 +320,10 @@ void ssl_scache_shmht_expire(server_rec *s) bDelete = TRUE; else { memcpy(&tExpiresAt, vpData, sizeof(time_t)); + /* + * XXX : Force the record to be cleaned up. TBD (Madhu) + * tExpiresAt = tNow; + */ if (tExpiresAt <= tNow) bDelete = TRUE; } @@ -304,17 +336,19 @@ void ssl_scache_shmht_expire(server_rec *s) vpKeyThis, nKeyThis, NULL, NULL); nDeleted++; } - } while (rc == TABLE_ERROR_NONE); + } while (rc == TABLE_ERROR_NONE); + /* (vpKeyThis != vpKey) && (nKeyThis != nKey) */ } ssl_mutex_off(s); ssl_log(s, SSL_LOG_TRACE, "Inter-Process Session Cache (SHMHT) Expiry: " - "old: %d, new: %d, removed: %d", nElements, nElements-nDeleted, nDeleted); + "old: %d, new: %d, removed: %d", + nElements, nElements-nDeleted, nDeleted); return; } -void ssl_scache_shmht_status(server_rec *s, pool *p, void (*func)(char *, void *), void *arg) +void ssl_scache_shmht_status(server_rec *s, apr_pool_t *p, void (*func)(char *, void *), void *arg) { - SSLModConfigRec *mc = myModConfig(); + SSLModConfigRec *mc = myModConfig(s); void *vpKey; void *vpData; int nKey; @@ -334,18 +368,15 @@ void ssl_scache_shmht_status(server_rec *s, pool *p, void (*func)(char *, void * nElem += 1; nSize += nData; } while (table_next(mc->tSessionCacheDataTable, - &vpKey, &nKey, &vpData, &nData) == TABLE_ERROR_NONE); + &vpKey, &nKey, &vpData, &nData) == TABLE_ERROR_NONE); } ssl_mutex_off(s); if (nSize > 0 && nElem > 0) nAverage = nSize / nElem; else nAverage = 0; - func(ap_psprintf(p, "cache type: <b>SHMHT</b>, maximum size: <b>%d</b> bytes<br>", mc->nSessionCacheDataSize), arg); - func(ap_psprintf(p, "current sessions: <b>%d</b>, current size: <b>%d</b> bytes<br>", nElem, nSize), arg); - func(ap_psprintf(p, "average session size: <b>%d</b> bytes<br>", nAverage), arg); + func(apr_psprintf(p, "cache type: <b>SHMHT</b>, maximum size: <b>%d</b> bytes<br>", mc->nSessionCacheDataSize), arg); + func(apr_psprintf(p, "current sessions: <b>%d</b>, current size: <b>%d</b> bytes<br>", nElem, nSize), arg); + func(apr_psprintf(p, "average session size: <b>%d</b> bytes<br>", nAverage), arg); return; } - -#endif /* XXX */ - diff --git a/modules/ssl/ssl_util_table.c b/modules/ssl/ssl_util_table.c index 7bdaf49c19..ea4ffa189c 100644 --- a/modules/ssl/ssl_util_table.c +++ b/modules/ssl/ssl_util_table.c @@ -96,6 +96,7 @@ typedef struct table_entry_st table_entry_t; #define TABLE_PRIVATE #include "ssl_util_table.h" +#include "mod_ssl.h" /****************************** local defines ******************************/ @@ -205,10 +206,11 @@ struct table_st { table_entry_t **ta_buckets; /* array of linked lists */ table_linear_t ta_linear; /* linear tracking */ unsigned long ta_file_size; /* size of on-disk space */ - void *(*ta_malloc)(size_t size); - void *(*ta_calloc)(size_t number, size_t size); - void *(*ta_realloc)(void *ptr, size_t size); - void (*ta_free)(void *ptr); + void *(*ta_malloc)(void *opt_param, size_t size); + void *(*ta_calloc)(void *opt_param, size_t number, size_t size); + void *(*ta_realloc)(void *opt_param, void *ptr, size_t size); + void (*ta_free)(void *opt_param, void *ptr); + void *opt_param; }; /* external table structure for debuggers */ @@ -249,6 +251,28 @@ static error_str_t errors[] = #define INVALID_ERROR "invalid error code" + +/********************** wrappers for system functions ************************/ +static void *sys_malloc(void *param, size_t size) +{ + return malloc(size); +} + +static void *sys_calloc(void *param, size_t size1, size_t size2) +{ + return calloc(size1, size2); +} + +static void *sys_realloc(void *param, void *ptr, size_t size) +{ + return realloc(ptr, size); +} + +static void sys_free(void *param, void *ptr) +{ + free(ptr); +} + /****************************** local functions ******************************/ /* @@ -804,17 +828,17 @@ static void split(void *first_p, void *last_p, compare_t compare, * and free(3)-style functions. */ table_t *table_alloc(const unsigned int bucket_n, int *error_p, - void *(*malloc_f)(size_t size), - void *(*calloc_f)(size_t number, size_t size), - void *(*realloc_f)(void *ptr, size_t size), - void (*free_f)(void *ptr)) + void *(*malloc_f)(void *opt_param, size_t size), + void *(*calloc_f)(void *opt_param, size_t number, size_t size), + void *(*realloc_f)(void *opt_param, void *ptr, size_t size), + void (*free_f)(void *opt_param, void *ptr), void *opt_param) { table_t *table_p = NULL; unsigned int buck_n; /* allocate a table structure */ if (malloc_f != NULL) - table_p = malloc_f(sizeof(table_t)); + table_p = malloc_f(opt_param, sizeof(table_t)); else table_p = malloc(sizeof(table_t)); if (table_p == NULL) { @@ -829,14 +853,15 @@ table_t *table_alloc(const unsigned int bucket_n, int *error_p, buck_n = DEFAULT_SIZE; /* allocate the buckets which are NULLed */ if (calloc_f != NULL) - table_p->ta_buckets = (table_entry_t **)calloc_f(buck_n, sizeof(table_entry_t *)); + table_p->ta_buckets = (table_entry_t **)calloc_f(opt_param, buck_n, + sizeof(table_entry_t *)); else table_p->ta_buckets = (table_entry_t **)calloc(buck_n, sizeof(table_entry_t *)); if (table_p->ta_buckets == NULL) { if (error_p != NULL) *error_p = TABLE_ERROR_ALLOC; if (free_f != NULL) - free_f(table_p); + free_f(opt_param, table_p); else free(table_p); return NULL; @@ -852,10 +877,11 @@ table_t *table_alloc(const unsigned int bucket_n, int *error_p, table_p->ta_linear.tl_bucket_c = 0; table_p->ta_linear.tl_entry_c = 0; table_p->ta_file_size = 0; - table_p->ta_malloc = malloc_f != NULL ? malloc_f : malloc; - table_p->ta_calloc = calloc_f != NULL ? calloc_f : calloc; - table_p->ta_realloc = realloc_f != NULL ? realloc_f : realloc; - table_p->ta_free = free_f != NULL ? free_f : free; + table_p->ta_malloc = malloc_f != NULL ? malloc_f : sys_malloc; + table_p->ta_calloc = calloc_f != NULL ? calloc_f : sys_calloc; + table_p->ta_realloc = realloc_f != NULL ? realloc_f : sys_realloc; + table_p->ta_free = free_f != NULL ? free_f : sys_free; + table_p->opt_param = opt_param; if (error_p != NULL) *error_p = TABLE_ERROR_NONE; @@ -972,13 +998,14 @@ int table_clear(table_t * table_p) return TABLE_ERROR_PNT; /* free the table allocation and table structure */ bounds_p = table_p->ta_buckets + table_p->ta_bucket_n; - for (bucket_p = table_p->ta_buckets; bucket_p < bounds_p; bucket_p++) { + for (bucket_p = table_p->ta_buckets; bucket_p <= bounds_p; bucket_p++) { +#if 0 for (entry_p = *bucket_p; entry_p != NULL; entry_p = next_p) { /* record the next pointer before we free */ next_p = entry_p->te_next_p; - table_p->ta_free(entry_p); + table_p->ta_free(table_p->opt_param, entry_p); } - +#endif /* clear the bucket entry after we free its entries */ *bucket_p = NULL; } @@ -1020,9 +1047,9 @@ int table_free(table_t * table_p) ret = table_clear(table_p); if (table_p->ta_buckets != NULL) - table_p->ta_free(table_p->ta_buckets); + table_p->ta_free(table_p->opt_param, table_p->ta_buckets); table_p->ta_magic = 0; - table_p->ta_free(table_p); + table_p->ta_free(table_p->opt_param, table_p); return ret; } @@ -1140,7 +1167,7 @@ int table_insert_kd(table_t * table_p, /* look for the entry in this bucket, only check keys of the same size */ last_p = NULL; for (entry_p = table_p->ta_buckets[bucket]; - entry_p != NULL; + (entry_p != NULL) && (entry_p->te_next_p != last_p); last_p = entry_p, entry_p = entry_p->te_next_p) { if (entry_p->te_key_size == ksize && memcmp(ENTRY_KEY_BUF(entry_p), key_buf, ksize) == 0) @@ -1186,10 +1213,9 @@ int table_insert_kd(table_t * table_p, * this may change any previous data_key_p and data_copy_p * pointers. */ - entry_p = (table_entry_t *) table_p->ta_realloc(entry_p, - entry_size(table_p, - entry_p->te_key_size, - dsize)); + entry_p = (table_entry_t *) + table_p->ta_realloc(table_p->opt_param, entry_p, + entry_size(table_p, entry_p->te_key_size, dsize)); if (entry_p == NULL) return TABLE_ERROR_ALLOC; /* add it back to the front of the list */ @@ -1222,7 +1248,9 @@ int table_insert_kd(table_t * table_p, */ /* allocate a new entry */ - entry_p = (table_entry_t *) table_p->ta_malloc(entry_size(table_p, ksize, dsize)); + entry_p = (table_entry_t *) + table_p->ta_malloc(table_p->opt_param, + entry_size(table_p, ksize, dsize)); if (entry_p == NULL) return TABLE_ERROR_ALLOC; /* copy key into storage */ @@ -1509,7 +1537,8 @@ int table_delete(table_t * table_p, * if we were storing it compacted, we now need to malloc some * space if the user wants the value after the delete. */ - *data_buf_p = table_p->ta_malloc(entry_p->te_data_size); + *data_buf_p = table_p->ta_malloc(table_p->opt_param, + entry_p->te_data_size); if (*data_buf_p == NULL) return TABLE_ERROR_ALLOC; if (table_p->ta_data_align == 0) @@ -1521,7 +1550,8 @@ int table_delete(table_t * table_p, } if (data_size_p != NULL) *data_size_p = entry_p->te_data_size; - table_p->ta_free(entry_p); + table_p->ta_free(table_p->opt_param, entry_p); + entry_p = NULL; table_p->ta_entry_n--; @@ -1616,7 +1646,8 @@ int table_delete_first(table_t * table_p, * if we were storing it compacted, we now need to malloc some * space if the user wants the value after the delete. */ - *key_buf_p = table_p->ta_malloc(entry_p->te_key_size); + *key_buf_p = table_p->ta_malloc(table_p->opt_param, + entry_p->te_key_size); if (*key_buf_p == NULL) return TABLE_ERROR_ALLOC; memcpy(*key_buf_p, ENTRY_KEY_BUF(entry_p), entry_p->te_key_size); @@ -1632,7 +1663,8 @@ int table_delete_first(table_t * table_p, * if we were storing it compacted, we now need to malloc some * space if the user wants the value after the delete. */ - *data_buf_p = table_p->ta_malloc(entry_p->te_data_size); + *data_buf_p = table_p->ta_malloc(table_p->opt_param, + entry_p->te_data_size); if (*data_buf_p == NULL) return TABLE_ERROR_ALLOC; if (table_p->ta_data_align == 0) @@ -1644,7 +1676,7 @@ int table_delete_first(table_t * table_p, } if (data_size_p != NULL) *data_size_p = entry_p->te_data_size; - table_p->ta_free(entry_p); + table_p->ta_free(table_p->opt_param, entry_p); table_p->ta_entry_n--; @@ -1739,10 +1771,12 @@ int table_adjust(table_t * table_p, const int bucket_n) if (buck_n == 0) buck_n = 1; /* make sure we have somethign to do */ - if (buck_n == table_p->ta_bucket_n) + if (buck_n <= table_p->ta_bucket_n) return TABLE_ERROR_NONE; /* allocate a new bucket list */ - buckets = (table_entry_t **) table_p->ta_calloc(buck_n, sizeof(table_entry_t *)); + buckets = (table_entry_t **) + table_p->ta_calloc(table_p->opt_param, + buck_n, sizeof(table_entry_t *)); if (table_p->ta_buckets == NULL) return TABLE_ERROR_ALLOC; /* @@ -1773,7 +1807,7 @@ int table_adjust(table_t * table_p, const int bucket_n) } /* replace the table buckets with the new ones */ - table_p->ta_free(table_p->ta_buckets); + table_p->ta_free(table_p->opt_param, table_p->ta_buckets); table_p->ta_buckets = buckets; table_p->ta_bucket_n = buck_n; @@ -2402,8 +2436,9 @@ table_entry_t **table_order(table_t * table_p, table_compare_t compare, return NULL; } - entries = (table_entry_t **) table_p->ta_malloc(table_p->ta_entry_n * - sizeof(table_entry_t *)); + entries = (table_entry_t **) + table_p->ta_malloc(table_p->opt_param, + table_p->ta_entry_n *sizeof(table_entry_t *)); if (entries == NULL) { if (error_p != NULL) *error_p = TABLE_ERROR_ALLOC; diff --git a/modules/ssl/ssl_util_table.h b/modules/ssl/ssl_util_table.h index f7137b98e9..b7b1885a61 100644 --- a/modules/ssl/ssl_util_table.h +++ b/modules/ssl/ssl_util_table.h @@ -155,7 +155,7 @@ typedef void table_entry_t; /* * Prototypes */ -extern table_t *table_alloc(const unsigned int bucket_n, int *error_p, void *(*malloc_f)(size_t size), void *(*calloc_f)(size_t number, size_t size), void *(*realloc_f)(void *ptr, size_t size), void (*free_f)(void *ptr)); +extern table_t *table_alloc(const unsigned int bucket_n, int *error_p, void *(*malloc_f)(void *opt_param, size_t size), void *(*calloc_f)(void *opt_param, size_t number, size_t size), void *(*realloc_f)(void *opt_param, void *ptr, size_t size), void (*free_f)(void *opt_param, void *ptr), void *opt_param); extern int table_attr(table_t *table_p, const int attr); extern int table_set_data_alignment(table_t *table_p, const int alignment); extern int table_clear(table_t *table_p); |