[ASAN] Don't inline when -asan-max-inline-poisoning-size=0
When -asan-max-inline-poisoning-size=0, all shadow memory access should be
outlined (through asan calls). This was not occuring when partial poisoning
was required on the right side of a variable's redzone. This diff contains
the changes necessary to implement and utilize __asan_set_shadow_01() through
__asan_set_shadow_07(). The change is necessary for the full abstraction of
the asan implementation and will enable experimentation with alternate strategies.
Differential Revision: https://reviews.llvm.org/D136197
GitOrigin-RevId: 0c35b6165ccc4fc3c5c1286236a02ea6f7894d00
diff --git a/lib/asan/asan_interface.inc b/lib/asan/asan_interface.inc
index 89ef552..bfc44b4 100644
--- a/lib/asan/asan_interface.inc
+++ b/lib/asan/asan_interface.inc
@@ -108,6 +108,13 @@
INTERFACE_FUNCTION(__asan_set_death_callback)
INTERFACE_FUNCTION(__asan_set_error_report_callback)
INTERFACE_FUNCTION(__asan_set_shadow_00)
+INTERFACE_FUNCTION(__asan_set_shadow_01)
+INTERFACE_FUNCTION(__asan_set_shadow_02)
+INTERFACE_FUNCTION(__asan_set_shadow_03)
+INTERFACE_FUNCTION(__asan_set_shadow_04)
+INTERFACE_FUNCTION(__asan_set_shadow_05)
+INTERFACE_FUNCTION(__asan_set_shadow_06)
+INTERFACE_FUNCTION(__asan_set_shadow_07)
INTERFACE_FUNCTION(__asan_set_shadow_f1)
INTERFACE_FUNCTION(__asan_set_shadow_f2)
INTERFACE_FUNCTION(__asan_set_shadow_f3)
diff --git a/lib/asan/asan_interface_internal.h b/lib/asan/asan_interface_internal.h
index b0802a8..987f855 100644
--- a/lib/asan/asan_interface_internal.h
+++ b/lib/asan/asan_interface_internal.h
@@ -90,6 +90,20 @@
SANITIZER_INTERFACE_ATTRIBUTE
void __asan_set_shadow_00(uptr addr, uptr size);
SANITIZER_INTERFACE_ATTRIBUTE
+ void __asan_set_shadow_01(uptr addr, uptr size);
+ SANITIZER_INTERFACE_ATTRIBUTE
+ void __asan_set_shadow_02(uptr addr, uptr size);
+ SANITIZER_INTERFACE_ATTRIBUTE
+ void __asan_set_shadow_03(uptr addr, uptr size);
+ SANITIZER_INTERFACE_ATTRIBUTE
+ void __asan_set_shadow_04(uptr addr, uptr size);
+ SANITIZER_INTERFACE_ATTRIBUTE
+ void __asan_set_shadow_05(uptr addr, uptr size);
+ SANITIZER_INTERFACE_ATTRIBUTE
+ void __asan_set_shadow_06(uptr addr, uptr size);
+ SANITIZER_INTERFACE_ATTRIBUTE
+ void __asan_set_shadow_07(uptr addr, uptr size);
+ SANITIZER_INTERFACE_ATTRIBUTE
void __asan_set_shadow_f1(uptr addr, uptr size);
SANITIZER_INTERFACE_ATTRIBUTE
void __asan_set_shadow_f2(uptr addr, uptr size);
diff --git a/lib/asan/asan_poisoning.cpp b/lib/asan/asan_poisoning.cpp
index 3b7c9d1..19ae989 100644
--- a/lib/asan/asan_poisoning.cpp
+++ b/lib/asan/asan_poisoning.cpp
@@ -13,6 +13,8 @@
#include "asan_poisoning.h"
+#include <assert.h>
+
#include "asan_report.h"
#include "asan_stack.h"
#include "sanitizer_common/sanitizer_atomic.h"
@@ -312,6 +314,41 @@
REAL(memset)((void *)addr, 0, size);
}
+void __asan_set_shadow_01(uptr addr, uptr size) {
+ assert(size == 1);
+ REAL(memset)((void *)addr, 0x01, size);
+}
+
+void __asan_set_shadow_02(uptr addr, uptr size) {
+ assert(size == 1);
+ REAL(memset)((void *)addr, 0x02, size);
+}
+
+void __asan_set_shadow_03(uptr addr, uptr size) {
+ assert(size == 1);
+ REAL(memset)((void *)addr, 0x03, size);
+}
+
+void __asan_set_shadow_04(uptr addr, uptr size) {
+ assert(size == 1);
+ REAL(memset)((void *)addr, 0x04, size);
+}
+
+void __asan_set_shadow_05(uptr addr, uptr size) {
+ assert(size == 1);
+ REAL(memset)((void *)addr, 0x05, size);
+}
+
+void __asan_set_shadow_06(uptr addr, uptr size) {
+ assert(size == 1);
+ REAL(memset)((void *)addr, 0x06, size);
+}
+
+void __asan_set_shadow_07(uptr addr, uptr size) {
+ assert(size == 1);
+ REAL(memset)((void *)addr, 0x07, size);
+}
+
void __asan_set_shadow_f1(uptr addr, uptr size) {
REAL(memset)((void *)addr, 0xf1, size);
}
diff --git a/lib/asan/asan_rtl.cpp b/lib/asan/asan_rtl.cpp
index 88f66de..8530831 100644
--- a/lib/asan/asan_rtl.cpp
+++ b/lib/asan/asan_rtl.cpp
@@ -288,11 +288,18 @@
case 38: __asan_region_is_poisoned(0, 0); break;
case 39: __asan_describe_address(0); break;
case 40: __asan_set_shadow_00(0, 0); break;
- case 41: __asan_set_shadow_f1(0, 0); break;
- case 42: __asan_set_shadow_f2(0, 0); break;
- case 43: __asan_set_shadow_f3(0, 0); break;
- case 44: __asan_set_shadow_f5(0, 0); break;
- case 45: __asan_set_shadow_f8(0, 0); break;
+ case 41: __asan_set_shadow_01(0, 0); break;
+ case 42: __asan_set_shadow_02(0, 0); break;
+ case 43: __asan_set_shadow_03(0, 0); break;
+ case 44: __asan_set_shadow_04(0, 0); break;
+ case 45: __asan_set_shadow_05(0, 0); break;
+ case 46: __asan_set_shadow_06(0, 0); break;
+ case 47: __asan_set_shadow_07(0, 0); break;
+ case 48: __asan_set_shadow_f1(0, 0); break;
+ case 49: __asan_set_shadow_f2(0, 0); break;
+ case 50: __asan_set_shadow_f3(0, 0); break;
+ case 51: __asan_set_shadow_f5(0, 0); break;
+ case 52: __asan_set_shadow_f8(0, 0); break;
}
// clang-format on
}
diff --git a/lib/asan/tests/asan_internal_interface_test.cpp b/lib/asan/tests/asan_internal_interface_test.cpp
index 218edaf..cb205e0 100644
--- a/lib/asan/tests/asan_internal_interface_test.cpp
+++ b/lib/asan/tests/asan_internal_interface_test.cpp
@@ -19,6 +19,27 @@
__asan_set_shadow_00((uptr)buffer.data(), buffer.size());
EXPECT_EQ(std::vector<char>(buffer.size(), 0x00), buffer);
+ __asan_set_shadow_01((uptr)buffer.data(), buffer.size());
+ EXPECT_EQ(std::vector<char>(buffer.size(), 0x01), buffer);
+
+ __asan_set_shadow_02((uptr)buffer.data(), buffer.size());
+ EXPECT_EQ(std::vector<char>(buffer.size(), 0x02), buffer);
+
+ __asan_set_shadow_03((uptr)buffer.data(), buffer.size());
+ EXPECT_EQ(std::vector<char>(buffer.size(), 0x03), buffer);
+
+ __asan_set_shadow_04((uptr)buffer.data(), buffer.size());
+ EXPECT_EQ(std::vector<char>(buffer.size(), 0x04), buffer);
+
+ __asan_set_shadow_05((uptr)buffer.data(), buffer.size());
+ EXPECT_EQ(std::vector<char>(buffer.size(), 0x05), buffer);
+
+ __asan_set_shadow_06((uptr)buffer.data(), buffer.size());
+ EXPECT_EQ(std::vector<char>(buffer.size(), 0x06), buffer);
+
+ __asan_set_shadow_07((uptr)buffer.data(), buffer.size());
+ EXPECT_EQ(std::vector<char>(buffer.size(), 0x07), buffer);
+
__asan_set_shadow_f1((uptr)buffer.data(), buffer.size());
EXPECT_EQ(std::vector<char>(buffer.size(), 0xf1), buffer);
diff --git a/test/asan/TestCases/set_shadow_test.c b/test/asan/TestCases/set_shadow_test.c
index 5058a0c..f1c9650 100644
--- a/test/asan/TestCases/set_shadow_test.c
+++ b/test/asan/TestCases/set_shadow_test.c
@@ -13,6 +13,13 @@
#include <stdlib.h>
void __asan_set_shadow_00(size_t addr, size_t size);
+void __asan_set_shadow_01(size_t addr, size_t size);
+void __asan_set_shadow_02(size_t addr, size_t size);
+void __asan_set_shadow_03(size_t addr, size_t size);
+void __asan_set_shadow_04(size_t addr, size_t size);
+void __asan_set_shadow_05(size_t addr, size_t size);
+void __asan_set_shadow_06(size_t addr, size_t size);
+void __asan_set_shadow_07(size_t addr, size_t size);
void __asan_set_shadow_f1(size_t addr, size_t size);
void __asan_set_shadow_f2(size_t addr, size_t size);
void __asan_set_shadow_f3(size_t addr, size_t size);
@@ -32,6 +39,34 @@
// X00: PASS
case 0x00:
return __asan_set_shadow_00(addr, 1);
+ // X01: AddressSanitizer: stack-buffer-overflow
+ // X01: [01]
+ case 0x01:
+ return __asan_set_shadow_01(addr, 1);
+ // X02: AddressSanitizer: stack-buffer-overflow
+ // X02: [02]
+ case 0x02:
+ return __asan_set_shadow_02(addr, 1);
+ // X03: AddressSanitizer: stack-buffer-overflow
+ // X03: [03]
+ case 0x03:
+ return __asan_set_shadow_03(addr, 1);
+ // X04: AddressSanitizer: stack-buffer-overflow
+ // X04: [04]
+ case 0x04:
+ return __asan_set_shadow_04(addr, 1);
+ // X05: AddressSanitizer: stack-buffer-overflow
+ // X05: [05]
+ case 0x05:
+ return __asan_set_shadow_05(addr, 1);
+ // X06: AddressSanitizer: stack-buffer-overflow
+ // X06: [06]
+ case 0x06:
+ return __asan_set_shadow_06(addr, 1);
+ // X07: AddressSanitizer: stack-buffer-overflow
+ // X07: [07]
+ case 0x07:
+ return __asan_set_shadow_07(addr, 1);
// XF1: AddressSanitizer: stack-buffer-underflow
// XF1: [f1]
case 0xf1: