All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] ubsan: fix gcc-10 warnings
@ 2020-04-29 18:59 Arnd Bergmann
  2020-05-01 21:58 ` Kees Cook
  0 siblings, 1 reply; 2+ messages in thread
From: Arnd Bergmann @ 2020-04-29 18:59 UTC (permalink / raw)
  To: Andrew Morton, Andrey Ryabinin, Kees Cook
  Cc: Arnd Bergmann, Herbert Xu, Julien Grall, linux-kernel

The latest compiler expects slightly different function prototypes
for the ubsan helpers:

lib/ubsan.c:192:6: error: conflicting types for built-in function '__ubsan_handle_add_overflow'; expected 'void(void *, void *, void *)' [-Werror=builtin-declaration-mismatch]
  192 | void __ubsan_handle_add_overflow(struct overflow_data *data,
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/ubsan.c:200:6: error: conflicting types for built-in function '__ubsan_handle_sub_overflow'; expected 'void(void *, void *, void *)' [-Werror=builtin-declaration-mismatch]
  200 | void __ubsan_handle_sub_overflow(struct overflow_data *data,
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/ubsan.c:207:6: error: conflicting types for built-in function '__ubsan_handle_mul_overflow'; expected 'void(void *, void *, void *)' [-Werror=builtin-declaration-mismatch]
  207 | void __ubsan_handle_mul_overflow(struct overflow_data *data,
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/ubsan.c:214:6: error: conflicting types for built-in function '__ubsan_handle_negate_overflow'; expected 'void(void *, void *)' [-Werror=builtin-declaration-mismatch]
  214 | void __ubsan_handle_negate_overflow(struct overflow_data *data,
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/ubsan.c:234:6: error: conflicting types for built-in function '__ubsan_handle_divrem_overflow'; expected 'void(void *, void *, void *)' [-Werror=builtin-declaration-mismatch]
  234 | void __ubsan_handle_divrem_overflow(struct overflow_data *data,
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Change the Linux implementation to match these, using a local
typed pointer.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 lib/ubsan.c | 33 +++++++++++++++++----------------
 1 file changed, 17 insertions(+), 16 deletions(-)

diff --git a/lib/ubsan.c b/lib/ubsan.c
index f8c0ccf35f29..cb9af3f6b77e 100644
--- a/lib/ubsan.c
+++ b/lib/ubsan.c
@@ -189,7 +189,7 @@ static void handle_overflow(struct overflow_data *data, void *lhs,
 	ubsan_epilogue();
 }
 
-void __ubsan_handle_add_overflow(struct overflow_data *data,
+void __ubsan_handle_add_overflow(void *data,
 				void *lhs, void *rhs)
 {
 
@@ -197,23 +197,23 @@ void __ubsan_handle_add_overflow(struct overflow_data *data,
 }
 EXPORT_SYMBOL(__ubsan_handle_add_overflow);
 
-void __ubsan_handle_sub_overflow(struct overflow_data *data,
+void __ubsan_handle_sub_overflow(void *data,
 				void *lhs, void *rhs)
 {
 	handle_overflow(data, lhs, rhs, '-');
 }
 EXPORT_SYMBOL(__ubsan_handle_sub_overflow);
 
-void __ubsan_handle_mul_overflow(struct overflow_data *data,
+void __ubsan_handle_mul_overflow(void *data,
 				void *lhs, void *rhs)
 {
 	handle_overflow(data, lhs, rhs, '*');
 }
 EXPORT_SYMBOL(__ubsan_handle_mul_overflow);
 
-void __ubsan_handle_negate_overflow(struct overflow_data *data,
-				void *old_val)
+void __ubsan_handle_negate_overflow(void *_data, void *old_val)
 {
+	struct overflow_data *data = _data;
 	char old_val_str[VALUE_LENGTH];
 
 	if (suppress_report(&data->location))
@@ -231,9 +231,9 @@ void __ubsan_handle_negate_overflow(struct overflow_data *data,
 EXPORT_SYMBOL(__ubsan_handle_negate_overflow);
 
 
-void __ubsan_handle_divrem_overflow(struct overflow_data *data,
-				void *lhs, void *rhs)
+void __ubsan_handle_divrem_overflow(void *_data, void *lhs, void *rhs)
 {
+	struct overflow_data *data = _data;
 	char rhs_val_str[VALUE_LENGTH];
 
 	if (suppress_report(&data->location))
@@ -326,10 +326,9 @@ void __ubsan_handle_type_mismatch(struct type_mismatch_data *data,
 }
 EXPORT_SYMBOL(__ubsan_handle_type_mismatch);
 
-void __ubsan_handle_type_mismatch_v1(struct type_mismatch_data_v1 *data,
-				void *ptr)
+void __ubsan_handle_type_mismatch_v1(void *_data, void *ptr)
 {
-
+	struct type_mismatch_data_v1 *data = _data;
 	struct type_mismatch_data_common common_data = {
 		.location = &data->location,
 		.type = data->type,
@@ -341,8 +340,9 @@ void __ubsan_handle_type_mismatch_v1(struct type_mismatch_data_v1 *data,
 }
 EXPORT_SYMBOL(__ubsan_handle_type_mismatch_v1);
 
-void __ubsan_handle_out_of_bounds(struct out_of_bounds_data *data, void *index)
+void __ubsan_handle_out_of_bounds(void *_data, void *index)
 {
+	struct out_of_bounds_data *data = _data;
 	char index_str[VALUE_LENGTH];
 
 	if (suppress_report(&data->location))
@@ -357,9 +357,9 @@ void __ubsan_handle_out_of_bounds(struct out_of_bounds_data *data, void *index)
 }
 EXPORT_SYMBOL(__ubsan_handle_out_of_bounds);
 
-void __ubsan_handle_shift_out_of_bounds(struct shift_out_of_bounds_data *data,
-					void *lhs, void *rhs)
+void __ubsan_handle_shift_out_of_bounds(void *_data, void *lhs, void *rhs)
 {
+	struct shift_out_of_bounds_data *data = _data;
 	struct type_descriptor *rhs_type = data->rhs_type;
 	struct type_descriptor *lhs_type = data->lhs_type;
 	char rhs_str[VALUE_LENGTH];
@@ -399,8 +399,9 @@ void __ubsan_handle_shift_out_of_bounds(struct shift_out_of_bounds_data *data,
 EXPORT_SYMBOL(__ubsan_handle_shift_out_of_bounds);
 
 
-void __ubsan_handle_builtin_unreachable(struct unreachable_data *data)
+void __ubsan_handle_builtin_unreachable(void *_data)
 {
+	struct unreachable_data *data = _data;
 	ubsan_prologue(&data->location, "unreachable");
 	pr_err("calling __builtin_unreachable()\n");
 	ubsan_epilogue();
@@ -408,9 +409,9 @@ void __ubsan_handle_builtin_unreachable(struct unreachable_data *data)
 }
 EXPORT_SYMBOL(__ubsan_handle_builtin_unreachable);
 
-void __ubsan_handle_load_invalid_value(struct invalid_value_data *data,
-				void *val)
+void __ubsan_handle_load_invalid_value(void *_data, void *val)
 {
+	struct invalid_value_data *data = _data;
 	char val_str[VALUE_LENGTH];
 
 	if (suppress_report(&data->location))
-- 
2.26.0


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] ubsan: fix gcc-10 warnings
  2020-04-29 18:59 [PATCH] ubsan: fix gcc-10 warnings Arnd Bergmann
@ 2020-05-01 21:58 ` Kees Cook
  0 siblings, 0 replies; 2+ messages in thread
From: Kees Cook @ 2020-05-01 21:58 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Andrew Morton, Andrey Ryabinin, Herbert Xu, Julien Grall, linux-kernel

On Wed, Apr 29, 2020 at 08:59:35PM +0200, Arnd Bergmann wrote:
> The latest compiler expects slightly different function prototypes
> for the ubsan helpers:
> 
> lib/ubsan.c:192:6: error: conflicting types for built-in function '__ubsan_handle_add_overflow'; expected 'void(void *, void *, void *)' [-Werror=builtin-declaration-mismatch]
>   192 | void __ubsan_handle_add_overflow(struct overflow_data *data,
>       |      ^~~~~~~~~~~~~~~~~~~~~~~~~~~
> lib/ubsan.c:200:6: error: conflicting types for built-in function '__ubsan_handle_sub_overflow'; expected 'void(void *, void *, void *)' [-Werror=builtin-declaration-mismatch]
>   200 | void __ubsan_handle_sub_overflow(struct overflow_data *data,
>       |      ^~~~~~~~~~~~~~~~~~~~~~~~~~~
> lib/ubsan.c:207:6: error: conflicting types for built-in function '__ubsan_handle_mul_overflow'; expected 'void(void *, void *, void *)' [-Werror=builtin-declaration-mismatch]
>   207 | void __ubsan_handle_mul_overflow(struct overflow_data *data,
>       |      ^~~~~~~~~~~~~~~~~~~~~~~~~~~
> lib/ubsan.c:214:6: error: conflicting types for built-in function '__ubsan_handle_negate_overflow'; expected 'void(void *, void *)' [-Werror=builtin-declaration-mismatch]
>   214 | void __ubsan_handle_negate_overflow(struct overflow_data *data,
>       |      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> lib/ubsan.c:234:6: error: conflicting types for built-in function '__ubsan_handle_divrem_overflow'; expected 'void(void *, void *, void *)' [-Werror=builtin-declaration-mismatch]
>   234 | void __ubsan_handle_divrem_overflow(struct overflow_data *data,
>       |      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> 
> Change the Linux implementation to match these, using a local
> typed pointer.
> 
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

Thanks for that!

Reviewed-by: Kees Cook <keescook@chromium.org>

-Kees

> ---
>  lib/ubsan.c | 33 +++++++++++++++++----------------
>  1 file changed, 17 insertions(+), 16 deletions(-)
> 
> diff --git a/lib/ubsan.c b/lib/ubsan.c
> index f8c0ccf35f29..cb9af3f6b77e 100644
> --- a/lib/ubsan.c
> +++ b/lib/ubsan.c
> @@ -189,7 +189,7 @@ static void handle_overflow(struct overflow_data *data, void *lhs,
>  	ubsan_epilogue();
>  }
>  
> -void __ubsan_handle_add_overflow(struct overflow_data *data,
> +void __ubsan_handle_add_overflow(void *data,
>  				void *lhs, void *rhs)
>  {
>  
> @@ -197,23 +197,23 @@ void __ubsan_handle_add_overflow(struct overflow_data *data,
>  }
>  EXPORT_SYMBOL(__ubsan_handle_add_overflow);
>  
> -void __ubsan_handle_sub_overflow(struct overflow_data *data,
> +void __ubsan_handle_sub_overflow(void *data,
>  				void *lhs, void *rhs)
>  {
>  	handle_overflow(data, lhs, rhs, '-');
>  }
>  EXPORT_SYMBOL(__ubsan_handle_sub_overflow);
>  
> -void __ubsan_handle_mul_overflow(struct overflow_data *data,
> +void __ubsan_handle_mul_overflow(void *data,
>  				void *lhs, void *rhs)
>  {
>  	handle_overflow(data, lhs, rhs, '*');
>  }
>  EXPORT_SYMBOL(__ubsan_handle_mul_overflow);
>  
> -void __ubsan_handle_negate_overflow(struct overflow_data *data,
> -				void *old_val)
> +void __ubsan_handle_negate_overflow(void *_data, void *old_val)
>  {
> +	struct overflow_data *data = _data;
>  	char old_val_str[VALUE_LENGTH];
>  
>  	if (suppress_report(&data->location))
> @@ -231,9 +231,9 @@ void __ubsan_handle_negate_overflow(struct overflow_data *data,
>  EXPORT_SYMBOL(__ubsan_handle_negate_overflow);
>  
>  
> -void __ubsan_handle_divrem_overflow(struct overflow_data *data,
> -				void *lhs, void *rhs)
> +void __ubsan_handle_divrem_overflow(void *_data, void *lhs, void *rhs)
>  {
> +	struct overflow_data *data = _data;
>  	char rhs_val_str[VALUE_LENGTH];
>  
>  	if (suppress_report(&data->location))
> @@ -326,10 +326,9 @@ void __ubsan_handle_type_mismatch(struct type_mismatch_data *data,
>  }
>  EXPORT_SYMBOL(__ubsan_handle_type_mismatch);
>  
> -void __ubsan_handle_type_mismatch_v1(struct type_mismatch_data_v1 *data,
> -				void *ptr)
> +void __ubsan_handle_type_mismatch_v1(void *_data, void *ptr)
>  {
> -
> +	struct type_mismatch_data_v1 *data = _data;
>  	struct type_mismatch_data_common common_data = {
>  		.location = &data->location,
>  		.type = data->type,
> @@ -341,8 +340,9 @@ void __ubsan_handle_type_mismatch_v1(struct type_mismatch_data_v1 *data,
>  }
>  EXPORT_SYMBOL(__ubsan_handle_type_mismatch_v1);
>  
> -void __ubsan_handle_out_of_bounds(struct out_of_bounds_data *data, void *index)
> +void __ubsan_handle_out_of_bounds(void *_data, void *index)
>  {
> +	struct out_of_bounds_data *data = _data;
>  	char index_str[VALUE_LENGTH];
>  
>  	if (suppress_report(&data->location))
> @@ -357,9 +357,9 @@ void __ubsan_handle_out_of_bounds(struct out_of_bounds_data *data, void *index)
>  }
>  EXPORT_SYMBOL(__ubsan_handle_out_of_bounds);
>  
> -void __ubsan_handle_shift_out_of_bounds(struct shift_out_of_bounds_data *data,
> -					void *lhs, void *rhs)
> +void __ubsan_handle_shift_out_of_bounds(void *_data, void *lhs, void *rhs)
>  {
> +	struct shift_out_of_bounds_data *data = _data;
>  	struct type_descriptor *rhs_type = data->rhs_type;
>  	struct type_descriptor *lhs_type = data->lhs_type;
>  	char rhs_str[VALUE_LENGTH];
> @@ -399,8 +399,9 @@ void __ubsan_handle_shift_out_of_bounds(struct shift_out_of_bounds_data *data,
>  EXPORT_SYMBOL(__ubsan_handle_shift_out_of_bounds);
>  
>  
> -void __ubsan_handle_builtin_unreachable(struct unreachable_data *data)
> +void __ubsan_handle_builtin_unreachable(void *_data)
>  {
> +	struct unreachable_data *data = _data;
>  	ubsan_prologue(&data->location, "unreachable");
>  	pr_err("calling __builtin_unreachable()\n");
>  	ubsan_epilogue();
> @@ -408,9 +409,9 @@ void __ubsan_handle_builtin_unreachable(struct unreachable_data *data)
>  }
>  EXPORT_SYMBOL(__ubsan_handle_builtin_unreachable);
>  
> -void __ubsan_handle_load_invalid_value(struct invalid_value_data *data,
> -				void *val)
> +void __ubsan_handle_load_invalid_value(void *_data, void *val)
>  {
> +	struct invalid_value_data *data = _data;
>  	char val_str[VALUE_LENGTH];
>  
>  	if (suppress_report(&data->location))
> -- 
> 2.26.0
> 

-- 
Kees Cook

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2020-05-01 21:58 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-29 18:59 [PATCH] ubsan: fix gcc-10 warnings Arnd Bergmann
2020-05-01 21:58 ` Kees Cook

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.