All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kees Cook <keescook@chromium.org>
To: Andrey Ryabinin <ryabinin.a.a@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	linux-kernel@vger.kernel.org, linux-next@vger.kernel.org,
	Peter Zijlstra <peterz@infradead.org>,
	Josh Poimboeuf <jpoimboe@redhat.com>,
	Randy Dunlap <rdunlap@infradead.org>,
	Stephen Rothwell <sfr@canb.auug.org.au>,
	Dmitry Vyukov <dvyukov@google.com>,
	Alexander Viro <viro@zeniv.linux.org.uk>
Subject: Re: [PATCH] ubsan: remove overflow checks
Date: Tue, 9 Feb 2021 16:19:03 -0800	[thread overview]
Message-ID: <202102091617.8FD77890@keescook> (raw)
In-Reply-To: <20210209232348.20510-1-ryabinin.a.a@gmail.com>

On Wed, Feb 10, 2021 at 02:23:48AM +0300, Andrey Ryabinin wrote:
> Since GCC 8.0 -fsanitize=signed-integer-overflow doesn't work with -fwrapv.
> -fwrapv makes signed overflows defines and GCC essentially disables
> ubsan checks. On GCC < 8.0 -fwrapv doesn't have influence on
> -fsanitize=signed-integer-overflow setting, so it kinda works
> but generates false-positves and violates uaccess rules:
> 
> lib/iov_iter.o: warning: objtool: iovec_from_user()+0x22d: call to __ubsan_handle_add_overflow() with UACCESS enabled
> 
> Disable signed overflow checks to avoid these problems.
> Remove unsigned overflow checks as well.
> Unsigned overflow appeared as side effect of the commit
>  cdf8a76fda4a ("ubsan: move cc-option tests into Kconfig"),
> but it never worked (kernel doesn't boot). And unsigned overflows
> are allowed by C standard, so it just pointless.
> 
> Signed-off-by: Andrey Ryabinin <ryabinin.a.a@gmail.com>

NAK, please don't remove the entire thing. I want this to work again
with -fwrapv, and it's not entirely broken under Clang. But the feature
shouldn't be removed from the kernel.

I'd prefer Peter's fix instead.

-Kees

> Cc: Peter Zijlstra <peterz@infradead.org>
> Cc: Josh Poimboeuf <jpoimboe@redhat.com>
> Cc: Randy Dunlap <rdunlap@infradead.org>
> Cc: Stephen Rothwell <sfr@canb.auug.org.au>
> Cc: Dmitry Vyukov <dvyukov@google.com>
> Cc: Kees Cook <keescook@chromium.org>
> Cc: Alexander Viro <viro@zeniv.linux.org.uk>
> ---
>  lib/Kconfig.ubsan      | 17 -----------
>  lib/test_ubsan.c       | 49 ------------------------------
>  lib/ubsan.c            | 68 ------------------------------------------
>  scripts/Makefile.ubsan |  2 --
>  4 files changed, 136 deletions(-)
> 
> diff --git a/lib/Kconfig.ubsan b/lib/Kconfig.ubsan
> index 3a0b1c930733..e5372a13511d 100644
> --- a/lib/Kconfig.ubsan
> +++ b/lib/Kconfig.ubsan
> @@ -112,23 +112,6 @@ config UBSAN_UNREACHABLE
>  	  This option enables -fsanitize=unreachable which checks for control
>  	  flow reaching an expected-to-be-unreachable position.
>  
> -config UBSAN_SIGNED_OVERFLOW
> -	bool "Perform checking for signed arithmetic overflow"
> -	default UBSAN
> -	depends on $(cc-option,-fsanitize=signed-integer-overflow)
> -	help
> -	  This option enables -fsanitize=signed-integer-overflow which checks
> -	  for overflow of any arithmetic operations with signed integers.
> -
> -config UBSAN_UNSIGNED_OVERFLOW
> -	bool "Perform checking for unsigned arithmetic overflow"
> -	depends on $(cc-option,-fsanitize=unsigned-integer-overflow)
> -	depends on !X86_32 # avoid excessive stack usage on x86-32/clang
> -	help
> -	  This option enables -fsanitize=unsigned-integer-overflow which checks
> -	  for overflow of any arithmetic operations with unsigned integers. This
> -	  currently causes x86 to fail to boot.
> -
>  config UBSAN_OBJECT_SIZE
>  	bool "Perform checking for accesses beyond the end of objects"
>  	default UBSAN
> diff --git a/lib/test_ubsan.c b/lib/test_ubsan.c
> index 5e5d9355ef49..7e7bbd0f3fd2 100644
> --- a/lib/test_ubsan.c
> +++ b/lib/test_ubsan.c
> @@ -11,51 +11,6 @@ typedef void(*test_ubsan_fp)(void);
>  			#config, IS_ENABLED(config) ? "y" : "n");	\
>  	} while (0)
>  
> -static void test_ubsan_add_overflow(void)
> -{
> -	volatile int val = INT_MAX;
> -	volatile unsigned int uval = UINT_MAX;
> -
> -	UBSAN_TEST(CONFIG_UBSAN_SIGNED_OVERFLOW);
> -	val += 2;
> -
> -	UBSAN_TEST(CONFIG_UBSAN_UNSIGNED_OVERFLOW);
> -	uval += 2;
> -}
> -
> -static void test_ubsan_sub_overflow(void)
> -{
> -	volatile int val = INT_MIN;
> -	volatile unsigned int uval = 0;
> -	volatile int val2 = 2;
> -
> -	UBSAN_TEST(CONFIG_UBSAN_SIGNED_OVERFLOW);
> -	val -= val2;
> -
> -	UBSAN_TEST(CONFIG_UBSAN_UNSIGNED_OVERFLOW);
> -	uval -= val2;
> -}
> -
> -static void test_ubsan_mul_overflow(void)
> -{
> -	volatile int val = INT_MAX / 2;
> -	volatile unsigned int uval = UINT_MAX / 2;
> -
> -	UBSAN_TEST(CONFIG_UBSAN_SIGNED_OVERFLOW);
> -	val *= 3;
> -
> -	UBSAN_TEST(CONFIG_UBSAN_UNSIGNED_OVERFLOW);
> -	uval *= 3;
> -}
> -
> -static void test_ubsan_negate_overflow(void)
> -{
> -	volatile int val = INT_MIN;
> -
> -	UBSAN_TEST(CONFIG_UBSAN_SIGNED_OVERFLOW);
> -	val = -val;
> -}
> -
>  static void test_ubsan_divrem_overflow(void)
>  {
>  	volatile int val = 16;
> @@ -155,10 +110,6 @@ static void test_ubsan_object_size_mismatch(void)
>  }
>  
>  static const test_ubsan_fp test_ubsan_array[] = {
> -	test_ubsan_add_overflow,
> -	test_ubsan_sub_overflow,
> -	test_ubsan_mul_overflow,
> -	test_ubsan_negate_overflow,
>  	test_ubsan_shift_out_of_bounds,
>  	test_ubsan_out_of_bounds,
>  	test_ubsan_load_invalid_value,
> diff --git a/lib/ubsan.c b/lib/ubsan.c
> index bec38c64d6a6..26229973049d 100644
> --- a/lib/ubsan.c
> +++ b/lib/ubsan.c
> @@ -163,74 +163,6 @@ static void ubsan_epilogue(void)
>  	}
>  }
>  
> -static void handle_overflow(struct overflow_data *data, void *lhs,
> -			void *rhs, char op)
> -{
> -
> -	struct type_descriptor *type = data->type;
> -	char lhs_val_str[VALUE_LENGTH];
> -	char rhs_val_str[VALUE_LENGTH];
> -
> -	if (suppress_report(&data->location))
> -		return;
> -
> -	ubsan_prologue(&data->location, type_is_signed(type) ?
> -			"signed-integer-overflow" :
> -			"unsigned-integer-overflow");
> -
> -	val_to_string(lhs_val_str, sizeof(lhs_val_str), type, lhs);
> -	val_to_string(rhs_val_str, sizeof(rhs_val_str), type, rhs);
> -	pr_err("%s %c %s cannot be represented in type %s\n",
> -		lhs_val_str,
> -		op,
> -		rhs_val_str,
> -		type->type_name);
> -
> -	ubsan_epilogue();
> -}
> -
> -void __ubsan_handle_add_overflow(void *data,
> -				void *lhs, void *rhs)
> -{
> -
> -	handle_overflow(data, lhs, rhs, '+');
> -}
> -EXPORT_SYMBOL(__ubsan_handle_add_overflow);
> -
> -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(void *data,
> -				void *lhs, void *rhs)
> -{
> -	handle_overflow(data, lhs, rhs, '*');
> -}
> -EXPORT_SYMBOL(__ubsan_handle_mul_overflow);
> -
> -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))
> -		return;
> -
> -	ubsan_prologue(&data->location, "negation-overflow");
> -
> -	val_to_string(old_val_str, sizeof(old_val_str), data->type, old_val);
> -
> -	pr_err("negation of %s cannot be represented in type %s:\n",
> -		old_val_str, data->type->type_name);
> -
> -	ubsan_epilogue();
> -}
> -EXPORT_SYMBOL(__ubsan_handle_negate_overflow);
> -
> -
>  void __ubsan_handle_divrem_overflow(void *_data, void *lhs, void *rhs)
>  {
>  	struct overflow_data *data = _data;
> diff --git a/scripts/Makefile.ubsan b/scripts/Makefile.ubsan
> index 0e53a93e8f15..9e2092fd5206 100644
> --- a/scripts/Makefile.ubsan
> +++ b/scripts/Makefile.ubsan
> @@ -8,8 +8,6 @@ ubsan-cflags-$(CONFIG_UBSAN_LOCAL_BOUNDS)	+= -fsanitize=local-bounds
>  ubsan-cflags-$(CONFIG_UBSAN_SHIFT)		+= -fsanitize=shift
>  ubsan-cflags-$(CONFIG_UBSAN_DIV_ZERO)		+= -fsanitize=integer-divide-by-zero
>  ubsan-cflags-$(CONFIG_UBSAN_UNREACHABLE)	+= -fsanitize=unreachable
> -ubsan-cflags-$(CONFIG_UBSAN_SIGNED_OVERFLOW)	+= -fsanitize=signed-integer-overflow
> -ubsan-cflags-$(CONFIG_UBSAN_UNSIGNED_OVERFLOW)	+= -fsanitize=unsigned-integer-overflow
>  ubsan-cflags-$(CONFIG_UBSAN_OBJECT_SIZE)	+= -fsanitize=object-size
>  ubsan-cflags-$(CONFIG_UBSAN_BOOL)		+= -fsanitize=bool
>  ubsan-cflags-$(CONFIG_UBSAN_ENUM)		+= -fsanitize=enum
> -- 
> 2.26.2
> 

-- 
Kees Cook

  reply	other threads:[~2021-02-10  0:35 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-08 12:52 linux-next: Tree for Feb 8 Stephen Rothwell
2021-02-08 19:30 ` linux-next: Tree for Feb 8 (objtool: warnings: 5) Randy Dunlap
2021-02-08 21:21   ` Josh Poimboeuf
2021-02-08 21:39     ` Randy Dunlap
2021-02-09 22:59       ` Josh Poimboeuf
2021-02-10  0:16         ` Randy Dunlap
2021-02-09  8:06     ` Peter Zijlstra
2021-02-09 23:23       ` [PATCH] ubsan: remove overflow checks Andrey Ryabinin
2021-02-10  0:19         ` Kees Cook [this message]
2021-02-10  7:50           ` Peter Zijlstra
2021-02-10 11:55           ` Andrey Rybainin
2021-02-09  8:34   ` [PATCH] lockdep: Noinstr annotate warn_bogus_irq_restore() Peter Zijlstra
2021-02-09 13:24     ` Mark Rutland
2021-02-09 16:03       ` Peter Zijlstra
2021-02-09 16:13         ` Mark Rutland
2021-02-09 18:28         ` Randy Dunlap
2021-02-10 13:59         ` [tip: locking/core] " tip-bot2 for Peter Zijlstra
2021-02-09  3:33 ` linux-next: Tree for Feb 8 (Warning at arch/x86/kernel/irq.c:390) Randy Dunlap
2021-02-09 10:17   ` Borislav Petkov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=202102091617.8FD77890@keescook \
    --to=keescook@chromium.org \
    --cc=akpm@linux-foundation.org \
    --cc=dvyukov@google.com \
    --cc=jpoimboe@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-next@vger.kernel.org \
    --cc=peterz@infradead.org \
    --cc=rdunlap@infradead.org \
    --cc=ryabinin.a.a@gmail.com \
    --cc=sfr@canb.auug.org.au \
    --cc=viro@zeniv.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.