diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/gssapi/generic/gssapiP_generic.h | 2 | ||||
-rw-r--r-- | src/lib/gssapi/generic/gssapi_alloc.h | 98 | ||||
-rw-r--r-- | src/lib/gssapi/krb5/gssapiP_krb5.h | 2 |
3 files changed, 79 insertions, 23 deletions
diff --git a/src/lib/gssapi/generic/gssapiP_generic.h b/src/lib/gssapi/generic/gssapiP_generic.h index 1124c51e59..3fb0c76227 100644 --- a/src/lib/gssapi/generic/gssapiP_generic.h +++ b/src/lib/gssapi/generic/gssapiP_generic.h @@ -278,7 +278,7 @@ k5buf_to_gss(OM_uint32 *minor, OM_uint32 status = GSS_S_COMPLETE; char *bp = krb5int_buf_data(input_k5buf); output_buffer->length = krb5int_buf_len(input_k5buf)+1; -#ifdef _WIN32 +#if defined(_WIN32) || defined(DEBUG_GSSALLOC) if (output_buffer->length > 0) { output_buffer->value = gssalloc_malloc(output_buffer->length); if (output_buffer->value) { diff --git a/src/lib/gssapi/generic/gssapi_alloc.h b/src/lib/gssapi/generic/gssapi_alloc.h index 9c0f340b11..9a5cd9892c 100644 --- a/src/lib/gssapi/generic/gssapi_alloc.h +++ b/src/lib/gssapi/generic/gssapi_alloc.h @@ -9,54 +9,110 @@ #ifdef _WIN32 #include "winbase.h" -#define USE_HEAPALLOC 1 -#else -#define USE_HEAPALLOC 0 #endif #include <string.h> +#if defined(_WIN32) + static inline void -gssalloc_free(void * value) +gssalloc_free(void *value) { - if (value) { -#if USE_HEAPALLOC + if (value) HeapFree(GetProcessHeap(), 0, value); -#else - free(value); -#endif - } } static inline void * gssalloc_malloc(size_t size) { -#if USE_HEAPALLOC return HeapAlloc(GetProcessHeap(), 0, size); -#else - return malloc(size); -#endif } static inline void * gssalloc_calloc(size_t count, size_t size) { -#if USE_HEAPALLOC return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, count * size); -#else - return calloc(count, size); -#endif } static inline void * gssalloc_realloc(void *value, size_t size) { -#if USE_HEAPALLOC return HeapReAlloc(GetProcessHeap(), 0, value, size); -#else +} + +#elif defined(DEBUG_GSSALLOC) + +/* Be deliberately incompatible with malloc and free, to allow us to detect + * mismatched malloc/gssalloc usage on Unix. */ + +static inline void +gssalloc_free(void *value) +{ + char *p = (char *)value - 8; + + if (value == NULL) + return; + if (memcmp(p, "gssalloc", 8) != 0) + abort(); + free(p); +} + +static inline void * +gssalloc_malloc(size_t size) +{ + char *p = calloc(size + 8, 1); + + memcpy(p, "gssalloc", 8); + return p + 8; +} + +static inline void * +gssalloc_calloc(size_t count, size_t size) +{ + return gssalloc_malloc(count * size); +} + +static inline void * +gssalloc_realloc(void *value, size_t size) +{ + char *p = (char *)value - 8; + + if (value == NULL) + return gssalloc_malloc(size); + if (memcmp(p, "gssalloc", 8) != 0) + abort(); + return (char *)realloc(p, size) + 8; +} + +#else /* not _WIN32 or DEBUG_GSSALLOC */ + +/* Normal Unix case, just use free/malloc/calloc/realloc. */ + +static inline void +gssalloc_free(void *value) +{ + free(value); +} + +static inline void * +gssalloc_malloc(size_t size) +{ + return malloc(size); +} + +static inline void * +gssalloc_calloc(size_t count, size_t size) +{ + return calloc(count, size); +} + +static inline void * +gssalloc_realloc(void *value, size_t size) +{ return realloc(value, size); -#endif } +#endif /* not _WIN32 or DEBUG_GSSALLOC */ + static inline char * gssalloc_strdup(const char *str) { diff --git a/src/lib/gssapi/krb5/gssapiP_krb5.h b/src/lib/gssapi/krb5/gssapiP_krb5.h index 56b025b767..8785ec981f 100644 --- a/src/lib/gssapi/krb5/gssapiP_krb5.h +++ b/src/lib/gssapi/krb5/gssapiP_krb5.h @@ -1204,7 +1204,7 @@ data_to_gss(krb5_data *input_k5data, gss_buffer_t output_buffer) { krb5_error_code code = 0; output_buffer->length = input_k5data->length; -#ifdef _WIN32 +#if defined(_WIN32) || defined(DEBUG_GSSALLOC) if (output_buffer->length > 0) { output_buffer->value = gssalloc_malloc(output_buffer->length); if (output_buffer->value) |