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:
parent
024f701ca1
commit
511c8687a8
@ -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.
|
||||||
|
@ -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.
|
||||||
|
@ -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) {
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user