gssapi_alloc.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
  2. /* To the extent possible under law, Painless Security, LLC has waived
  3. * all copyright and related or neighboring rights to GSS-API Memory
  4. * Management Header. This work is published from: United States.
  5. */
  6. #ifndef GSSAPI_ALLOC_H
  7. #define GSSAPI_ALLOC_H
  8. #ifdef _WIN32
  9. #include "winbase.h"
  10. #endif
  11. #include <string.h>
  12. #if defined(_WIN32)
  13. static inline void
  14. gssalloc_free(void *value)
  15. {
  16. if (value)
  17. HeapFree(GetProcessHeap(), 0, value);
  18. }
  19. static inline void *
  20. gssalloc_malloc(size_t size)
  21. {
  22. return HeapAlloc(GetProcessHeap(), 0, size);
  23. }
  24. static inline void *
  25. gssalloc_calloc(size_t count, size_t size)
  26. {
  27. return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, count * size);
  28. }
  29. static inline void *
  30. gssalloc_realloc(void *value, size_t size)
  31. {
  32. /* Unlike realloc(), HeapReAlloc() does not work on null values. */
  33. if (value == NULL)
  34. return HeapAlloc(GetProcessHeap(), 0, size);
  35. return HeapReAlloc(GetProcessHeap(), 0, value, size);
  36. }
  37. #elif defined(DEBUG_GSSALLOC)
  38. /* Be deliberately incompatible with malloc and free, to allow us to detect
  39. * mismatched malloc/gssalloc usage on Unix. */
  40. static inline void
  41. gssalloc_free(void *value)
  42. {
  43. char *p = (char *)value - 8;
  44. if (value == NULL)
  45. return;
  46. if (memcmp(p, "gssalloc", 8) != 0)
  47. abort();
  48. free(p);
  49. }
  50. static inline void *
  51. gssalloc_malloc(size_t size)
  52. {
  53. char *p = calloc(size + 8, 1);
  54. memcpy(p, "gssalloc", 8);
  55. return p + 8;
  56. }
  57. static inline void *
  58. gssalloc_calloc(size_t count, size_t size)
  59. {
  60. return gssalloc_malloc(count * size);
  61. }
  62. static inline void *
  63. gssalloc_realloc(void *value, size_t size)
  64. {
  65. char *p = (char *)value - 8;
  66. if (value == NULL)
  67. return gssalloc_malloc(size);
  68. if (memcmp(p, "gssalloc", 8) != 0)
  69. abort();
  70. return (char *)realloc(p, size + 8) + 8;
  71. }
  72. #else /* not _WIN32 or DEBUG_GSSALLOC */
  73. /* Normal Unix case, just use free/malloc/calloc/realloc. */
  74. static inline void
  75. gssalloc_free(void *value)
  76. {
  77. free(value);
  78. }
  79. static inline void *
  80. gssalloc_malloc(size_t size)
  81. {
  82. return malloc(size);
  83. }
  84. static inline void *
  85. gssalloc_calloc(size_t count, size_t size)
  86. {
  87. return calloc(count, size);
  88. }
  89. static inline void *
  90. gssalloc_realloc(void *value, size_t size)
  91. {
  92. return realloc(value, size);
  93. }
  94. #endif /* not _WIN32 or DEBUG_GSSALLOC */
  95. static inline char *
  96. gssalloc_strdup(const char *str)
  97. {
  98. size_t size = strlen(str)+1;
  99. char *copy = gssalloc_malloc(size);
  100. if (copy) {
  101. memcpy(copy, str, size);
  102. copy[size-1] = '\0';
  103. }
  104. return copy;
  105. }
  106. #endif