Merge branch 'core-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[sfrench/cifs-2.6.git] / lib / ubsan.c
index fb0409df1bcf8474969ab5bf28f2c9623a77e041..59fee96c29a0f1fb83fe67282482bc5d941bd6f3 100644 (file)
@@ -141,11 +141,6 @@ static void val_to_string(char *str, size_t size, struct type_descriptor *type,
        }
 }
 
-static bool location_is_valid(struct source_location *loc)
-{
-       return loc->file_name != NULL;
-}
-
 static DEFINE_SPINLOCK(report_lock);
 
 static void ubsan_prologue(struct source_location *location,
@@ -265,14 +260,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 +276,15 @@ static void handle_null_ptr_deref(struct type_mismatch_data *data)
        ubsan_epilogue(&flags);
 }
 
-static void handle_missaligned_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 +294,15 @@ static void handle_missaligned_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,37 +310,46 @@ 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)
 {
 
        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);
 }
-EXPORT_SYMBOL(__ubsan_handle_type_mismatch);
 
-void __ubsan_handle_nonnull_return(struct nonnull_return_data *data)
+void __ubsan_handle_type_mismatch(struct type_mismatch_data *data,
+                               unsigned long ptr)
 {
-       unsigned long flags;
-
-       if (suppress_report(&data->location))
-               return;
-
-       ubsan_prologue(&data->location, &flags);
+       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);
 
-       pr_err("null pointer returned from function declared to never return null\n");
+void __ubsan_handle_type_mismatch_v1(struct type_mismatch_data_v1 *data,
+                               unsigned long ptr)
+{
 
-       if (location_is_valid(&data->attr_location))
-               print_source_location("returns_nonnull attribute specified in",
-                               &data->attr_location);
+       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_epilogue(&flags);
+       ubsan_type_mismatch_common(&common_data, ptr);
 }
-EXPORT_SYMBOL(__ubsan_handle_nonnull_return);
+EXPORT_SYMBOL(__ubsan_handle_type_mismatch_v1);
 
 void __ubsan_handle_vla_bound_not_positive(struct vla_bound_data *data,
                                        unsigned long bound)