Loading lib/ubsan.c +38 −10 Original line number Original line Diff line number Diff line Loading @@ -265,14 +265,14 @@ void __ubsan_handle_divrem_overflow(struct overflow_data *data, } } EXPORT_SYMBOL(__ubsan_handle_divrem_overflow); 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; unsigned long flags; if (suppress_report(&data->location)) if (suppress_report(data->location)) return; return; ubsan_prologue(&data->location, &flags); ubsan_prologue(data->location, &flags); pr_err("%s null pointer of type %s\n", pr_err("%s null pointer of type %s\n", type_check_kinds[data->type_check_kind], type_check_kinds[data->type_check_kind], Loading @@ -281,15 +281,15 @@ static void handle_null_ptr_deref(struct type_mismatch_data *data) ubsan_epilogue(&flags); 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 ptr) { { unsigned long flags; unsigned long flags; if (suppress_report(&data->location)) if (suppress_report(data->location)) return; return; ubsan_prologue(&data->location, &flags); ubsan_prologue(data->location, &flags); pr_err("%s misaligned address %p for type %s\n", pr_err("%s misaligned address %p for type %s\n", type_check_kinds[data->type_check_kind], type_check_kinds[data->type_check_kind], Loading @@ -299,15 +299,15 @@ static void handle_misaligned_access(struct type_mismatch_data *data, ubsan_epilogue(&flags); 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 ptr) { { unsigned long flags; unsigned long flags; if (suppress_report(&data->location)) if (suppress_report(data->location)) return; return; ubsan_prologue(&data->location, &flags); ubsan_prologue(data->location, &flags); pr_err("%s address %p with insufficient space\n", pr_err("%s address %p with insufficient space\n", type_check_kinds[data->type_check_kind], type_check_kinds[data->type_check_kind], (void *) ptr); (void *) ptr); Loading @@ -315,7 +315,7 @@ static void handle_object_size_mismatch(struct type_mismatch_data *data, ubsan_epilogue(&flags); 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) unsigned long ptr) { { Loading @@ -326,8 +326,36 @@ void __ubsan_handle_type_mismatch(struct type_mismatch_data *data, else else handle_object_size_mismatch(data, ptr); 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); 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) void __ubsan_handle_nonnull_return(struct nonnull_return_data *data) { { unsigned long flags; unsigned long flags; Loading lib/ubsan.h +14 −0 Original line number Original line Diff line number Diff line Loading @@ -37,6 +37,20 @@ struct type_mismatch_data { unsigned char type_check_kind; 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 nonnull_arg_data { struct source_location location; struct source_location location; struct source_location attr_location; struct source_location attr_location; Loading Loading
lib/ubsan.c +38 −10 Original line number Original line Diff line number Diff line Loading @@ -265,14 +265,14 @@ void __ubsan_handle_divrem_overflow(struct overflow_data *data, } } EXPORT_SYMBOL(__ubsan_handle_divrem_overflow); 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; unsigned long flags; if (suppress_report(&data->location)) if (suppress_report(data->location)) return; return; ubsan_prologue(&data->location, &flags); ubsan_prologue(data->location, &flags); pr_err("%s null pointer of type %s\n", pr_err("%s null pointer of type %s\n", type_check_kinds[data->type_check_kind], type_check_kinds[data->type_check_kind], Loading @@ -281,15 +281,15 @@ static void handle_null_ptr_deref(struct type_mismatch_data *data) ubsan_epilogue(&flags); 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 ptr) { { unsigned long flags; unsigned long flags; if (suppress_report(&data->location)) if (suppress_report(data->location)) return; return; ubsan_prologue(&data->location, &flags); ubsan_prologue(data->location, &flags); pr_err("%s misaligned address %p for type %s\n", pr_err("%s misaligned address %p for type %s\n", type_check_kinds[data->type_check_kind], type_check_kinds[data->type_check_kind], Loading @@ -299,15 +299,15 @@ static void handle_misaligned_access(struct type_mismatch_data *data, ubsan_epilogue(&flags); 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 ptr) { { unsigned long flags; unsigned long flags; if (suppress_report(&data->location)) if (suppress_report(data->location)) return; return; ubsan_prologue(&data->location, &flags); ubsan_prologue(data->location, &flags); pr_err("%s address %p with insufficient space\n", pr_err("%s address %p with insufficient space\n", type_check_kinds[data->type_check_kind], type_check_kinds[data->type_check_kind], (void *) ptr); (void *) ptr); Loading @@ -315,7 +315,7 @@ static void handle_object_size_mismatch(struct type_mismatch_data *data, ubsan_epilogue(&flags); 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) unsigned long ptr) { { Loading @@ -326,8 +326,36 @@ void __ubsan_handle_type_mismatch(struct type_mismatch_data *data, else else handle_object_size_mismatch(data, ptr); 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); 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) void __ubsan_handle_nonnull_return(struct nonnull_return_data *data) { { unsigned long flags; unsigned long flags; Loading
lib/ubsan.h +14 −0 Original line number Original line Diff line number Diff line Loading @@ -37,6 +37,20 @@ struct type_mismatch_data { unsigned char type_check_kind; 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 nonnull_arg_data { struct source_location location; struct source_location location; struct source_location attr_location; struct source_location attr_location; Loading