mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 19:08:57 +09:00
Merge 86cffecdea ("Compiler Attributes: add __alloc_size() for better bounds checking") into android-mainline
Steps on the way to 5.16-rc1 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I1833139d9c0db842ec3b7c7225c0455f5c29a8de
This commit is contained in:
15
Makefile
15
Makefile
@@ -1030,6 +1030,21 @@ ifdef CONFIG_CC_IS_GCC
|
||||
KBUILD_CFLAGS += -Wno-maybe-uninitialized
|
||||
endif
|
||||
|
||||
ifdef CONFIG_CC_IS_GCC
|
||||
# The allocators already balk at large sizes, so silence the compiler
|
||||
# warnings for bounds checks involving those possible values. While
|
||||
# -Wno-alloc-size-larger-than would normally be used here, earlier versions
|
||||
# of gcc (<9.1) weirdly don't handle the option correctly when _other_
|
||||
# warnings are produced (?!). Using -Walloc-size-larger-than=SIZE_MAX
|
||||
# doesn't work (as it is documented to), silently resolving to "0" prior to
|
||||
# version 9.1 (and producing an error more recently). Numeric values larger
|
||||
# than PTRDIFF_MAX also don't work prior to version 9.1, which are silently
|
||||
# ignored, continuing to default to PTRDIFF_MAX. So, left with no other
|
||||
# choice, we must perform a versioned check to disable this warning.
|
||||
# https://lore.kernel.org/lkml/20210824115859.187f272f@canb.auug.org.au
|
||||
KBUILD_CFLAGS += $(call cc-ifversion, -ge, 0901, -Wno-alloc-size-larger-than)
|
||||
endif
|
||||
|
||||
# disable invalid "can't wrap" optimizations for signed / pointers
|
||||
KBUILD_CFLAGS += -fno-strict-overflow
|
||||
|
||||
|
||||
@@ -965,6 +965,7 @@ static int rio_mport_transfer_ioctl(struct file *filp, void __user *arg)
|
||||
struct rio_transfer_io *transfer;
|
||||
enum dma_data_direction dir;
|
||||
int i, ret = 0;
|
||||
size_t size;
|
||||
|
||||
if (unlikely(copy_from_user(&transaction, arg, sizeof(transaction))))
|
||||
return -EFAULT;
|
||||
@@ -976,13 +977,14 @@ static int rio_mport_transfer_ioctl(struct file *filp, void __user *arg)
|
||||
priv->md->properties.transfer_mode) == 0)
|
||||
return -ENODEV;
|
||||
|
||||
transfer = vmalloc(array_size(sizeof(*transfer), transaction.count));
|
||||
size = array_size(sizeof(*transfer), transaction.count);
|
||||
transfer = vmalloc(size);
|
||||
if (!transfer)
|
||||
return -ENOMEM;
|
||||
|
||||
if (unlikely(copy_from_user(transfer,
|
||||
(void __user *)(uintptr_t)transaction.block,
|
||||
array_size(sizeof(*transfer), transaction.count)))) {
|
||||
size))) {
|
||||
ret = -EFAULT;
|
||||
goto out_free;
|
||||
}
|
||||
@@ -994,8 +996,7 @@ static int rio_mport_transfer_ioctl(struct file *filp, void __user *arg)
|
||||
transaction.sync, dir, &transfer[i]);
|
||||
|
||||
if (unlikely(copy_to_user((void __user *)(uintptr_t)transaction.block,
|
||||
transfer,
|
||||
array_size(sizeof(*transfer), transaction.count))))
|
||||
transfer, size)))
|
||||
ret = -EFAULT;
|
||||
|
||||
out_free:
|
||||
|
||||
@@ -150,3 +150,11 @@
|
||||
#else
|
||||
#define __diag_GCC_8(s)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Prior to 9.1, -Wno-alloc-size-larger-than (and therefore the "alloc_size"
|
||||
* attribute) do not work, and must be disabled.
|
||||
*/
|
||||
#if GCC_VERSION < 90100
|
||||
#undef __alloc_size__
|
||||
#endif
|
||||
|
||||
@@ -33,6 +33,15 @@
|
||||
#define __aligned(x) __attribute__((__aligned__(x)))
|
||||
#define __aligned_largest __attribute__((__aligned__))
|
||||
|
||||
/*
|
||||
* Note: do not use this directly. Instead, use __alloc_size() since it is conditionally
|
||||
* available and includes other attributes.
|
||||
*
|
||||
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-alloc_005fsize-function-attribute
|
||||
* clang: https://clang.llvm.org/docs/AttributeReference.html#alloc-size
|
||||
*/
|
||||
#define __alloc_size__(x, ...) __attribute__((__alloc_size__(x, ## __VA_ARGS__)))
|
||||
|
||||
/*
|
||||
* Note: users of __always_inline currently do not write "inline" themselves,
|
||||
* which seems to be required by gcc to apply the attribute according
|
||||
@@ -153,6 +162,7 @@
|
||||
|
||||
/*
|
||||
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-malloc-function-attribute
|
||||
* clang: https://clang.llvm.org/docs/AttributeReference.html#malloc
|
||||
*/
|
||||
#define __malloc __attribute__((__malloc__))
|
||||
|
||||
|
||||
@@ -250,6 +250,18 @@ struct ftrace_likely_data {
|
||||
# define __cficanonical
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Any place that could be marked with the "alloc_size" attribute is also
|
||||
* a place to be marked with the "malloc" attribute. Do this as part of the
|
||||
* __alloc_size macro to avoid redundant attributes and to avoid missing a
|
||||
* __malloc marking.
|
||||
*/
|
||||
#ifdef __alloc_size__
|
||||
# define __alloc_size(x, ...) __alloc_size__(x, ## __VA_ARGS__) __malloc
|
||||
#else
|
||||
# define __alloc_size(x, ...) __malloc
|
||||
#endif
|
||||
|
||||
#ifndef asm_volatile_goto
|
||||
#define asm_volatile_goto(x...) asm goto(x)
|
||||
#endif
|
||||
|
||||
@@ -489,7 +489,8 @@ our $Attribute = qr{
|
||||
____cacheline_aligned|
|
||||
____cacheline_aligned_in_smp|
|
||||
____cacheline_internodealigned_in_smp|
|
||||
__weak
|
||||
__weak|
|
||||
__alloc_size\s*\(\s*\d+\s*(?:,\s*\d+\s*)?\)
|
||||
}x;
|
||||
our $Modifier;
|
||||
our $Inline = qr{inline|__always_inline|noinline|__inline|__inline__};
|
||||
|
||||
Reference in New Issue
Block a user