FAILED: patch "[PATCH] lib/ubsan: add type mismatch handler for new GCC/Clang" failed to apply to 4.15-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.15-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
42440c1f9911b4b7b8ba3dc4e90c1197bc561211Mon Sep 17 00:00:00 2001
From: Andrey Ryabinin <[email protected]>
Date: Tue, 6 Feb 2018 15:40:42 -0800
Subject: [PATCH] lib/ubsan: add type mismatch handler for new GCC/Clang
UBSAN=y fails to build with new GCC/clang:
arch/x86/kernel/head64.o: In function `sanitize_boot_params':
arch/x86/include/asm/bootparam_utils.h:37: undefined reference to `__ubsan_handle_type_mismatch_v1'
because Clang and GCC 8 slightly changed ABI for 'type mismatch' errors. Compiler now uses new __ubsan_handle_type_mismatch_v1() function with slightly modified 'struct type_mismatch_data'.
Let's add new 'struct type_mismatch_data_common' which is independent from compiler's layout of 'struct type_mismatch_data'. And make __ubsan_handle_type_mismatch[_v1]() functions transform compiler-dependent type mismatch data to our internal representation. This way, we can support both old and new compilers with minimal amount of change.
lib/ubsan.c +38 -10
@@ -265,14 +265,14 @@ void __ubsan_handle_divrem_overflow(struct overflow_data *data, }EXPORT_SYMBOL (__ubsan_handle_divrem_overflow); -static void handle_null_ptr_deref (struct type_mismatch_data *data) +static void handle_null_ptr_deref (struct type_mismatch_data_common *data) {unsigned long flags; -if (suppress_report (&data->location)) +if (suppress_report (data->location))return ; -ubsan_prologue (&data->location, &flags); +ubsan_prologue (data->location, &flags); pr_err("%s null pointer of type %s\n", type_check_kinds[data->type_check_kind],
@@ -281,15 +281,15 @@ static void handle_null_ptr_deref(struct type_mismatch_data *data)ubsan_epilogue (&flags); } -static void handle_misaligned_access (struct type_mismatch_data *data, +static void handle_misaligned_access (struct type_mismatch_data_common *data,unsigned long ptr) {unsigned long flags; -if (suppress_report (&data->location)) +if (suppress_report (data->location))return ; -ubsan_prologue (&data->location, &flags); +ubsan_prologue (data->location, &flags); pr_err("%s misaligned address %p for type %s\n", type_check_kinds[data->type_check_kind],
@@ -299,15 +299,15 @@ static void handle_misaligned_access(struct type_mismatch_data *data,ubsan_epilogue (&flags); } -static void handle_object_size_mismatch (struct type_mismatch_data *data, +static void handle_object_size_mismatch (struct type_mismatch_data_common *data,unsigned long ptr) {unsigned long flags; -if (suppress_report (&data->location)) +if (suppress_report (data->location))return ; -ubsan_prologue (&data->location, &flags); +ubsan_prologue (data->location, &flags);pr_err ("%s address %p with insufficient space\n" , type_check_kinds[data->type_check_kind], (void *) ptr);
@@ -315,7 +315,7 @@ static void handle_object_size_mismatch(struct type_mismatch_data *data,ubsan_epilogue (&flags); } -void __ubsan_handle_type_mismatch (struct type_mismatch_data *data, +static void ubsan_type_mismatch_common (struct type_mismatch_data_common *data,unsigned long ptr) {
@@ -326,8 +326,36 @@ void __ubsan_handle_type_mismatch(struct type_mismatch_data *data,else handle_object_size_mismatch (data, ptr); } + +void __ubsan_handle_type_mismatch (struct type_mismatch_data *data, +unsigned long ptr) +{ +struct type_mismatch_data_common common_data = { + .location = &data->location, + .type = data->type, + .alignment = data->alignment, + .type_check_kind = data->type_check_kind + }; + +ubsan_type_mismatch_common (&common_data, ptr); +}EXPORT_SYMBOL (__ubsan_handle_type_mismatch); +void __ubsan_handle_type_mismatch_v1 (struct type_mismatch_data_v1 *data, +unsigned long ptr) +{ + +struct type_mismatch_data_common common_data = { + .location = &data->location, + .type = data->type, + .alignment =1UL << data->log_alignment, + .type_check_kind = data->type_check_kind + }; + +ubsan_type_mismatch_common (&common_data, ptr); +} +EXPORT_SYMBOL (__ubsan_handle_type_mismatch_v1); +void __ubsan_handle_nonnull_return (struct nonnull_return_data *data) {unsigned long flags;
lib/ubsan.h +14 -0
@@ -37,6 +37,20 @@ struct type_mismatch_data {unsigned char type_check_kind; }; +struct type_mismatch_data_v1 { +struct source_location location; +struct type_descriptor *type; +unsigned char log_alignment; +unsigned char type_check_kind; +}; + +struct type_mismatch_data_common { +struct source_location *location; +struct type_descriptor *type; +unsigned long alignment; +unsigned char type_check_kind; +}; +struct nonnull_arg_data {struct source_location location;struct source_location attr_location;
Quoted 6 lines · On 02/15/2018 11:14 AM, [email protected] wrote:
The patch below does not apply to the 4.15-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
You can apply it cleanly if you apply b8fe1120b4ba342b4f156d24e952d6e686b20298 ("lib/ubsan.c: s/missaligned/misaligned/") first. That is a simple spelling fix in a function name, which caused this conflict.
Or I can resolve the conflict and send you the backport. What would you prefer?
Quoted 11 lines
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From
42440c1f9911b4b7b8ba3dc4e90c1197bc561211Mon Sep 17 00:00:00 2001
From: Andrey Ryabinin <[email protected]>
Date: Tue, 6 Feb 2018 15:40:42 -0800
Subject: [PATCH] lib/ubsan: add type mismatch handler for new GCC/Clang
Greg KH
maintainerQuoted 10 lines · Andrey Ryabinin
Quoted 6 lines · On 02/15/2018 11:14 AM, [email protected] wrote:
The patch below does not apply to the 4.15-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
Quoted 4 lines
You can apply it cleanly if you apply
b8fe1120b4ba342b4f156d24e952d6e686b20298("lib/ubsan.c: s/missaligned/misaligned/") first. That is a simple spelling fix in a function name, which caused this conflict.Or I can resolve the conflict and send you the backport. What would you prefer?
I've now queued up both patches, thanks for the hint.
greg k-h