aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvanhauser-thc <vh@thc.org>2023-02-02 12:08:45 +0100
committervanhauser-thc <vh@thc.org>2023-02-02 12:08:45 +0100
commit4946e9cc3a340efd9b08807ae5cb0a657e0214a9 (patch)
tree8f9292fcbc90b111ac41ccf2d25e3a6192723757
parent686382c328ab3a131fe151504c6e113ddfbdf168 (diff)
downloadafl++-4946e9cc3a340efd9b08807ae5cb0a657e0214a9.tar.gz
small fix to compiler rt
-rw-r--r--instrumentation/afl-compiler-rt.o.c66
1 files changed, 17 insertions, 49 deletions
diff --git a/instrumentation/afl-compiler-rt.o.c b/instrumentation/afl-compiler-rt.o.c
index d6d6c38c..6ba19b5a 100644
--- a/instrumentation/afl-compiler-rt.o.c
+++ b/instrumentation/afl-compiler-rt.o.c
@@ -1534,6 +1534,16 @@ void __sanitizer_cov_trace_pc_guard_init(uint32_t *start, uint32_t *stop) {
if (start == stop || *start) return;
+ x = getenv("AFL_INST_RATIO");
+ if (x) { inst_ratio = (u32)atoi(x); }
+
+ if (!inst_ratio || inst_ratio > 100) {
+
+ fprintf(stderr, "[-] ERROR: Invalid AFL_INST_RATIO (must be 1-100).\n");
+ abort();
+
+ }
+
// If a dlopen of an instrumented library happens after the forkserver then
// we have a problem as we cannot increase the coverage map anymore.
if (__afl_already_initialized_forkserver) {
@@ -1554,62 +1564,20 @@ void __sanitizer_cov_trace_pc_guard_init(uint32_t *start, uint32_t *stop) {
while (start < stop) {
- *(start++) = offset;
+ if (likely(inst_ratio == 100) || R(100) < inst_ratio)
+ *start = offset;
+ else
+ *start = 0; // write to map[0]
if (unlikely(++offset >= __afl_final_loc)) { offset = 4; }
}
}
- }
-
- x = getenv("AFL_INST_RATIO");
- if (x) { inst_ratio = (u32)atoi(x); }
-
- if (!inst_ratio || inst_ratio > 100) {
-
- fprintf(stderr, "[-] ERROR: Invalid AFL_INST_RATIO (must be 1-100).\n");
- abort();
-
- }
-
- /* instrumented code is loaded *after* our forkserver is up. this is a
- problem. We cannot prevent collisions then :( */
- /*
- if (__afl_already_initialized_forkserver &&
- __afl_final_loc + 1 + stop - start > __afl_map_size) {
-
- if (__afl_debug) {
-
- fprintf(stderr, "Warning: new instrumented code after the forkserver!\n");
-
- }
-
- __afl_final_loc = 2;
-
- if (1 + stop - start > __afl_map_size) {
-
- *(start++) = ++__afl_final_loc;
-
- while (start < stop) {
-
- if (R(100) < inst_ratio)
- *start = ++__afl_final_loc % __afl_map_size;
- else
- *start = 4;
-
- start++;
-
- }
-
- return;
-
- }
+ return; // we are done for this special case
}
- */
-
/* Make sure that the first element in the range is always set - we use that
to avoid duplicate calls (which can happen as an artifact of the underlying
implementation in LLVM). */
@@ -1618,10 +1586,10 @@ void __sanitizer_cov_trace_pc_guard_init(uint32_t *start, uint32_t *stop) {
while (start < stop) {
- if (R(100) < inst_ratio)
+ if (likely(inst_ratio == 100) || R(100) < inst_ratio)
*start = ++__afl_final_loc;
else
- *start = 4;
+ *start = 0; // write to map[0]
start++;