OLD | NEW |
1 /* | 1 /* |
2 | 2 |
3 american fuzzy lop - dislocator, an abusive allocator | 3 american fuzzy lop - dislocator, an abusive allocator |
4 ----------------------------------------------------- | 4 ----------------------------------------------------- |
5 | 5 |
6 Written and maintained by Michal Zalewski <lcamtuf@google.com> | 6 Written and maintained by Michal Zalewski <lcamtuf@google.com> |
7 | 7 |
8 Copyright 2016 Google Inc. All rights reserved. | 8 Copyright 2016 Google Inc. All rights reserved. |
9 | 9 |
10 Licensed under the Apache License, Version 2.0 (the "License"); | 10 Licensed under the Apache License, Version 2.0 (the "License"); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 call_depth--; \ | 57 call_depth--; \ |
58 } while (0) | 58 } while (0) |
59 | 59 |
60 /* Macro to count the number of pages needed to store a buffer: */ | 60 /* Macro to count the number of pages needed to store a buffer: */ |
61 | 61 |
62 #define PG_COUNT(_l) (((_l) + (PAGE_SIZE - 1)) / PAGE_SIZE) | 62 #define PG_COUNT(_l) (((_l) + (PAGE_SIZE - 1)) / PAGE_SIZE) |
63 | 63 |
64 /* Canary & clobber bytes: */ | 64 /* Canary & clobber bytes: */ |
65 | 65 |
66 #define ALLOC_CANARY 0xAACCAACC | 66 #define ALLOC_CANARY 0xAACCAACC |
67 #define ALLOC_CLOBBER 0x41 | 67 #define ALLOC_CLOBBER 0xCC |
68 | 68 |
69 #define PTR_C(_p) (((u32*)(_p))[-1]) | 69 #define PTR_C(_p) (((u32*)(_p))[-1]) |
70 #define PTR_L(_p) (((u32*)(_p))[-2]) | 70 #define PTR_L(_p) (((u32*)(_p))[-2]) |
71 | 71 |
72 /* Configurable stuff (use AFL_LD_* to set): */ | 72 /* Configurable stuff (use AFL_LD_* to set): */ |
73 | 73 |
74 static u32 max_mem = MAX_ALLOC; /* Max heap usage to permit */ | 74 static u32 max_mem = MAX_ALLOC; /* Max heap usage to permit */ |
75 static u8 alloc_verbose, /* Additional debug messages */ | 75 static u8 alloc_verbose, /* Additional debug messages */ |
76 hard_fail; /* abort() when max_mem exceeded? */ | 76 hard_fail; /* abort() when max_mem exceeded? */ |
77 | 77 |
78 static __thread size_t total_mem; /* Currently allocated mem */ | 78 static __thread size_t total_mem; /* Currently allocated mem */ |
79 | 79 |
80 static __thread u32 call_depth; /* To avoid recursion via fprintf() */ | 80 static __thread u32 call_depth; /* To avoid recursion via fprintf() */ |
81 | 81 |
82 | 82 |
83 /* This is the main alloc function. It allocates one page more than necessary, | 83 /* This is the main alloc function. It allocates one page more than necessary, |
84 sets that tailing page to PROT_NONE, and then increments the return address | 84 sets that tailing page to PROT_NONE, and then increments the return address |
85 so that it is right-aligned to that boundary. Since it always uses mmap(), | 85 so that it is right-aligned to that boundary. Since it always uses mmap(), |
86 the returned memory will be zeroed. */ | 86 the returned memory will be zeroed. */ |
87 | 87 |
88 static void* __dislocator_alloc(size_t len) { | 88 static void* __dislocator_alloc(size_t len) { |
89 | 89 |
90 void* ret; | 90 void* ret; |
91 | 91 |
92 if (total_mem + len > max_mem) { | 92 |
| 93 if (total_mem + len > max_mem || total_mem + len < total_mem) { |
93 | 94 |
94 if (hard_fail) | 95 if (hard_fail) |
95 FATAL("total allocs exceed %u MB", max_mem / 1024 / 1024); | 96 FATAL("total allocs exceed %u MB", max_mem / 1024 / 1024); |
96 | 97 |
97 DEBUGF("total allocs exceed %u MB, returning NULL", | 98 DEBUGF("total allocs exceed %u MB, returning NULL", |
98 max_mem / 1024 / 1024); | 99 max_mem / 1024 / 1024); |
99 | 100 |
100 return NULL; | 101 return NULL; |
101 | 102 |
102 } | 103 } |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 | 249 |
249 max_mem = atoi(tmp) * 1024 * 1024; | 250 max_mem = atoi(tmp) * 1024 * 1024; |
250 if (!max_mem) FATAL("Bad value for AFL_LD_LIMIT_MB"); | 251 if (!max_mem) FATAL("Bad value for AFL_LD_LIMIT_MB"); |
251 | 252 |
252 } | 253 } |
253 | 254 |
254 alloc_verbose = !!getenv("AFL_LD_VERBOSE"); | 255 alloc_verbose = !!getenv("AFL_LD_VERBOSE"); |
255 hard_fail = !!getenv("AFL_LD_HARD_FAIL"); | 256 hard_fail = !!getenv("AFL_LD_HARD_FAIL"); |
256 | 257 |
257 } | 258 } |
OLD | NEW |