|
@@ -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;
|