Spaces:
Runtime error
Runtime error
| /* -*- 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. | |
| */ | |
| 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); | |
| } | |
| /* 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; | |
| } | |
| /* 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); | |
| } | |
| 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; | |
| } | |