LCOV - code coverage report
Current view: top level - include/asm-generic - access_ok.h (source / functions) Hit Total Coverage
Test: fstests of 6.5.0-rc3-acha @ Mon Jul 31 20:08:06 PDT 2023 Lines: 4 4 100.0 %
Date: 2023-07-31 20:08:07 Functions: 0 0 -

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0 */
       2             : #ifndef __ASM_GENERIC_ACCESS_OK_H__
       3             : #define __ASM_GENERIC_ACCESS_OK_H__
       4             : 
       5             : /*
       6             :  * Checking whether a pointer is valid for user space access.
       7             :  * These definitions work on most architectures, but overrides can
       8             :  * be used where necessary.
       9             :  */
      10             : 
      11             : /*
      12             :  * architectures with compat tasks have a variable TASK_SIZE and should
      13             :  * override this to a constant.
      14             :  */
      15             : #ifndef TASK_SIZE_MAX
      16             : #define TASK_SIZE_MAX                   TASK_SIZE
      17             : #endif
      18             : 
      19             : #ifndef __access_ok
      20             : /*
      21             :  * 'size' is a compile-time constant for most callers, so optimize for
      22             :  * this case to turn the check into a single comparison against a constant
      23             :  * limit and catch all possible overflows.
      24             :  * On architectures with separate user address space (m68k, s390, parisc,
      25             :  * sparc64) or those without an MMU, this should always return true.
      26             :  *
      27             :  * This version was originally contributed by Jonas Bonn for the
      28             :  * OpenRISC architecture, and was found to be the most efficient
      29             :  * for constant 'size' and 'limit' values.
      30             :  */
      31             : static inline int __access_ok(const void __user *ptr, unsigned long size)
      32             : {
      33 >22573*10^7 :         unsigned long limit = TASK_SIZE_MAX;
      34 >22573*10^7 :         unsigned long addr = (unsigned long)ptr;
      35             : 
      36 >22573*10^7 :         if (IS_ENABLED(CONFIG_ALTERNATE_USER_ADDRESS_SPACE) ||
      37             :             !IS_ENABLED(CONFIG_MMU))
      38             :                 return true;
      39             : 
      40 >22573*10^7 :         return (size <= limit) && (addr <= (limit - size));
      41             : }
      42             : #endif
      43             : 
      44             : #ifndef access_ok
      45             : #define access_ok(addr, size) likely(__access_ok(addr, size))
      46             : #endif
      47             : 
      48             : #endif

Generated by: LCOV version 1.14