From eb0a330300f7a6ddb44b098d49058b8fd61f009a Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 15 Feb 2018 11:07:02 +0100 Subject: [PATCH] 4.9-stable patches added patches: lib-ubsan-add-type-mismatch-handler-for-new-gcc-clang.patch lib-ubsan.c-s-missaligned-misaligned.patch --- ...e-mismatch-handler-for-new-gcc-clang.patch | 163 ++++++++++++++++++ ...lib-ubsan.c-s-missaligned-misaligned.patch | 41 +++++ queue-4.9/series | 2 + 3 files changed, 206 insertions(+) create mode 100644 queue-4.9/lib-ubsan-add-type-mismatch-handler-for-new-gcc-clang.patch create mode 100644 queue-4.9/lib-ubsan.c-s-missaligned-misaligned.patch diff --git a/queue-4.9/lib-ubsan-add-type-mismatch-handler-for-new-gcc-clang.patch b/queue-4.9/lib-ubsan-add-type-mismatch-handler-for-new-gcc-clang.patch new file mode 100644 index 00000000000..bc008003401 --- /dev/null +++ b/queue-4.9/lib-ubsan-add-type-mismatch-handler-for-new-gcc-clang.patch @@ -0,0 +1,163 @@ +From 42440c1f9911b4b7b8ba3dc4e90c1197bc561211 Mon Sep 17 00:00:00 2001 +From: Andrey Ryabinin +Date: Tue, 6 Feb 2018 15:40:42 -0800 +Subject: lib/ubsan: add type mismatch handler for new GCC/Clang + +From: Andrey Ryabinin + +commit 42440c1f9911b4b7b8ba3dc4e90c1197bc561211 upstream. + +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. + +Link: http://lkml.kernel.org/r/20180119152853.16806-1-aryabinin@virtuozzo.com +Signed-off-by: Andrey Ryabinin +Reported-by: Sodagudi Prasad +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + lib/ubsan.c | 48 ++++++++++++++++++++++++++++++++++++++---------- + lib/ubsan.h | 14 ++++++++++++++ + 2 files changed, 52 insertions(+), 10 deletions(-) + +--- a/lib/ubsan.c ++++ b/lib/ubsan.c +@@ -265,14 +265,14 @@ void __ubsan_handle_divrem_overflow(stru + } + 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 + 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(str + 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( + 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 + 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; +--- a/lib/ubsan.h ++++ b/lib/ubsan.h +@@ -36,6 +36,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; diff --git a/queue-4.9/lib-ubsan.c-s-missaligned-misaligned.patch b/queue-4.9/lib-ubsan.c-s-missaligned-misaligned.patch new file mode 100644 index 00000000000..423083694bc --- /dev/null +++ b/queue-4.9/lib-ubsan.c-s-missaligned-misaligned.patch @@ -0,0 +1,41 @@ +From b8fe1120b4ba342b4f156d24e952d6e686b20298 Mon Sep 17 00:00:00 2001 +From: Andrew Morton +Date: Tue, 6 Feb 2018 15:40:38 -0800 +Subject: lib/ubsan.c: s/missaligned/misaligned/ + +From: Andrew Morton + +commit b8fe1120b4ba342b4f156d24e952d6e686b20298 upstream. + +A vist from the spelling fairy. + +Cc: David Laight +Cc: Andrey Ryabinin +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + lib/ubsan.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/lib/ubsan.c ++++ b/lib/ubsan.c +@@ -281,7 +281,7 @@ static void handle_null_ptr_deref(struct + ubsan_epilogue(&flags); + } + +-static void handle_missaligned_access(struct type_mismatch_data *data, ++static void handle_misaligned_access(struct type_mismatch_data *data, + unsigned long ptr) + { + unsigned long flags; +@@ -322,7 +322,7 @@ void __ubsan_handle_type_mismatch(struct + if (!ptr) + handle_null_ptr_deref(data); + else if (data->alignment && !IS_ALIGNED(ptr, data->alignment)) +- handle_missaligned_access(data, ptr); ++ handle_misaligned_access(data, ptr); + else + handle_object_size_mismatch(data, ptr); + } diff --git a/queue-4.9/series b/queue-4.9/series index 6b12e59fa2a..4405a1e45f6 100644 --- a/queue-4.9/series +++ b/queue-4.9/series @@ -77,3 +77,5 @@ edac-octeon-fix-an-uninitialized-variable-warning.patch pinctrl-intel-initialize-gpio-properly-when-used-through-irqchip.patch pktcdvd-fix-pkt_setup_dev-error-path.patch clocksource-drivers-stm32-fix-kernel-panic-with-multiple-timers.patch +lib-ubsan.c-s-missaligned-misaligned.patch +lib-ubsan-add-type-mismatch-handler-for-new-gcc-clang.patch -- 2.47.3