re PR sanitizer/78307 (missing symbols in libubsan without changing the soname)
authorMaxim Ostapenko <m.ostapenko@samsung.com>
Wed, 16 Nov 2016 11:13:19 +0000 (11:13 +0000)
committerMaxim Ostapenko <chefmax@gcc.gnu.org>
Wed, 16 Nov 2016 11:13:19 +0000 (13:13 +0200)
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

libsanitizer/ChangeLog
libsanitizer/HOWTO_MERGE
libsanitizer/ubsan/ubsan_handlers.cc
libsanitizer/ubsan/ubsan_handlers.h
libsanitizer/ubsan/ubsan_handlers_cxx.cc
libsanitizer/ubsan/ubsan_handlers_cxx.h

index a9a881046995616fad83fd191ef37097370ed59a..f8a0fcd89f2eef96a095b45181d52b3dcdbeded6 100644 (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>
 
        * configure: Regenerate.
index d0eca40ec066ee9e4eb0d83c52588fc8f4ab4c91..81121aa385ff029c38583f8e2dbd746883ea7bee 100644 (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
   directory.
 * 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
   not break ABI between compiler and library.  You can reveal these changes by
   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
   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).
+* Update LOCAL_PATCHES file when you've committed the whole patch set with new revisions numbers.
index 0e343d32307cc1e7c74f7fdd0d16cc31111f21c6..5631e457a1c9656b726bcf0cd7f09976af3041d1 100644 (file)
@@ -558,6 +558,21 @@ static void HandleCFIBadType(CFICheckFailData *Data, ValueHandle Vtable,
 #endif
 }  // 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,
                                             ValueHandle Value,
                                             uptr ValidVtable) {
index ef741ca58efed8ebdd1bea515126aa821f6fc4f5..394c9eac29879e570b0daa9771aaee54ab531676 100644 (file)
@@ -156,12 +156,20 @@ enum CFITypeCheckKind : unsigned char {
   CFITCK_ICall,
 };
 
+struct CFIBadIcallData {
+  SourceLocation Loc;
+  const TypeDescriptor &Type;
+};
+
 struct CFICheckFailData {
   CFITypeCheckKind CheckKind;
   SourceLocation Loc;
   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.
 RECOVERABLE(cfi_check_fail, CFICheckFailData *Data, ValueHandle Function,
             uptr VtableIsValid)
index 015a9ffee022ec91256b0ca013514f71505f8f8d..007a1d6d0c2f63c93cb7313b166532dac9a36375 100644 (file)
@@ -142,4 +142,22 @@ void HandleCFIBadType(CFICheckFailData *Data, ValueHandle Vtable,
 }
 }  // 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
index 37382359b1e50ecf2c36ebe9ed20d390046899e1..6ace2b3472b209974e454806a59f6a7f3481c9c4 100644 (file)
@@ -23,6 +23,12 @@ struct DynamicTypeCacheMissData {
   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.
 /// 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.
@@ -32,6 +38,13 @@ void __ubsan_handle_dynamic_type_cache_miss(
 extern "C" SANITIZER_INTERFACE_ATTRIBUTE
 void __ubsan_handle_dynamic_type_cache_miss_abort(
   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