@@ -20,21 +20,21 @@ static __sanitizer::atomic_uintptr_t caller_pcs[kMaxCallerPcs];
2020// that "too many errors" has already been reported.
2121static __sanitizer::atomic_uint32_t caller_pcs_sz;
2222
23- SANITIZER_INTERFACE_WEAK_DEF (int , __sanitizer_report_ubsan_error ,
24- uintptr_t caller , const char * name ) {
23+ SANITIZER_INTERFACE_WEAK_DEF (void , __ubsan_report_error, uintptr_t caller ,
24+ const char *msg , const char *decorated_msg ) {
2525 if (caller == 0 )
26- return false ;
26+ return ;
2727 while (true ) {
2828 unsigned sz = __sanitizer::atomic_load_relaxed (&caller_pcs_sz);
29- if (sz > kMaxCallerPcs ) return false ; // early exit
29+ if (sz > kMaxCallerPcs ) return ; // early exit
3030 // when sz==kMaxCallerPcs print "too many errors", but only when cmpxchg
3131 // succeeds in order to not print it multiple times.
3232 if (sz > 0 && sz < kMaxCallerPcs ) {
3333 uintptr_t p;
3434 for (unsigned i = 0 ; i < sz; ++i) {
3535 p = __sanitizer::atomic_load_relaxed (&caller_pcs[i]);
3636 if (p == 0 ) break ; // Concurrent update.
37- if (p == caller) return false ;
37+ if (p == caller) return ;
3838 }
3939 if (p == 0 ) continue ; // FIXME: yield?
4040 }
@@ -45,10 +45,10 @@ SANITIZER_INTERFACE_WEAK_DEF(int, __sanitizer_report_ubsan_error,
4545
4646 if (sz == kMaxCallerPcs ) {
4747 message (" ubsan: too many errors\n " );
48- return false ;
48+ return ;
4949 }
5050 __sanitizer::atomic_store_relaxed (&caller_pcs[sz], caller);
51- return true ;
51+ message (decorated_msg) ;
5252 }
5353}
5454
@@ -100,18 +100,17 @@ constexpr unsigned kAddrBuf = SANITIZER_WORDSIZE / 4;
100100#define HANDLER_RECOVER (name, msg ) \
101101 INTERFACE void __ubsan_handle_##name##_minimal() { \
102102 uintptr_t caller = GET_CALLER_PC (); \
103- if (!__sanitizer_report_ubsan_error (caller, #name)) \
104- return ; \
105103 char msg_buf[MSG_BUF_LEN (msg)] = MSG_TMPL (msg); \
106104 decorate_msg (MSG_TMPL_END (msg_buf, msg), caller); \
107- message ( msg_buf); \
105+ __ubsan_report_error (caller, msg, msg_buf); \
108106 }
109107
110108#define HANDLER_NORECOVER (name, msg ) \
111109 INTERFACE void __ubsan_handle_##name##_minimal_abort() { \
110+ uintptr_t caller = GET_CALLER_PC (); \
112111 char msg_buf[MSG_BUF_LEN (msg)] = MSG_TMPL (msg); \
113- decorate_msg (MSG_TMPL_END (msg_buf, msg), GET_CALLER_PC ()); \
114- message ( msg_buf); \
112+ decorate_msg (MSG_TMPL_END (msg_buf, msg), caller); \
113+ __ubsan_report_error (caller, #msg, msg_buf); \
115114 abort_with_message (msg_buf); \
116115 }
117116
0 commit comments