2020-04-29 19:04:54

by Arnd Bergmann

[permalink] [raw]
Subject: [PATCH] ubsan: fix gcc-10 warnings

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 <[email protected]>
---
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


2020-05-01 22:01:20

by Kees Cook

[permalink] [raw]
Subject: Re: [PATCH] ubsan: fix gcc-10 warnings

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 <[email protected]>

Thanks for that!

Reviewed-by: Kees Cook <[email protected]>

-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