aboutsummaryrefslogtreecommitdiff
path: root/include/alloc-inl.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/alloc-inl.h')
-rw-r--r--include/alloc-inl.h246
1 files changed, 127 insertions, 119 deletions
diff --git a/include/alloc-inl.h b/include/alloc-inl.h
index 7c8bab58..cc394040 100644
--- a/include/alloc-inl.h
+++ b/include/alloc-inl.h
@@ -45,39 +45,40 @@
/* User-facing macro to sprintf() to a dynamically allocated buffer. */
-# define alloc_printf(_str...) \
- ({ \
- u8 *_tmp; \
- s32 _len = snprintf(NULL, 0, _str); \
- if (_len < 0) FATAL("Whoa, snprintf() fails?!"); \
- _tmp = ck_alloc(_len + 1); \
- snprintf((char *)_tmp, _len + 1, _str); \
- _tmp; \
-
- })
+#define alloc_printf(_str...) \
+ ({ \
+ \
+ u8 *_tmp; \
+ s32 _len = snprintf(NULL, 0, _str); \
+ if (_len < 0) FATAL("Whoa, snprintf() fails?!"); \
+ _tmp = ck_alloc(_len + 1); \
+ snprintf((char *)_tmp, _len + 1, _str); \
+ _tmp; \
+ \
+ })
/* Macro to enforce allocation limits as a last-resort defense against
integer overflows. */
-# define ALLOC_CHECK_SIZE(_s) \
- do { \
- if ((_s) > MAX_ALLOC) ABORT("Bad alloc request: %u bytes", (_s)); \
- \
-
- } while (0)
+#define ALLOC_CHECK_SIZE(_s) \
+ do { \
+ \
+ if ((_s) > MAX_ALLOC) ABORT("Bad alloc request: %u bytes", (_s)); \
+ \
+ } while (0)
/* Macro to check malloc() failures and the like. */
-# define ALLOC_CHECK_RESULT(_r, _s) \
- do { \
- if (!(_r)) ABORT("Out of memory: can't allocate %u bytes", (_s)); \
- \
-
- } while (0)
+#define ALLOC_CHECK_RESULT(_r, _s) \
+ do { \
+ \
+ if (!(_r)) ABORT("Out of memory: can't allocate %u bytes", (_s)); \
+ \
+ } while (0)
/* Allocator increments for ck_realloc_block(). */
-# define ALLOC_BLK_INC 256
+#define ALLOC_BLK_INC 256
/* Allocate a buffer, explicitly not zeroing it. Returns NULL for zero-sized
requests. */
@@ -213,103 +214,112 @@ static inline u8 *DFL_ck_memdup_str(u8 *mem, u32 size) {
}
-/* In non-debug mode, we just do straightforward aliasing of the above functions
- to user-visible names such as ck_alloc(). */
+/* In non-debug mode, we just do straightforward aliasing of the above
+ functions to user-visible names such as ck_alloc(). */
-# define ck_alloc DFL_ck_alloc
-# define ck_alloc_nozero DFL_ck_alloc_nozero
-# define ck_realloc DFL_ck_realloc
-# define ck_realloc_block DFL_ck_realloc_block
-# define ck_strdup DFL_ck_strdup
-# define ck_memdup DFL_ck_memdup
-# define ck_memdup_str DFL_ck_memdup_str
-# define ck_free DFL_ck_free
+#define ck_alloc DFL_ck_alloc
+#define ck_alloc_nozero DFL_ck_alloc_nozero
+#define ck_realloc DFL_ck_realloc
+#define ck_realloc_block DFL_ck_realloc_block
+#define ck_strdup DFL_ck_strdup
+#define ck_memdup DFL_ck_memdup
+#define ck_memdup_str DFL_ck_memdup_str
+#define ck_free DFL_ck_free
-# define alloc_report()
+#define alloc_report()
#else
// This is the original alloc-inl of stock afl
/* User-facing macro to sprintf() to a dynamically allocated buffer. */
-# define alloc_printf(_str...) \
+#define alloc_printf(_str...) \
({ \
+ \
+ \
u8 *_tmp; \
s32 _len = snprintf(NULL, 0, _str); \
if (_len < 0) FATAL("Whoa, snprintf() fails?!"); \
_tmp = ck_alloc(_len + 1); \
snprintf((char *)_tmp, _len + 1, _str); \
- _tmp; \
+ _tmp;
- })
+})
/* Macro to enforce allocation limits as a last-resort defense against
integer overflows. */
+#define ALLOC_CHECK_SIZE(_s) \
+ do { \
+ \
+ if ((_s) > MAX_ALLOC) ABORT("Bad alloc request: %u bytes", (_s));
-# define ALLOC_CHECK_SIZE(_s) \
- do { \
- if ((_s) > MAX_ALLOC) ABORT("Bad alloc request: %u bytes", (_s)); \
- \
+}
- } while (0)
+while (0)
/* Macro to check malloc() failures and the like. */
-# define ALLOC_CHECK_RESULT(_r, _s) \
- do { \
- if (!(_r)) ABORT("Out of memory: can't allocate %u bytes", (_s)); \
- \
+#define ALLOC_CHECK_RESULT(_r, _s) \
+ do { \
+ \
+ if (!(_r)) ABORT("Out of memory: can't allocate %u bytes", (_s));
- } while (0)
+}
+
+while (0)
/* Magic tokens used to mark used / freed chunks. */
-# define ALLOC_MAGIC_C1 0xFF00FF00 /* Used head (dword) */
-# define ALLOC_MAGIC_F 0xFE00FE00 /* Freed head (dword) */
-# define ALLOC_MAGIC_C2 0xF0 /* Used tail (byte) */
+#define ALLOC_MAGIC_C1 0xFF00FF00 /* Used head (dword) */
+#define ALLOC_MAGIC_F 0xFE00FE00 /* Freed head (dword) */
+#define ALLOC_MAGIC_C2 0xF0 /* Used tail (byte) */
/* Positions of guard tokens in relation to the user-visible pointer. */
-# define ALLOC_C1(_ptr) (((u32 *)(_ptr))[-2])
-# define ALLOC_S(_ptr) (((u32 *)(_ptr))[-1])
-# define ALLOC_C2(_ptr) (((u8 *)(_ptr))[ALLOC_S(_ptr)])
+#define ALLOC_C1(_ptr) (((u32 *)(_ptr))[-2])
+#define ALLOC_S(_ptr) (((u32 *)(_ptr))[-1])
+#define ALLOC_C2(_ptr) (((u8 *)(_ptr))[ALLOC_S(_ptr)])
-# define ALLOC_OFF_HEAD 8
-# define ALLOC_OFF_TOTAL (ALLOC_OFF_HEAD + 1)
+#define ALLOC_OFF_HEAD 8
+#define ALLOC_OFF_TOTAL (ALLOC_OFF_HEAD + 1)
/* Allocator increments for ck_realloc_block(). */
-# define ALLOC_BLK_INC 256
+#define ALLOC_BLK_INC 256
/* Sanity-checking macros for pointers. */
-# define CHECK_PTR(_p) \
- do { \
- if (_p) { \
- if (ALLOC_C1(_p) ^ ALLOC_MAGIC_C1) { \
- if (ALLOC_C1(_p) == ALLOC_MAGIC_F) \
- ABORT("Use after free."); \
- else \
- ABORT("Corrupted head alloc canary."); \
+#define CHECK_PTR(_p) \
+ do { \
+ \
+ if (_p) { \
+ \
+ if (ALLOC_C1(_p) ^ ALLOC_MAGIC_C1) { \
+ \
+ if (ALLOC_C1(_p) == ALLOC_MAGIC_F) \
+ ABORT("Use after free."); \
+ else \
+ ABORT("Corrupted head alloc canary.");
- } \
+}
- if (ALLOC_C2(_p) ^ ALLOC_MAGIC_C2) \
- ABORT("Corrupted tail alloc canary."); \
+if (ALLOC_C2(_p) ^ ALLOC_MAGIC_C2) ABORT("Corrupted tail alloc canary.");
- } \
+}
- \
+}
- } while (0)
+while (0)
-# define CHECK_PTR_EXPR(_p) \
+#define CHECK_PTR_EXPR(_p) \
({ \
+ \
+ \
typeof(_p) _tmp = (_p); \
CHECK_PTR(_tmp); \
- _tmp; \
+ _tmp;
- })
+})
/* Allocate a buffer, explicitly not zeroing it. Returns NULL for zero-sized
requests. */
@@ -355,13 +365,12 @@ static inline void DFL_ck_free(void *mem) {
if (!mem) return;
CHECK_PTR(mem);
-
-# ifdef DEBUG_BUILD
+#ifdef DEBUG_BUILD
/* Catch pointer issues sooner. */
memset(mem, 0xFF, ALLOC_S(mem));
-# endif /* DEBUG_BUILD */
+#endif /* DEBUG_BUILD */
ALLOC_C1(mem) = ALLOC_MAGIC_F;
@@ -389,9 +398,9 @@ static inline void *DFL_ck_realloc(void *orig, u32 size) {
CHECK_PTR(orig);
-# ifndef DEBUG_BUILD
+#ifndef DEBUG_BUILD
ALLOC_C1(orig) = ALLOC_MAGIC_F;
-# endif /* !DEBUG_BUILD */
+#endif /* !DEBUG_BUILD */
old_size = ALLOC_S(orig);
orig -= ALLOC_OFF_HEAD;
@@ -402,12 +411,12 @@ static inline void *DFL_ck_realloc(void *orig, u32 size) {
ALLOC_CHECK_SIZE(size);
-# ifndef DEBUG_BUILD
+#ifndef DEBUG_BUILD
ret = realloc(orig, size + ALLOC_OFF_TOTAL);
ALLOC_CHECK_RESULT(ret, size);
-# else
+#else
/* Catch pointer issues sooner: force relocation and make sure that the
original buffer is wiped. */
@@ -426,7 +435,7 @@ static inline void *DFL_ck_realloc(void *orig, u32 size) {
}
-# endif /* ^!DEBUG_BUILD */
+#endif /* ^!DEBUG_BUILD */
ret += ALLOC_OFF_HEAD;
@@ -445,7 +454,7 @@ static inline void *DFL_ck_realloc(void *orig, u32 size) {
static inline void *DFL_ck_realloc_block(void *orig, u32 size) {
-# ifndef DEBUG_BUILD
+#ifndef DEBUG_BUILD
if (orig) {
@@ -457,7 +466,7 @@ static inline void *DFL_ck_realloc_block(void *orig, u32 size) {
}
-# endif /* !DEBUG_BUILD */
+#endif /* !DEBUG_BUILD */
return DFL_ck_realloc(orig, size);
@@ -537,30 +546,30 @@ static inline u8 *DFL_ck_memdup_str(u8 *mem, u32 size) {
}
-# ifndef DEBUG_BUILD
+#ifndef DEBUG_BUILD
-/* In non-debug mode, we just do straightforward aliasing of the above functions
- to user-visible names such as ck_alloc(). */
+/* In non-debug mode, we just do straightforward aliasing of the above
+ functions to user-visible names such as ck_alloc(). */
-# define ck_alloc DFL_ck_alloc
-# define ck_alloc_nozero DFL_ck_alloc_nozero
-# define ck_realloc DFL_ck_realloc
-# define ck_realloc_block DFL_ck_realloc_block
-# define ck_strdup DFL_ck_strdup
-# define ck_memdup DFL_ck_memdup
-# define ck_memdup_str DFL_ck_memdup_str
-# define ck_free DFL_ck_free
+#define ck_alloc DFL_ck_alloc
+#define ck_alloc_nozero DFL_ck_alloc_nozero
+#define ck_realloc DFL_ck_realloc
+#define ck_realloc_block DFL_ck_realloc_block
+#define ck_strdup DFL_ck_strdup
+#define ck_memdup DFL_ck_memdup
+#define ck_memdup_str DFL_ck_memdup_str
+#define ck_free DFL_ck_free
-# define alloc_report()
+#define alloc_report()
-# else
+#else
-/* In debugging mode, we also track allocations to detect memory leaks, and the
- flow goes through one more layer of indirection. */
+/* In debugging mode, we also track allocations to detect memory leaks, and
+ the flow goes through one more layer of indirection. */
/* Alloc tracking data structures: */
-# define ALLOC_BUCKETS 4096
+#define ALLOC_BUCKETS 4096
struct TRK_obj {
@@ -570,25 +579,25 @@ struct TRK_obj {
};
-# ifdef AFL_MAIN
+#ifdef AFL_MAIN
struct TRK_obj *TRK[ALLOC_BUCKETS];
u32 TRK_cnt[ALLOC_BUCKETS];
-# define alloc_report() TRK_report()
+#define alloc_report() TRK_report()
-# else
+#else
extern struct TRK_obj *TRK[ALLOC_BUCKETS];
extern u32 TRK_cnt[ALLOC_BUCKETS];
-# define alloc_report()
+#define alloc_report()
-# endif /* ^AFL_MAIN */
+#endif /* ^AFL_MAIN */
/* Bucket-assigning function for a given pointer: */
-# define TRKH(_ptr) (((((u32)(_ptr)) >> 16) ^ ((u32)(_ptr))) % ALLOC_BUCKETS)
+#define TRKH(_ptr) (((((u32)(_ptr)) >> 16) ^ ((u32)(_ptr))) % ALLOC_BUCKETS)
/* Add a new entry to the list of allocated objects. */
@@ -740,28 +749,27 @@ static inline void TRK_ck_free(void *ptr, const char *file, const char *func,
/* Aliasing user-facing names to tracking functions: */
-# define ck_alloc(_p1) TRK_ck_alloc(_p1, __FILE__, __FUNCTION__, __LINE__)
+#define ck_alloc(_p1) TRK_ck_alloc(_p1, __FILE__, __FUNCTION__, __LINE__)
-# define ck_alloc_nozero(_p1) \
- TRK_ck_alloc(_p1, __FILE__, __FUNCTION__, __LINE__)
+#define ck_alloc_nozero(_p1) TRK_ck_alloc(_p1, __FILE__, __FUNCTION__, __LINE__)
-# define ck_realloc(_p1, _p2) \
- TRK_ck_realloc(_p1, _p2, __FILE__, __FUNCTION__, __LINE__)
+#define ck_realloc(_p1, _p2) \
+ TRK_ck_realloc(_p1, _p2, __FILE__, __FUNCTION__, __LINE__)
-# define ck_realloc_block(_p1, _p2) \
- TRK_ck_realloc_block(_p1, _p2, __FILE__, __FUNCTION__, __LINE__)
+#define ck_realloc_block(_p1, _p2) \
+ TRK_ck_realloc_block(_p1, _p2, __FILE__, __FUNCTION__, __LINE__)
-# define ck_strdup(_p1) TRK_ck_strdup(_p1, __FILE__, __FUNCTION__, __LINE__)
+#define ck_strdup(_p1) TRK_ck_strdup(_p1, __FILE__, __FUNCTION__, __LINE__)
-# define ck_memdup(_p1, _p2) \
- TRK_ck_memdup(_p1, _p2, __FILE__, __FUNCTION__, __LINE__)
+#define ck_memdup(_p1, _p2) \
+ TRK_ck_memdup(_p1, _p2, __FILE__, __FUNCTION__, __LINE__)
-# define ck_memdup_str(_p1, _p2) \
- TRK_ck_memdup_str(_p1, _p2, __FILE__, __FUNCTION__, __LINE__)
+#define ck_memdup_str(_p1, _p2) \
+ TRK_ck_memdup_str(_p1, _p2, __FILE__, __FUNCTION__, __LINE__)
-# define ck_free(_p1) TRK_ck_free(_p1, __FILE__, __FUNCTION__, __LINE__)
+#define ck_free(_p1) TRK_ck_free(_p1, __FILE__, __FUNCTION__, __LINE__)
-# endif /* ^!DEBUG_BUILD */
+#endif /* ^!DEBUG_BUILD */
#endif /* _WANT_ORIGINAL_AFL_ALLOC */