[PATCH] D91219: hwasan: Bring back operator {new, delete} interceptors on Android.
Peter Collingbourne via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 10 15:55:21 PST 2020
pcc created this revision.
pcc added reviewers: eugenis, hctim.
Herald added subscribers: Sanitizers, krytarowski.
Herald added a project: Sanitizers.
pcc requested review of this revision.
It turns out that we can't remove the operator new and delete
interceptors on Android without breaking ABI, so bring them back
as forwards to the malloc and free functions.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D91219
Files:
compiler-rt/lib/hwasan/hwasan_new_delete.cpp
Index: compiler-rt/lib/hwasan/hwasan_new_delete.cpp
===================================================================
--- compiler-rt/lib/hwasan/hwasan_new_delete.cpp
+++ compiler-rt/lib/hwasan/hwasan_new_delete.cpp
@@ -16,9 +16,34 @@
#include "sanitizer_common/sanitizer_allocator.h"
#include "sanitizer_common/sanitizer_allocator_report.h"
+#include <stddef.h>
+#include <stdlib.h>
+
#if HWASAN_REPLACE_OPERATORS_NEW_AND_DELETE
-#include <stddef.h>
+// TODO(alekseys): throw std::bad_alloc instead of dying on OOM.
+#define OPERATOR_NEW_BODY(nothrow) \
+ GET_MALLOC_STACK_TRACE; \
+ void *res = hwasan_malloc(size, &stack);\
+ if (!nothrow && UNLIKELY(!res)) ReportOutOfMemory(size, &stack);\
+ return res
+
+#define OPERATOR_DELETE_BODY \
+ GET_MALLOC_STACK_TRACE; \
+ if (ptr) hwasan_free(ptr, &stack)
+
+#elif defined(__ANDROID__)
+
+// We don't actually want to intercept operator new and delete on Android, but
+// since we previously released a runtime that intercepted these functions,
+// removing the interceptors would break ABI. Therefore we simply forward to
+// malloc and free.
+#define OPERATOR_NEW_BODY(nothrow) return malloc(size)
+#define OPERATOR_DELETE_BODY free(ptr)
+
+#endif
+
+#ifdef OPERATOR_NEW_BODY
using namespace __hwasan;
@@ -28,12 +53,6 @@
} // namespace std
-// TODO(alekseys): throw std::bad_alloc instead of dying on OOM.
-#define OPERATOR_NEW_BODY(nothrow) \
- GET_MALLOC_STACK_TRACE; \
- void *res = hwasan_malloc(size, &stack);\
- if (!nothrow && UNLIKELY(!res)) ReportOutOfMemory(size, &stack);\
- return res
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE
void *operator new(size_t size) { OPERATOR_NEW_BODY(false /*nothrow*/); }
@@ -48,10 +67,6 @@
OPERATOR_NEW_BODY(true /*nothrow*/);
}
-#define OPERATOR_DELETE_BODY \
- GET_MALLOC_STACK_TRACE; \
- if (ptr) hwasan_free(ptr, &stack)
-
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE
void operator delete(void *ptr) NOEXCEPT { OPERATOR_DELETE_BODY; }
INTERCEPTOR_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE
@@ -63,4 +78,4 @@
OPERATOR_DELETE_BODY;
}
-#endif // HWASAN_REPLACE_OPERATORS_NEW_AND_DELETE
+#endif // OPERATOR_NEW_BODY
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D91219.304347.patch
Type: text/x-patch
Size: 2160 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20201110/3066cec7/attachment.bin>
More information about the llvm-commits
mailing list