|
| NoCfiIcall (Functor function) |
| Constructs this object.
|
|
| NoCfiIcall () |
|
template<typename PointerType, typename = std::enable_if_t< std::is_same<typename std::remove_cv<PointerType>::type, void*>::value>> |
| NoCfiIcall (PointerType function) |
|
void | SetPointer (Functor function) |
| Updates the pointer to the function to be called.
|
|
template<typename PointerType, typename = std::enable_if_t< std::is_same<typename std::remove_cv<PointerType>::type, void*>::value>> |
void | SetPointer (PointerType function) |
|
template<typename... RunArgs> |
decltype(auto) | operator() (RunArgs &&... args) const |
| Calls the function without sanitization by cfi-icall.
|
|
| operator bool () const |
| Returns true if not nullptr .
|
|
template<typename Functor>
class crashpad::NoCfiIcall< Functor >
Disables cfi-icall for calls made through a function pointer.
Clang provides several Control-Flow-Integrity (CFI) sanitizers, among them, cfi-icall, which attempts to verify that the dynamic type of a function matches the static type of the function pointer used to call it.
https://clang.llvm.org/docs/ControlFlowIntegrity.html#indirect-function-call-checking
However, cfi-icall does not have enough information to check indirect calls to functions in other modules, such as through the pointers returned by dlsym()
. In these cases, CFI aborts the program upon executing the indirect call.
This class encapsulates cross-DSO function pointers to disable cfi-icall precisely when calling these pointers.