re PR sanitizer/78307 (missing symbols in libubsan without changing the soname)

PR sanitizer/78307
	* ubsan/ubsan_handlers.cc (__ubsan_handle_cfi_bad_icall): New function.
	( __ubsan_handle_cfi_bad_icall_abort): Likewise. 
	* ubsan/ubsan_handlers.h (struct CFIBadIcallData): New type.
	* ubsan/ubsan_handlers_cxx.cc (__ubsan_handle_cfi_bad_type): New
	function.
	(__ubsan_handle_cfi_bad_type_abort): Likewise.
	* ubsan/ubsan_handlers_cxx.h (struct CFIBadTypeData): New type.
	(__ubsan_handle_cfi_bad_type): Export function.
	(__ubsan_handle_cfi_bad_type_abort): Likewise.
	* HOWTO_MERGE: Update documentation.

From-SVN: r242478
This commit is contained in:
Maxim Ostapenko 2016-11-16 11:13:19 +00:00 committed by Maxim Ostapenko
parent 024f701ca1
commit 511c8687a8
6 changed files with 71 additions and 1 deletions

View File

@ -1,3 +1,17 @@
2016-11-16 Maxim Ostapenko <m.ostapenko@samsung.com>
PR sanitizer/78307
* ubsan/ubsan_handlers.cc (__ubsan_handle_cfi_bad_icall): New function.
( __ubsan_handle_cfi_bad_icall_abort): Likewise.
* ubsan/ubsan_handlers.h (struct CFIBadIcallData): New type.
* ubsan/ubsan_handlers_cxx.cc (__ubsan_handle_cfi_bad_type): New
function.
(__ubsan_handle_cfi_bad_type_abort): Likewise.
* ubsan/ubsan_handlers_cxx.h (struct CFIBadTypeData): New type.
(__ubsan_handle_cfi_bad_type): Export function.
(__ubsan_handle_cfi_bad_type_abort): Likewise.
* HOWTO_MERGE: Update documentation.
2016-11-15 Matthias Klose <doko@ubuntu.com> 2016-11-15 Matthias Klose <doko@ubuntu.com>
* configure: Regenerate. * configure: Regenerate.

View File

@ -11,7 +11,8 @@ general list of actions required to perform the merge:
in corresponding CMakeLists.txt and config-ix.cmake files from compiler-rt source in corresponding CMakeLists.txt and config-ix.cmake files from compiler-rt source
directory. directory.
* Apply all needed GCC-specific patches to libsanitizer (note that some of * Apply all needed GCC-specific patches to libsanitizer (note that some of
them might be already included to upstream). them might be already included to upstream). The list of these patches is stored
into LOCAL_PATCHES file.
* Apply all necessary compiler changes. Be especially careful here, you must * Apply all necessary compiler changes. Be especially careful here, you must
not break ABI between compiler and library. You can reveal these changes by not break ABI between compiler and library. You can reveal these changes by
inspecting the history of AddressSanitizer.cpp and ThreadSanitizer.cpp files inspecting the history of AddressSanitizer.cpp and ThreadSanitizer.cpp files
@ -37,3 +38,4 @@ general list of actions required to perform the merge:
in libasan, configure/Makefile changes). The review process has O(N^2) complexity, so you in libasan, configure/Makefile changes). The review process has O(N^2) complexity, so you
would simplify and probably speed up the review process by doing this. would simplify and probably speed up the review process by doing this.
* Send your patches for review to GCC Patches Mailing List (gcc-patches@gcc.gnu.org). * Send your patches for review to GCC Patches Mailing List (gcc-patches@gcc.gnu.org).
* Update LOCAL_PATCHES file when you've committed the whole patch set with new revisions numbers.

View File

@ -558,6 +558,21 @@ static void HandleCFIBadType(CFICheckFailData *Data, ValueHandle Vtable,
#endif #endif
} // namespace __ubsan } // namespace __ubsan
void __ubsan::__ubsan_handle_cfi_bad_icall(CFIBadIcallData *CallData,
ValueHandle Function) {
GET_REPORT_OPTIONS(false);
CFICheckFailData Data = {CFITCK_ICall, CallData->Loc, CallData->Type};
handleCFIBadIcall(&Data, Function, Opts);
}
void __ubsan::__ubsan_handle_cfi_bad_icall_abort(CFIBadIcallData *CallData,
ValueHandle Function) {
GET_REPORT_OPTIONS(true);
CFICheckFailData Data = {CFITCK_ICall, CallData->Loc, CallData->Type};
handleCFIBadIcall(&Data, Function, Opts);
Die();
}
void __ubsan::__ubsan_handle_cfi_check_fail(CFICheckFailData *Data, void __ubsan::__ubsan_handle_cfi_check_fail(CFICheckFailData *Data,
ValueHandle Value, ValueHandle Value,
uptr ValidVtable) { uptr ValidVtable) {

View File

@ -156,12 +156,20 @@ enum CFITypeCheckKind : unsigned char {
CFITCK_ICall, CFITCK_ICall,
}; };
struct CFIBadIcallData {
SourceLocation Loc;
const TypeDescriptor &Type;
};
struct CFICheckFailData { struct CFICheckFailData {
CFITypeCheckKind CheckKind; CFITypeCheckKind CheckKind;
SourceLocation Loc; SourceLocation Loc;
const TypeDescriptor &Type; const TypeDescriptor &Type;
}; };
/// \brief Handle control flow integrity failure for indirect function calls.
RECOVERABLE(cfi_bad_icall, CFIBadIcallData *Data, ValueHandle Function)
/// \brief Handle control flow integrity failures. /// \brief Handle control flow integrity failures.
RECOVERABLE(cfi_check_fail, CFICheckFailData *Data, ValueHandle Function, RECOVERABLE(cfi_check_fail, CFICheckFailData *Data, ValueHandle Function,
uptr VtableIsValid) uptr VtableIsValid)

View File

@ -142,4 +142,22 @@ void HandleCFIBadType(CFICheckFailData *Data, ValueHandle Vtable,
} }
} // namespace __ubsan } // namespace __ubsan
void __ubsan::__ubsan_handle_cfi_bad_type(CFIBadTypeData *TypeData,
ValueHandle Vtable) {
GET_REPORT_OPTIONS(false);
CFITypeCheckKind TypeCheckKind
= static_cast<CFITypeCheckKind> (TypeData->TypeCheckKind);
CFICheckFailData Data = {TypeCheckKind, TypeData->Loc, TypeData->Type};
HandleCFIBadType(&Data, Vtable, false, Opts);
}
void __ubsan::__ubsan_handle_cfi_bad_type_abort(CFIBadTypeData *TypeData,
ValueHandle Vtable) {
GET_REPORT_OPTIONS(true);
CFITypeCheckKind TypeCheckKind
= static_cast<CFITypeCheckKind> (TypeData->TypeCheckKind);
CFICheckFailData Data = {TypeCheckKind, TypeData->Loc, TypeData->Type};
HandleCFIBadType(&Data, Vtable, false, Opts);
}
#endif // CAN_SANITIZE_UB #endif // CAN_SANITIZE_UB

View File

@ -23,6 +23,12 @@ struct DynamicTypeCacheMissData {
unsigned char TypeCheckKind; unsigned char TypeCheckKind;
}; };
struct CFIBadTypeData {
SourceLocation Loc;
const TypeDescriptor &Type;
unsigned char TypeCheckKind;
};
/// \brief Handle a runtime type check failure, caused by an incorrect vptr. /// \brief Handle a runtime type check failure, caused by an incorrect vptr.
/// When this handler is called, all we know is that the type was not in the /// When this handler is called, all we know is that the type was not in the
/// cache; this does not necessarily imply the existence of a bug. /// cache; this does not necessarily imply the existence of a bug.
@ -32,6 +38,13 @@ void __ubsan_handle_dynamic_type_cache_miss(
extern "C" SANITIZER_INTERFACE_ATTRIBUTE extern "C" SANITIZER_INTERFACE_ATTRIBUTE
void __ubsan_handle_dynamic_type_cache_miss_abort( void __ubsan_handle_dynamic_type_cache_miss_abort(
DynamicTypeCacheMissData *Data, ValueHandle Pointer, ValueHandle Hash); DynamicTypeCacheMissData *Data, ValueHandle Pointer, ValueHandle Hash);
/// \brief Handle a control flow integrity check failure by printing a
/// diagnostic.
extern "C" SANITIZER_INTERFACE_ATTRIBUTE void
__ubsan_handle_cfi_bad_type(CFIBadTypeData *Data, ValueHandle Vtable);
extern "C" SANITIZER_INTERFACE_ATTRIBUTE void
__ubsan_handle_cfi_bad_type_abort(CFIBadTypeData *Data, ValueHandle Vtable);
} }
#endif // UBSAN_HANDLERS_H #endif // UBSAN_HANDLERS_H