summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAngel Pons <th3fanbus@gmail.com>2020-07-27 21:08:38 +0200
committerAngel Pons <th3fanbus@gmail.com>2020-07-31 19:53:27 +0000
commit7d6dae68708a6063565eff110f36b36a7e4fc545 (patch)
tree253a2528c90753d629e07e926b15c9c7ea1a2d22
parent5f9f77672d096a013094f3cad63cb138167dbf1b (diff)
lib/ubsan.c: Update error handlers for current toolchain's GCC
Looks like UBSan isn't being build-tested, and the toolchain has been updated several times since UBSan support was added. Unexpectedly, it no longer builds when using GCC from the current toolchain version. To fix this, rename an error handler and add a newly-introduced handler for `__ubsan_handle_pointer_overflow`, which works like the existing handlers. A config file to allow build-testing UBSan is added later. Change-Id: I5980730d8d22fa1d0512846c203004723847cc6d Signed-off-by: Angel Pons <th3fanbus@gmail.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/43975 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
-rw-r--r--src/lib/ubsan.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/src/lib/ubsan.c b/src/lib/ubsan.c
index 8c1f64d427..6873f7e238 100644
--- a/src/lib/ubsan.c
+++ b/src/lib/ubsan.c
@@ -68,7 +68,7 @@ struct ubsan_type_mismatch_data {
unsigned char type_check_kind;
};
-void __ubsan_handle_type_mismatch(void *data_raw, void *pointer_raw)
+void __ubsan_handle_type_mismatch_v1(void *data_raw, void *pointer_raw)
{
const struct ubsan_type_mismatch_data *data =
(struct ubsan_type_mismatch_data *)data_raw;
@@ -81,7 +81,7 @@ void __ubsan_handle_type_mismatch(void *data_raw, void *pointer_raw)
ubsan_abort(&data->location, violation);
}
-ABORT_VARIANT_VP_VP(type_mismatch);
+ABORT_VARIANT_VP_VP(type_mismatch_v1);
struct ubsan_overflow_data {
struct ubsan_source_location location;
@@ -156,6 +156,23 @@ void __ubsan_handle_divrem_overflow(void *data_raw, void *lhs_raw,
ABORT_VARIANT_VP_VP_VP(divrem_overflow);
+struct ubsan_pointer_overflow_data {
+ struct ubsan_source_location location;
+};
+
+void __ubsan_handle_pointer_overflow(void *data_raw, void *base_raw, void *result_raw)
+{
+ const struct ubsan_pointer_overflow_data *data =
+ (struct ubsan_pointer_overflow_data *)data_raw;
+ ubsan_value_handle_t base = (ubsan_value_handle_t)base_raw;
+ ubsan_value_handle_t result = (ubsan_value_handle_t)result_raw;
+ (void)base;
+ (void)result;
+ ubsan_abort(&data->location, "pointer overflow");
+}
+
+ABORT_VARIANT_VP_VP_VP(pointer_overflow);
+
struct ubsan_shift_out_of_bounds_data {
struct ubsan_source_location location;
struct ubsan_type_descriptor *lhs_type;