123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- /* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
- /* To the extent possible under law, Painless Security, LLC has waived
- * all copyright and related or neighboring rights to GSS-API Memory
- * Management Header. This work is published from: United States.
- */
- #ifndef GSSAPI_ALLOC_H
- #define GSSAPI_ALLOC_H
- #ifdef _WIN32
- #include "winbase.h"
- #endif
- #include <string.h>
- #if defined(_WIN32)
- static inline void
- gssalloc_free(void *value)
- {
- if (value)
- HeapFree(GetProcessHeap(), 0, value);
- }
- static inline void *
- gssalloc_malloc(size_t size)
- {
- return HeapAlloc(GetProcessHeap(), 0, size);
- }
- static inline void *
- gssalloc_calloc(size_t count, size_t size)
- {
- return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, count * size);
- }
- static inline void *
- gssalloc_realloc(void *value, size_t size)
- {
- /* Unlike realloc(), HeapReAlloc() does not work on null values. */
- if (value == NULL)
- return HeapAlloc(GetProcessHeap(), 0, size);
- return HeapReAlloc(GetProcessHeap(), 0, value, size);
- }
- #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) + 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 /* not _WIN32 or DEBUG_GSSALLOC */
- static inline char *
- gssalloc_strdup(const char *str)
- {
- size_t size = strlen(str)+1;
- char *copy = gssalloc_malloc(size);
- if (copy) {
- memcpy(copy, str, size);
- copy[size-1] = '\0';
- }
- return copy;
- }
- #endif
|