]> git.ipfire.org Git - thirdparty/krb5.git/commitdiff
Add debug mode to gssapi_alloc.h
authorGreg Hudson <ghudson@mit.edu>
Sat, 11 Aug 2012 04:05:24 +0000 (00:05 -0400)
committerGreg Hudson <ghudson@mit.edu>
Sat, 11 Aug 2012 04:28:26 +0000 (00:28 -0400)
Because the gssalloc macros are normally equivalent to malloc and free
on Unix, we cannot use the full test suite to find cases where we
allocate with malloc and free with gssalloc_free or vice versa.
Provide a way to test for this kind of bug (if only in a special build
configuration) by supporting a DEBUG_GSSALLOC symbol, which causes the
gssalloc wrappers to be deliberately incompatible with malloc and
free.

src/lib/gssapi/generic/gssapiP_generic.h
src/lib/gssapi/generic/gssapi_alloc.h
src/lib/gssapi/krb5/gssapiP_krb5.h

index 1124c51e591f2cdb7cce363c6daafa2b694a702f..3fb0c762277ff04d438f15cd20313fa07d59f09b 100644 (file)
@@ -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) {
index 9c0f340b1117867aad3b6cfa31d94516c8ebf622..9a5cd9892c2c60eee640146ddb3742640f512c52 100644 (file)
 
 #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)
 {
index 56b025b7676b7adb4c97c892d59274d2aa39d49b..8785ec981fe27ac5daa0eed831131578ba1a862e 100644 (file)
@@ -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)