Hi Colin,

kernel test robot noticed the following build errors:

[auto build test ERROR on kees/for-next/hardening]
[also build test ERROR on kees/for-next/pstore kees/for-next/kspp linus/master 
v6.16-rc3 next-20250626]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    
https://github.com/intel-lab-lkp/linux/commits/Colin-Ian-King/fortify-add-branch-hints-on-unlikely-fortify_panic-paths/20250626-001527
base:   https://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git 
for-next/hardening
patch link:    
https://lore.kernel.org/r/20250625161221.295575-1-colin.i.king%40gmail.com
patch subject: [PATCH][next] fortify: add branch hints on unlikely 
fortify_panic paths
config: x86_64-buildonly-randconfig-001-20250627 
(https://download.01.org/0day-ci/archive/20250627/202506270832.qj2ekscw-...@intel.com/config)
compiler: clang version 20.1.7 (https://github.com/llvm/llvm-project 
6146a88f60492b520a36f8f8f3231e15f3cc6082)
reproduce (this is a W=1 build): 
(https://download.01.org/0day-ci/archive/20250627/202506270832.qj2ekscw-...@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <l...@intel.com>
| Closes: 
https://lore.kernel.org/oe-kbuild-all/202506270832.qj2ekscw-...@intel.com/

All error/warnings (new ones prefixed by >>):

   In file included from scripts/mod/devicetable-offsets.c:3:
   In file included from include/linux/mod_devicetable.h:14:
   In file included from include/linux/uuid.h:11:
   In file included from include/linux/string.h:392:
>> include/linux/fortify-string.h:596:6: warning: non-constant static local 
>> variable in inline function may be different in different files 
>> [-Wstatic-local-in-inline]
     596 |         if (unlikely(p_size != SIZE_MAX && p_size < size))
         |             ^
   include/linux/compiler.h:47:24: note: expanded from macro 'unlikely'
      47 | #  define unlikely(x)   (__branch_check__(x, 0, 
__builtin_constant_p(x)))
         |                          ^
   include/linux/compiler.h:24:4: note: expanded from macro '__branch_check__'
      24 |                         static struct ftrace_likely_data             
   \
         |                         ^
   In file included from scripts/mod/devicetable-offsets.c:3:
   In file included from include/linux/mod_devicetable.h:14:
   In file included from include/linux/uuid.h:11:
   In file included from include/linux/string.h:392:
   include/linux/fortify-string.h:598:11: warning: non-constant static local 
variable in inline function may be different in different files 
[-Wstatic-local-in-inline]
     598 |         else if (unlikely(q_size != SIZE_MAX && q_size < size))
         |                  ^
   include/linux/compiler.h:47:24: note: expanded from macro 'unlikely'
      47 | #  define unlikely(x)   (__branch_check__(x, 0, 
__builtin_constant_p(x)))
         |                          ^
   include/linux/compiler.h:24:4: note: expanded from macro '__branch_check__'
      24 |                         static struct ftrace_likely_data             
   \
         |                         ^
   2 warnings generated.
--
   In file included from lib/locking-selftest.c:14:
   In file included from include/linux/rwsem.h:15:
   In file included from include/linux/spinlock.h:59:
   In file included from include/linux/irqflags.h:18:
   In file included from arch/x86/include/asm/irqflags.h:102:
   In file included from arch/x86/include/asm/paravirt.h:21:
   In file included from include/linux/cpumask.h:12:
   In file included from include/linux/bitmap.h:13:
   In file included from include/linux/string.h:392:
>> include/linux/fortify-string.h:596:6: warning: non-constant static local 
>> variable in inline function may be different in different files 
>> [-Wstatic-local-in-inline]
     596 |         if (unlikely(p_size != SIZE_MAX && p_size < size))
         |             ^
   include/linux/compiler.h:47:24: note: expanded from macro 'unlikely'
      47 | #  define unlikely(x)   (__branch_check__(x, 0, 
__builtin_constant_p(x)))
         |                          ^
   include/linux/compiler.h:24:4: note: expanded from macro '__branch_check__'
      24 |                         static struct ftrace_likely_data             
   \
         |                         ^
   In file included from lib/locking-selftest.c:14:
   In file included from include/linux/rwsem.h:15:
   In file included from include/linux/spinlock.h:59:
   In file included from include/linux/irqflags.h:18:
   In file included from arch/x86/include/asm/irqflags.h:102:
   In file included from arch/x86/include/asm/paravirt.h:21:
   In file included from include/linux/cpumask.h:12:
   In file included from include/linux/bitmap.h:13:
   In file included from include/linux/string.h:392:
   include/linux/fortify-string.h:598:11: warning: non-constant static local 
variable in inline function may be different in different files 
[-Wstatic-local-in-inline]
     598 |         else if (unlikely(q_size != SIZE_MAX && q_size < size))
         |                  ^
   include/linux/compiler.h:47:24: note: expanded from macro 'unlikely'
      47 | #  define unlikely(x)   (__branch_check__(x, 0, 
__builtin_constant_p(x)))
         |                          ^
   include/linux/compiler.h:24:4: note: expanded from macro '__branch_check__'
      24 |                         static struct ftrace_likely_data             
   \
         |                         ^
   lib/locking-selftest.c:2510:1: warning: unused function 
'class_HARDIRQ_lock_ptr' [-Wunused-function]
    2510 | DEFINE_LOCK_GUARD_0(HARDIRQ, HARDIRQ_ENTER(), HARDIRQ_EXIT())
         | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/cleanup.h:432:49: note: expanded from macro 
'DEFINE_LOCK_GUARD_0'
     432 | __DEFINE_CLASS_IS_CONDITIONAL(_name, false);                         
   \
         |                                                                      
   ^
     433 | __DEFINE_UNLOCK_GUARD(_name, void, _unlock, __VA_ARGS__)             
   \
         | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/cleanup.h:406:10: note: expanded from macro '\
   __DEFINE_UNLOCK_GUARD'
     406 |                                                                      
   \
         |                                                                      
   ^
     407 | __DEFINE_GUARD_LOCK_PTR(_name, &_T->lock)
         | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/cleanup.h:314:23: note: expanded from macro '\
   __DEFINE_GUARD_LOCK_PTR'
     314 |         static inline void * 
class_##_name##_lock_ptr(class_##_name##_t *_T) \
         |                              ^~~~~~~~~~~~~~~~~~~~~~~~
   <scratch space>:21:1: note: expanded from here
      21 | class_HARDIRQ_lock_ptr
         | ^~~~~~~~~~~~~~~~~~~~~~
   lib/locking-selftest.c:2511:1: warning: unused function 
'class_NOTTHREADED_HARDIRQ_lock_ptr' [-Wunused-function]
    2511 | DEFINE_LOCK_GUARD_0(NOTTHREADED_HARDIRQ,
         | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    2512 |         do {
         |         ~~~~
    2513 |                 local_irq_disable();
         |                 ~~~~~~~~~~~~~~~~~~~~
    2514 |                 __irq_enter();
         |                 ~~~~~~~~~~~~~~
    2515 |                 WARN_ON(!in_irq());
         |                 ~~~~~~~~~~~~~~~~~~~
    2516 |         } while(0), HARDIRQ_EXIT())
         |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/cleanup.h:432:49: note: expanded from macro 
'DEFINE_LOCK_GUARD_0'
     432 | __DEFINE_CLASS_IS_CONDITIONAL(_name, false);                         
   \
         |                                                                      
   ^
     433 | __DEFINE_UNLOCK_GUARD(_name, void, _unlock, __VA_ARGS__)             
   \
         | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/cleanup.h:406:10: note: expanded from macro '\
   __DEFINE_UNLOCK_GUARD'
     406 |                                                                      
   \
         |                                                                      
   ^
     407 | __DEFINE_GUARD_LOCK_PTR(_name, &_T->lock)
         | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/cleanup.h:314:23: note: expanded from macro '\
   __DEFINE_GUARD_LOCK_PTR'
     314 |         static inline void * 
class_##_name##_lock_ptr(class_##_name##_t *_T) \
         |                              ^~~~~~~~~~~~~~~~~~~~~~~~
   <scratch space>:105:1: note: expanded from here
     105 | class_NOTTHREADED_HARDIRQ_lock_ptr
         | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   lib/locking-selftest.c:2517:1: warning: unused function 
'class_SOFTIRQ_lock_ptr' [-Wunused-function]
    2517 | DEFINE_LOCK_GUARD_0(SOFTIRQ, SOFTIRQ_ENTER(), SOFTIRQ_EXIT())
         | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/cleanup.h:432:49: note: expanded from macro 
'DEFINE_LOCK_GUARD_0'
     432 | __DEFINE_CLASS_IS_CONDITIONAL(_name, false);                         
   \
         |                                                                      
   ^
     433 | __DEFINE_UNLOCK_GUARD(_name, void, _unlock, __VA_ARGS__)             
   \
         | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/cleanup.h:406:10: note: expanded from macro '\
   __DEFINE_UNLOCK_GUARD'
     406 |                                                                      
   \
         |                                                                      
   ^
     407 | __DEFINE_GUARD_LOCK_PTR(_name, &_T->lock)
         | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/cleanup.h:314:23: note: expanded from macro '\
   __DEFINE_GUARD_LOCK_PTR'
     314 |         static inline void * 
class_##_name##_lock_ptr(class_##_name##_t *_T) \
         |                              ^~~~~~~~~~~~~~~~~~~~~~~~
   <scratch space>:125:1: note: expanded from here
     125 | class_SOFTIRQ_lock_ptr
         | ^~~~~~~~~~~~~~~~~~~~~~
   lib/locking-selftest.c:2520:1: warning: unused function 'class_RCU_lock_ptr' 
[-Wunused-function]
--
   In file included from lib/test_bitops.c:10:
   In file included from include/linux/module.h:13:
   In file included from include/linux/stat.h:19:
   In file included from include/linux/time.h:60:
   In file included from include/linux/time32.h:13:
   In file included from include/linux/timex.h:67:
   In file included from arch/x86/include/asm/timex.h:5:
   In file included from arch/x86/include/asm/processor.h:19:
   In file included from arch/x86/include/asm/cpuid/api.h:57:
   In file included from arch/x86/include/asm/paravirt.h:21:
   In file included from include/linux/cpumask.h:12:
   In file included from include/linux/bitmap.h:13:
   In file included from include/linux/string.h:392:
>> include/linux/fortify-string.h:596:6: error: non-constant static local 
>> variable in inline function may be different in different files 
>> [-Werror,-Wstatic-local-in-inline]
     596 |         if (unlikely(p_size != SIZE_MAX && p_size < size))
         |             ^
   include/linux/compiler.h:47:24: note: expanded from macro 'unlikely'
      47 | #  define unlikely(x)   (__branch_check__(x, 0, 
__builtin_constant_p(x)))
         |                          ^
   include/linux/compiler.h:24:4: note: expanded from macro '__branch_check__'
      24 |                         static struct ftrace_likely_data             
   \
         |                         ^
   In file included from lib/test_bitops.c:10:
   In file included from include/linux/module.h:13:
   In file included from include/linux/stat.h:19:
   In file included from include/linux/time.h:60:
   In file included from include/linux/time32.h:13:
   In file included from include/linux/timex.h:67:
   In file included from arch/x86/include/asm/timex.h:5:
   In file included from arch/x86/include/asm/processor.h:19:
   In file included from arch/x86/include/asm/cpuid/api.h:57:
   In file included from arch/x86/include/asm/paravirt.h:21:
   In file included from include/linux/cpumask.h:12:
   In file included from include/linux/bitmap.h:13:
   In file included from include/linux/string.h:392:
   include/linux/fortify-string.h:598:11: error: non-constant static local 
variable in inline function may be different in different files 
[-Werror,-Wstatic-local-in-inline]
     598 |         else if (unlikely(q_size != SIZE_MAX && q_size < size))
         |                  ^
   include/linux/compiler.h:47:24: note: expanded from macro 'unlikely'
      47 | #  define unlikely(x)   (__branch_check__(x, 0, 
__builtin_constant_p(x)))
         |                          ^
   include/linux/compiler.h:24:4: note: expanded from macro '__branch_check__'
      24 |                         static struct ftrace_likely_data             
   \
         |                         ^
   2 errors generated.
--
   In file included from lib/test_maple_tree.c:10:
   In file included from include/linux/maple_tree.h:12:
   In file included from include/linux/rcupdate.h:26:
   In file included from include/linux/irqflags.h:18:
   In file included from arch/x86/include/asm/irqflags.h:102:
   In file included from arch/x86/include/asm/paravirt.h:21:
   In file included from include/linux/cpumask.h:12:
   In file included from include/linux/bitmap.h:13:
   In file included from include/linux/string.h:392:
>> include/linux/fortify-string.h:596:6: warning: non-constant static local 
>> variable in inline function may be different in different files 
>> [-Wstatic-local-in-inline]
     596 |         if (unlikely(p_size != SIZE_MAX && p_size < size))
         |             ^
   include/linux/compiler.h:47:24: note: expanded from macro 'unlikely'
      47 | #  define unlikely(x)   (__branch_check__(x, 0, 
__builtin_constant_p(x)))
         |                          ^
   include/linux/compiler.h:24:4: note: expanded from macro '__branch_check__'
      24 |                         static struct ftrace_likely_data             
   \
         |                         ^
   In file included from lib/test_maple_tree.c:10:
   In file included from include/linux/maple_tree.h:12:
   In file included from include/linux/rcupdate.h:26:
   In file included from include/linux/irqflags.h:18:
   In file included from arch/x86/include/asm/irqflags.h:102:
   In file included from arch/x86/include/asm/paravirt.h:21:
   In file included from include/linux/cpumask.h:12:
   In file included from include/linux/bitmap.h:13:
   In file included from include/linux/string.h:392:
   include/linux/fortify-string.h:598:11: warning: non-constant static local 
variable in inline function may be different in different files 
[-Wstatic-local-in-inline]
     598 |         else if (unlikely(q_size != SIZE_MAX && q_size < size))
         |                  ^
   include/linux/compiler.h:47:24: note: expanded from macro 'unlikely'
      47 | #  define unlikely(x)   (__branch_check__(x, 0, 
__builtin_constant_p(x)))
         |                          ^
   include/linux/compiler.h:24:4: note: expanded from macro '__branch_check__'
      24 |                         static struct ftrace_likely_data             
   \
         |                         ^
   lib/test_maple_tree.c:212:26: warning: unused function 'not_empty' 
[-Wunused-function]
     212 | static inline __init int not_empty(struct maple_node *node)
         |                          ^~~~~~~~~
   3 warnings generated.
--
   In file included from lib/tests/stackinit_kunit.c:14:
   In file included from include/kunit/test.h:22:
   In file included from include/linux/kref.h:16:
   In file included from include/linux/spinlock.h:59:
   In file included from include/linux/irqflags.h:18:
   In file included from arch/x86/include/asm/irqflags.h:102:
   In file included from arch/x86/include/asm/paravirt.h:21:
   In file included from include/linux/cpumask.h:12:
   In file included from include/linux/bitmap.h:13:
   In file included from include/linux/string.h:392:
>> include/linux/fortify-string.h:596:6: warning: non-constant static local 
>> variable in inline function may be different in different files 
>> [-Wstatic-local-in-inline]
     596 |         if (unlikely(p_size != SIZE_MAX && p_size < size))
         |             ^
   include/linux/compiler.h:47:24: note: expanded from macro 'unlikely'
      47 | #  define unlikely(x)   (__branch_check__(x, 0, 
__builtin_constant_p(x)))
         |                          ^
   include/linux/compiler.h:24:4: note: expanded from macro '__branch_check__'
      24 |                         static struct ftrace_likely_data             
   \
         |                         ^
   In file included from lib/tests/stackinit_kunit.c:14:
   In file included from include/kunit/test.h:22:
   In file included from include/linux/kref.h:16:
   In file included from include/linux/spinlock.h:59:
   In file included from include/linux/irqflags.h:18:
   In file included from arch/x86/include/asm/irqflags.h:102:
   In file included from arch/x86/include/asm/paravirt.h:21:
   In file included from include/linux/cpumask.h:12:
   In file included from include/linux/bitmap.h:13:
   In file included from include/linux/string.h:392:
   include/linux/fortify-string.h:598:11: warning: non-constant static local 
variable in inline function may be different in different files 
[-Wstatic-local-in-inline]
     598 |         else if (unlikely(q_size != SIZE_MAX && q_size < size))
         |                  ^
   include/linux/compiler.h:47:24: note: expanded from macro 'unlikely'
      47 | #  define unlikely(x)   (__branch_check__(x, 0, 
__builtin_constant_p(x)))
         |                          ^
   include/linux/compiler.h:24:4: note: expanded from macro '__branch_check__'
      24 |                         static struct ftrace_likely_data             
   \
         |                         ^
   lib/tests/stackinit_kunit.c:441:1: warning: initializer overrides prior 
initialization of this subobject [-Winitializer-overrides]
     441 | DEFINE_UNION_INITIALIZER_TESTS(static, STRONG_PASS);
         | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   lib/tests/stackinit_kunit.c:421:3: note: expanded from macro 
'DEFINE_UNION_INITIALIZER_TESTS'
     421 |                 DEFINE_UNION_TESTS(base ## _ ## all, xfail)
         |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   lib/tests/stackinit_kunit.c:424:3: note: expanded from macro 
'DEFINE_UNION_TESTS'
     424 |                 DEFINE_UNION_TEST(same_sizes, init, xfail);     \
         |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   lib/tests/stackinit_kunit.c:403:3: note: expanded from macro 
'DEFINE_UNION_TEST'
     403 |                 DEFINE_TEST(name ## _ ## init,                  \
         |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     404 |                             union test_ ## name, STRUCT, init,  \
         |                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     405 |                             xfail)
         |                             ~~~~~~
   note: (skipping 1 expansions in backtrace; use -fmacro-backtrace-limit=0 to 
see all)
   <scratch space>:20:1: note: expanded from here
      20 | INIT_STRUCT_static_all
         | ^
   lib/tests/stackinit_kunit.c:137:8: note: expanded from macro 
'INIT_STRUCT_static_all'
     137 |                                         = __static_all
         |                                           ^~~~~~~~~~~~
   lib/tests/stackinit_kunit.c:118:8: note: expanded from macro '__static_all'
     118 |                                           .two = 0,                  
   \
         |                                           ^~~~~~~~
   lib/tests/stackinit_kunit.c:441:1: note: previous initialization is here
     441 | DEFINE_UNION_INITIALIZER_TESTS(static, STRONG_PASS);
         | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   lib/tests/stackinit_kunit.c:421:3: note: expanded from macro 
'DEFINE_UNION_INITIALIZER_TESTS'
     421 |                 DEFINE_UNION_TESTS(base ## _ ## all, xfail)
         |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   lib/tests/stackinit_kunit.c:424:3: note: expanded from macro 
'DEFINE_UNION_TESTS'
     424 |                 DEFINE_UNION_TEST(same_sizes, init, xfail);     \
         |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   lib/tests/stackinit_kunit.c:403:3: note: expanded from macro 
'DEFINE_UNION_TEST'
     403 |                 DEFINE_TEST(name ## _ ## init,                  \
         |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     404 |                             union test_ ## name, STRUCT, init,  \
         |                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     405 |                             xfail)
         |                             ~~~~~~
   note: (skipping 1 expansions in backtrace; use -fmacro-backtrace-limit=0 to 
see all)
   <scratch space>:20:1: note: expanded from here
      20 | INIT_STRUCT_static_all
         | ^
   lib/tests/stackinit_kunit.c:137:8: note: expanded from macro 
'INIT_STRUCT_static_all'
     137 |                                         = __static_all
         |                                           ^~~~~~~~~~~~
   lib/tests/stackinit_kunit.c:117:33: note: expanded from macro '__static_all'
     117 | #define __static_all                    { .one = 0,                  
   \
         |                                                  ^
   lib/tests/stackinit_kunit.c:441:1: warning: initializer overrides prior 
initialization of this subobject [-Winitializer-overrides]
     441 | DEFINE_UNION_INITIALIZER_TESTS(static, STRONG_PASS);
         | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   lib/tests/stackinit_kunit.c:421:3: note: expanded from macro 
'DEFINE_UNION_INITIALIZER_TESTS'
     421 |                 DEFINE_UNION_TESTS(base ## _ ## all, xfail)
         |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   lib/tests/stackinit_kunit.c:424:3: note: expanded from macro 
'DEFINE_UNION_TESTS'
     424 |                 DEFINE_UNION_TEST(same_sizes, init, xfail);     \
         |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   lib/tests/stackinit_kunit.c:403:3: note: expanded from macro 
'DEFINE_UNION_TEST'
     403 |                 DEFINE_TEST(name ## _ ## init,                  \
         |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     404 |                             union test_ ## name, STRUCT, init,  \
         |                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     405 |                             xfail)
         |                             ~~~~~~
   note: (skipping 1 expansions in backtrace; use -fmacro-backtrace-limit=0 to 
see all)
   <scratch space>:20:1: note: expanded from here
      20 | INIT_STRUCT_static_all
         | ^
   lib/tests/stackinit_kunit.c:137:8: note: expanded from macro 
'INIT_STRUCT_static_all'
..


vim +596 include/linux/fortify-string.h

   515  
   516  /*
   517   * To make sure the compiler can enforce protection against buffer 
overflows,
   518   * memcpy(), memmove(), and memset() must not be used beyond individual
   519   * struct members. If you need to copy across multiple members, please 
use
   520   * struct_group() to create a named mirror of an anonymous struct union.
   521   * (e.g. see struct sk_buff.) Read overflow checking is currently only
   522   * done when a write overflow is also present, or when building with 
W=1.
   523   *
   524   * Mitigation coverage matrix
   525   *                                      Bounds checking at:
   526   *                                      
+-------+-------+-------+-------+
   527   *                                      | Compile time  |   Run time    
|
   528   * memcpy() argument sizes:             | write | read  | write | read  
|
   529   *        dest     source   length      
+-------+-------+-------+-------+
   530   * memcpy(known,   known,   constant)   |   y   |   y   |  n/a  |  n/a  
|
   531   * memcpy(known,   unknown, constant)   |   y   |   n   |  n/a  |   V   
|
   532   * memcpy(known,   known,   dynamic)    |   n   |   n   |   B   |   B   
|
   533   * memcpy(known,   unknown, dynamic)    |   n   |   n   |   B   |   V   
|
   534   * memcpy(unknown, known,   constant)   |   n   |   y   |   V   |  n/a  
|
   535   * memcpy(unknown, unknown, constant)   |   n   |   n   |   V   |   V   
|
   536   * memcpy(unknown, known,   dynamic)    |   n   |   n   |   V   |   B   
|
   537   * memcpy(unknown, unknown, dynamic)    |   n   |   n   |   V   |   V   
|
   538   *                                      
+-------+-------+-------+-------+
   539   *
   540   * y = perform deterministic compile-time bounds checking
   541   * n = cannot perform deterministic compile-time bounds checking
   542   * n/a = no run-time bounds checking needed since compile-time 
deterministic
   543   * B = can perform run-time bounds checking (currently unimplemented)
   544   * V = vulnerable to run-time overflow (will need refactoring to solve)
   545   *
   546   */
   547  __FORTIFY_INLINE bool fortify_memcpy_chk(__kernel_size_t size,
   548                                           const size_t p_size,
   549                                           const size_t q_size,
   550                                           const size_t p_size_field,
   551                                           const size_t q_size_field,
   552                                           const u8 func)
   553  {
   554          if (__builtin_constant_p(size)) {
   555                  /*
   556                   * Length argument is a constant expression, so we
   557                   * can perform compile-time bounds checking where
   558                   * buffer sizes are also known at compile time.
   559                   */
   560  
   561                  /* Error when size is larger than enclosing struct. */
   562                  if (__compiletime_lessthan(p_size_field, p_size) &&
   563                      __compiletime_lessthan(p_size, size))
   564                          __write_overflow();
   565                  if (__compiletime_lessthan(q_size_field, q_size) &&
   566                      __compiletime_lessthan(q_size, size))
   567                          __read_overflow2();
   568  
   569                  /* Warn when write size argument larger than dest 
field. */
   570                  if (__compiletime_lessthan(p_size_field, size))
   571                          __write_overflow_field(p_size_field, size);
   572                  /*
   573                   * Warn for source field over-read when building with 
W=1
   574                   * or when an over-write happened, so both can be fixed 
at
   575                   * the same time.
   576                   */
   577                  if ((IS_ENABLED(KBUILD_EXTRA_WARN1) ||
   578                       __compiletime_lessthan(p_size_field, size)) &&
   579                      __compiletime_lessthan(q_size_field, size))
   580                          __read_overflow2_field(q_size_field, size);
   581          }
   582          /*
   583           * At this point, length argument may not be a constant 
expression,
   584           * so run-time bounds checking can be done where buffer sizes 
are
   585           * known. (This is not an "else" because the above checks may 
only
   586           * be compile-time warnings, and we want to still warn for 
run-time
   587           * overflows.)
   588           */
   589  
   590          /*
   591           * Always stop accesses beyond the struct that contains the
   592           * field, when the buffer's remaining size is known.
   593           * (The SIZE_MAX test is to optimize away checks where the 
buffer
   594           * lengths are unknown.)
   595           */
 > 596          if (unlikely(p_size != SIZE_MAX && p_size < size))
   597                  fortify_panic(func, FORTIFY_WRITE, p_size, size, true);
   598          else if (unlikely(q_size != SIZE_MAX && q_size < size))
   599                  fortify_panic(func, FORTIFY_READ, p_size, size, true);
   600  
   601          /*
   602           * Warn when writing beyond destination field size.
   603           *
   604           * Note the implementation of __builtin_*object_size() behaves
   605           * like sizeof() when not directly referencing a flexible
   606           * array member, which means there will be many bounds checks
   607           * that will appear at run-time, without a way for them to be
   608           * detected at compile-time (as can be done when the destination
   609           * is specifically the flexible array member).
   610           * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101832
   611           */
   612          if (p_size_field != SIZE_MAX &&
   613              p_size != p_size_field && p_size_field < size)
   614                  return true;
   615  
   616          return false;
   617  }
   618  

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

Reply via email to