[compiler-rt] make mmap-munmap interceptor fail earlier (PR #169775)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 27 13:59:29 PST 2025
github-actions[bot] wrote:
<!--LLVM CODE FORMAT COMMENT: {clang-format}-->
:warning: C/C++ code formatter, clang-format found issues in your code. :warning:
<details>
<summary>
You can test this locally with the following command:
</summary>
``````````bash
git-clang-format --diff origin/main HEAD --extensions cpp,h -- compiler-rt/test/asan/TestCases/asan_mmap_oob_aix.cpp compiler-rt/lib/asan/asan_errors.cpp compiler-rt/lib/asan/asan_errors.h compiler-rt/lib/asan/asan_interceptors.cpp compiler-rt/lib/asan/asan_report.cpp compiler-rt/lib/asan/asan_report.h --diff_from_common_commit
``````````
:warning:
The reproduction instructions above might return results for more than one PR
in a stack if you are using a stacked PR workflow. You can limit the results by
changing `origin/main` to the base branch/commit you want to compare against.
:warning:
</details>
<details>
<summary>
View the diff from clang-format here.
</summary>
``````````diff
diff --git a/compiler-rt/lib/asan/asan_errors.cpp b/compiler-rt/lib/asan/asan_errors.cpp
index 2a949a14b..0cc747855 100644
--- a/compiler-rt/lib/asan/asan_errors.cpp
+++ b/compiler-rt/lib/asan/asan_errors.cpp
@@ -269,8 +269,10 @@ void ErrorAllocationSizeTooBig::Print() {
void ErrorMmapAddrOverflow::Print() {
Decorator d;
Printf("%s", d.Error());
- Report("ERROR: AddressSanitizer: mmap requested memory range (0x%zx + 0x%zx) "
- "causes address overflow\n", start, length);
+ Report(
+ "ERROR: AddressSanitizer: mmap requested memory range (0x%zx + 0x%zx) "
+ "causes address overflow\n",
+ start, length);
Printf("%s", d.Default());
stack->Print();
PrintHintAllocatorCannotReturnNull();
@@ -280,19 +282,23 @@ void ErrorMmapAddrOverflow::Print() {
void ErrorMmapShadowOverlap::Print() {
Decorator d;
Printf("%s", d.Error());
- Report("ERROR: AddressSanitizer: mmap requested memory range 0x%zx-0x%zx "
- "overlaps with ASan shadow memory\n", start, end);
+ Report(
+ "ERROR: AddressSanitizer: mmap requested memory range 0x%zx-0x%zx "
+ "overlaps with ASan shadow memory\n",
+ start, end);
Printf("%s", d.Default());
stack->Print();
PrintHintAllocatorCannotReturnNull();
- ReportErrorSummary(scariness.GetDescription(), stack);
+ ReportErrorSummary(scariness.GetDescription(), stack);
}
void ErrorMmapOutsideRange::Print() {
Decorator d;
Printf("%s", d.Error());
- Report("ERROR: AddressSanitizer: mmap requested memory range 0x%zx-0x%zx is "
- "outside ASan's instrumentable application memory range\n", start, end);
+ Report(
+ "ERROR: AddressSanitizer: mmap requested memory range 0x%zx-0x%zx is "
+ "outside ASan's instrumentable application memory range\n",
+ start, end);
Printf("%s", d.Default());
stack->Print();
PrintHintAllocatorCannotReturnNull();
@@ -302,8 +308,10 @@ void ErrorMmapOutsideRange::Print() {
void ErrorMunmapShadowOverlap::Print() {
Decorator d;
Printf("%s", d.Error());
- Report("ERROR: AddressSanitizer: munmap requested memory range 0x%zx-0x%zx "
- "overlaps with ASan shadow memory\n", start, end);
+ Report(
+ "ERROR: AddressSanitizer: munmap requested memory range 0x%zx-0x%zx "
+ "overlaps with ASan shadow memory\n",
+ start, end);
Printf("%s", d.Default());
stack->Print();
PrintHintAllocatorCannotReturnNull();
@@ -313,8 +321,10 @@ void ErrorMunmapShadowOverlap::Print() {
void ErrorMunmapOutsideRange::Print() {
Decorator d;
Printf("%s", d.Error());
- Report("ERROR: AddressSanitizer: munmap requested memory range 0x%zx-0x%zx is "
- "outside ASan's instrumentable application memory range\n", start, end);
+ Report(
+ "ERROR: AddressSanitizer: munmap requested memory range 0x%zx-0x%zx is "
+ "outside ASan's instrumentable application memory range\n",
+ start, end);
Printf("%s", d.Default());
stack->Print();
PrintHintAllocatorCannotReturnNull();
diff --git a/compiler-rt/lib/asan/asan_errors.h b/compiler-rt/lib/asan/asan_errors.h
index 13e66865a..035f2872d 100644
--- a/compiler-rt/lib/asan/asan_errors.h
+++ b/compiler-rt/lib/asan/asan_errors.h
@@ -250,62 +250,67 @@ struct ErrorAllocationSizeTooBig : ErrorBase {
};
struct ErrorMmapAddrOverflow : ErrorBase {
- const BufferedStackTrace *stack;
+ const BufferedStackTrace* stack;
uptr start;
uptr length;
ErrorMmapAddrOverflow() = default;
- ErrorMmapAddrOverflow(u32 tid, BufferedStackTrace *stack_, uptr start_, uptr len)
- : ErrorBase(tid, 10, "bad-mmap-overflow"),
- stack(stack_),
- start(start_),
+ ErrorMmapAddrOverflow(u32 tid, BufferedStackTrace* stack_, uptr start_,
+ uptr len)
+ : ErrorBase(tid, 10, "bad-mmap-overflow"),
+ stack(stack_),
+ start(start_),
length(len) {}
void Print();
};
struct ErrorMmapShadowOverlap : ErrorBase {
- const BufferedStackTrace *stack;
+ const BufferedStackTrace* stack;
uptr start, end;
ErrorMmapShadowOverlap() = default;
- ErrorMmapShadowOverlap(u32 tid, BufferedStackTrace *stack_, uptr start_, uptr end_)
- : ErrorBase(tid, 10, "bad-mmap-overlap"),
- stack(stack_),
- start(start_),
+ ErrorMmapShadowOverlap(u32 tid, BufferedStackTrace* stack_, uptr start_,
+ uptr end_)
+ : ErrorBase(tid, 10, "bad-mmap-overlap"),
+ stack(stack_),
+ start(start_),
end(end_) {}
void Print();
};
struct ErrorMmapOutsideRange : ErrorBase {
- const BufferedStackTrace *stack;
+ const BufferedStackTrace* stack;
uptr start, end;
ErrorMmapOutsideRange() = default;
- ErrorMmapOutsideRange(u32 tid, BufferedStackTrace *stack_, uptr start_, uptr end_)
- : ErrorBase(tid, 10, "bad-mmap-out-of-range"),
- stack(stack_),
- start(start_),
+ ErrorMmapOutsideRange(u32 tid, BufferedStackTrace* stack_, uptr start_,
+ uptr end_)
+ : ErrorBase(tid, 10, "bad-mmap-out-of-range"),
+ stack(stack_),
+ start(start_),
end(end_) {}
void Print();
};
struct ErrorMunmapShadowOverlap : ErrorBase {
- const BufferedStackTrace *stack;
+ const BufferedStackTrace* stack;
uptr start, end;
ErrorMunmapShadowOverlap() = default;
- ErrorMunmapShadowOverlap(u32 tid, BufferedStackTrace *stack_, uptr start_, uptr end_)
- : ErrorBase(tid, 10, "bad-munmap-overlap"),
- stack(stack_),
- start(start_),
+ ErrorMunmapShadowOverlap(u32 tid, BufferedStackTrace* stack_, uptr start_,
+ uptr end_)
+ : ErrorBase(tid, 10, "bad-munmap-overlap"),
+ stack(stack_),
+ start(start_),
end(end_) {}
void Print();
};
struct ErrorMunmapOutsideRange : ErrorBase {
- const BufferedStackTrace *stack;
+ const BufferedStackTrace* stack;
uptr start, end;
ErrorMunmapOutsideRange() = default;
- ErrorMunmapOutsideRange(u32 tid, BufferedStackTrace *stack_, uptr start_, uptr end_)
- : ErrorBase(tid, 10, "bad-munmap-out-of-range"),
- stack(stack_),
- start(start_),
+ ErrorMunmapOutsideRange(u32 tid, BufferedStackTrace* stack_, uptr start_,
+ uptr end_)
+ : ErrorBase(tid, 10, "bad-munmap-out-of-range"),
+ stack(stack_),
+ start(start_),
end(end_) {}
void Print();
};
diff --git a/compiler-rt/lib/asan/asan_interceptors.cpp b/compiler-rt/lib/asan/asan_interceptors.cpp
index 5cd586305..f127a0e8e 100644
--- a/compiler-rt/lib/asan/asan_interceptors.cpp
+++ b/compiler-rt/lib/asan/asan_interceptors.cpp
@@ -12,7 +12,7 @@
//===----------------------------------------------------------------------===//
#include "asan_interceptors.h"
-#include "sanitizer_common/sanitizer_common.h"
+
#include "asan_allocator.h"
#include "asan_internal.h"
#include "asan_mapping.h"
@@ -23,6 +23,7 @@
#include "asan_suppressions.h"
#include "asan_thread.h"
#include "lsan/lsan_common.h"
+#include "sanitizer_common/sanitizer_common.h"
#include "sanitizer_common/sanitizer_errno.h"
#include "sanitizer_common/sanitizer_internal_defs.h"
#include "sanitizer_common/sanitizer_libc.h"
@@ -47,11 +48,11 @@
# define ASAN_PTHREAD_CREATE_VERSION "GLIBC_2.2"
# endif
-#if !defined(MAP_FAILED)
-# define MAP_FAILED ((void *)-1)
-#endif
+# if !defined(MAP_FAILED)
+# define MAP_FAILED ((void*)-1)
+# endif
-#define MAP_FIXED 0x0010 /* [MF|SHM] interpret addr exactly */
+# define MAP_FIXED 0x0010 /* [MF|SHM] interpret addr exactly */
namespace __asan {
@@ -93,22 +94,33 @@ int OnExit() {
return 0;
}
-static inline bool RangeOverlaps(uptr beg, uptr end_excl, uptr seg_beg, uptr seg_end_incl) {
- if (!seg_beg && !seg_end_incl) return false;
+static inline bool RangeOverlaps(uptr beg, uptr end_excl, uptr seg_beg,
+ uptr seg_end_incl) {
+ if (!seg_beg && !seg_end_incl)
+ return false;
uptr seg_end_excl = seg_end_incl + 1;
return beg < seg_end_excl && end_excl > seg_beg;
}
static inline bool IntersectsShadowOrGap(uptr beg, uptr end_excl) {
// Check shadow regions
- if (RangeOverlaps(beg, end_excl, kLowShadowBeg, kLowShadowEnd)) return true;
- if (kMidShadowBeg && RangeOverlaps(beg, end_excl, kMidShadowBeg, kMidShadowEnd)) return true;
- if (RangeOverlaps(beg, end_excl, kHighShadowBeg, kHighShadowEnd)) return true;
+ if (RangeOverlaps(beg, end_excl, kLowShadowBeg, kLowShadowEnd))
+ return true;
+ if (kMidShadowBeg &&
+ RangeOverlaps(beg, end_excl, kMidShadowBeg, kMidShadowEnd))
+ return true;
+ if (RangeOverlaps(beg, end_excl, kHighShadowBeg, kHighShadowEnd))
+ return true;
// Check shadow gaps
- if (RangeOverlaps(beg, end_excl, kShadowGapBeg, kShadowGapEnd)) return true;
- if (kShadowGap2Beg && RangeOverlaps(beg, end_excl, kShadowGap2Beg, kShadowGap2End)) return true;
- if (kShadowGap3Beg && RangeOverlaps(beg, end_excl, kShadowGap3Beg, kShadowGap3End)) return true;
+ if (RangeOverlaps(beg, end_excl, kShadowGapBeg, kShadowGapEnd))
+ return true;
+ if (kShadowGap2Beg &&
+ RangeOverlaps(beg, end_excl, kShadowGap2Beg, kShadowGap2End))
+ return true;
+ if (kShadowGap3Beg &&
+ RangeOverlaps(beg, end_excl, kShadowGap3Beg, kShadowGap3End))
+ return true;
return false;
}
@@ -183,7 +195,7 @@ DECLARE_REAL_AND_INTERCEPTOR(void, free, void *)
}
template <class Mmap>
-static void *mmap_interceptor(Mmap real_mmap, void *addr, SIZE_T length,
+static void* mmap_interceptor(Mmap real_mmap, void* addr, SIZE_T length,
int prot, int flags, int fd, OFF64_T offset) {
if (length == 0)
return real_mmap(addr, length, prot, flags, fd, offset);
@@ -200,7 +212,7 @@ static void *mmap_interceptor(Mmap real_mmap, void *addr, SIZE_T length,
if (__asan::IntersectsShadowOrGap(start, end_excl)) {
errno = errno_EINVAL;
GET_STACK_TRACE_FATAL_HERE;
- ReportMmapShadowOverlap(start, end_excl, &stack);
+ ReportMmapShadowOverlap(start, end_excl, &stack);
if (common_flags()->abort_on_error) {
Abort();
}
@@ -264,18 +276,19 @@ static int munmap_interceptor(Munmap real_munmap, void *addr, SIZE_T length) {
return res;
}
-# define COMMON_INTERCEPTOR_MMAP_IMPL(ctx, mmap, addr, length, prot, flags, \
- fd, offset) \
- do { \
- (void)(ctx); \
- return mmap_interceptor(REAL(mmap), addr, length, prot, flags, fd, offset);\
- } while (false)
+# define COMMON_INTERCEPTOR_MMAP_IMPL(ctx, mmap, addr, length, prot, flags, \
+ fd, offset) \
+ do { \
+ (void)(ctx); \
+ return mmap_interceptor(REAL(mmap), addr, length, prot, flags, fd, \
+ offset); \
+ } while (false)
-# define COMMON_INTERCEPTOR_MUNMAP_IMPL(ctx, addr, length) \
- do { \
- (void)(ctx); \
- return munmap_interceptor(REAL(munmap), addr, length); \
- } while (false)
+# define COMMON_INTERCEPTOR_MUNMAP_IMPL(ctx, addr, length) \
+ do { \
+ (void)(ctx); \
+ return munmap_interceptor(REAL(munmap), addr, length); \
+ } while (false)
#if CAN_SANITIZE_LEAKS
#define COMMON_INTERCEPTOR_STRERROR() \
diff --git a/compiler-rt/lib/asan/asan_report.cpp b/compiler-rt/lib/asan/asan_report.cpp
index fbefc63b4..53594b7b3 100644
--- a/compiler-rt/lib/asan/asan_report.cpp
+++ b/compiler-rt/lib/asan/asan_report.cpp
@@ -343,31 +343,33 @@ void ReportAllocationSizeTooBig(uptr user_size, uptr total_size, uptr max_size,
in_report.ReportError(error);
}
-void ReportMmapAddrOverflow(uptr start, uptr length, BufferedStackTrace *stack) {
+void ReportMmapAddrOverflow(uptr start, uptr length,
+ BufferedStackTrace* stack) {
ScopedInErrorReport in_report(/*fatal*/ true);
ErrorMmapAddrOverflow error(GetCurrentTidOrInvalid(), stack, start, length);
in_report.ReportError(error);
}
-void ReportMmapShadowOverlap(uptr start, uptr end, BufferedStackTrace *stack) {
+void ReportMmapShadowOverlap(uptr start, uptr end, BufferedStackTrace* stack) {
ScopedInErrorReport in_report(/*fatal*/ true);
ErrorMmapShadowOverlap error(GetCurrentTidOrInvalid(), stack, start, end);
in_report.ReportError(error);
}
-void ReportMmapOutsideRange(uptr start, uptr end, BufferedStackTrace *stack) {
+void ReportMmapOutsideRange(uptr start, uptr end, BufferedStackTrace* stack) {
ScopedInErrorReport in_report(/*fatal*/ true);
ErrorMmapOutsideRange error(GetCurrentTidOrInvalid(), stack, start, end);
in_report.ReportError(error);
}
-void ReportMunmapShadowOverlap(uptr start, uptr end, BufferedStackTrace *stack) {
+void ReportMunmapShadowOverlap(uptr start, uptr end,
+ BufferedStackTrace* stack) {
ScopedInErrorReport in_report(/*fatal*/ true);
ErrorMunmapShadowOverlap error(GetCurrentTidOrInvalid(), stack, start, end);
in_report.ReportError(error);
}
-void ReportMunmapOutsideRange(uptr start, uptr end, BufferedStackTrace *stack) {
+void ReportMunmapOutsideRange(uptr start, uptr end, BufferedStackTrace* stack) {
ScopedInErrorReport in_report(/*fatal*/ true);
ErrorMunmapOutsideRange error(GetCurrentTidOrInvalid(), stack, start, end);
in_report.ReportError(error);
diff --git a/compiler-rt/lib/asan/asan_report.h b/compiler-rt/lib/asan/asan_report.h
index e7f653cf6..c50783fed 100644
--- a/compiler-rt/lib/asan/asan_report.h
+++ b/compiler-rt/lib/asan/asan_report.h
@@ -73,11 +73,11 @@ void ReportInvalidPosixMemalignAlignment(uptr alignment,
BufferedStackTrace *stack);
void ReportAllocationSizeTooBig(uptr user_size, uptr total_size, uptr max_size,
BufferedStackTrace *stack);
-void ReportMmapAddrOverflow(uptr start, uptr length, BufferedStackTrace *stack);
-void ReportMmapShadowOverlap(uptr start, uptr end, BufferedStackTrace *stack);
-void ReportMmapOutsideRange(uptr start, uptr end, BufferedStackTrace *stack);
-void ReportMunmapShadowOverlap(uptr start, uptr end, BufferedStackTrace *stack);
-void ReportMunmapOutsideRange(uptr start, uptr end, BufferedStackTrace *stack);
+void ReportMmapAddrOverflow(uptr start, uptr length, BufferedStackTrace* stack);
+void ReportMmapShadowOverlap(uptr start, uptr end, BufferedStackTrace* stack);
+void ReportMmapOutsideRange(uptr start, uptr end, BufferedStackTrace* stack);
+void ReportMunmapShadowOverlap(uptr start, uptr end, BufferedStackTrace* stack);
+void ReportMunmapOutsideRange(uptr start, uptr end, BufferedStackTrace* stack);
void ReportRssLimitExceeded(BufferedStackTrace *stack);
void ReportOutOfMemory(uptr requested_size, BufferedStackTrace *stack);
void ReportStringFunctionMemoryRangesOverlap(const char *function,
diff --git a/compiler-rt/test/asan/TestCases/asan_mmap_oob_aix.cpp b/compiler-rt/test/asan/TestCases/asan_mmap_oob_aix.cpp
index 5833159f0..6c9229cfe 100644
--- a/compiler-rt/test/asan/TestCases/asan_mmap_oob_aix.cpp
+++ b/compiler-rt/test/asan/TestCases/asan_mmap_oob_aix.cpp
@@ -5,12 +5,13 @@
#define ASAN_AIX_SHADOW_OFFSET 0x0a01000000000000ULL
int main() {
- size_t map_size = 4096;
- void* addr = (void*)ASAN_AIX_SHADOW_OFFSET;
- void* ptr = mmap(addr, map_size, PROT_READ | PROT_WRITE,
- MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
- if (ptr != MAP_FAILED) munmap(ptr, map_size);
- return 0;
+ size_t map_size = 4096;
+ void *addr = (void *)ASAN_AIX_SHADOW_OFFSET;
+ void *ptr = mmap(addr, map_size, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
+ if (ptr != MAP_FAILED)
+ munmap(ptr, map_size);
+ return 0;
}
// CHECK: ERROR: AddressSanitizer: mmap requested memory range
``````````
</details>
https://github.com/llvm/llvm-project/pull/169775
More information about the llvm-commits
mailing list