4c8a62c939
[ Upstream commit 5967577231
]
Misuse of CONFIG_* in UAPI headers should result in an error. These config
options can be set in userspace by the user application which includes
these headers to control the APIs and structures being used in a kernel
which supports multiple targets.
Signed-off-by: Siddharth Gupta <sidgup@codeaurora.org>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
119 lines
3.6 KiB
Bash
Executable File
119 lines
3.6 KiB
Bash
Executable File
#!/bin/sh
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
|
|
if [ $# -ne 2 ]
|
|
then
|
|
echo "Usage: headers_install.sh INFILE OUTFILE"
|
|
echo
|
|
echo "Prepares kernel header files for use by user space, by removing"
|
|
echo "all compiler.h definitions and #includes, removing any"
|
|
echo "#ifdef __KERNEL__ sections, and putting __underscores__ around"
|
|
echo "asm/inline/volatile keywords."
|
|
echo
|
|
echo "INFILE: header file to operate on"
|
|
echo "OUTFILE: output file which the processed header is writen to"
|
|
|
|
exit 1
|
|
fi
|
|
|
|
# Grab arguments
|
|
INFILE=$1
|
|
OUTFILE=$2
|
|
TMPFILE=$OUTFILE.tmp
|
|
|
|
trap 'rm -f $OUTFILE $TMPFILE' EXIT
|
|
|
|
# SPDX-License-Identifier with GPL variants must have "WITH Linux-syscall-note"
|
|
if [ -n "$(sed -n -e "/SPDX-License-Identifier:.*GPL-/{/WITH Linux-syscall-note/!p}" $INFILE)" ]; then
|
|
echo "error: $INFILE: missing \"WITH Linux-syscall-note\" for SPDX-License-Identifier" >&2
|
|
exit 1
|
|
fi
|
|
|
|
sed -E -e '
|
|
s/([[:space:](])(__user|__force|__iomem)[[:space:]]/\1/g
|
|
s/__attribute_const__([[:space:]]|$)/\1/g
|
|
s@^#include <linux/compiler(|_types).h>@@
|
|
s/(^|[^a-zA-Z0-9])__packed([^a-zA-Z0-9_]|$)/\1__attribute__((packed))\2/g
|
|
s/(^|[[:space:](])(inline|asm|volatile)([[:space:](]|$)/\1__\2__\3/g
|
|
s@#(ifndef|define|endif[[:space:]]*/[*])[[:space:]]*_UAPI@#\1 @
|
|
' $INFILE > $TMPFILE || exit 1
|
|
|
|
scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__ $TMPFILE > $OUTFILE
|
|
[ $? -gt 1 ] && exit 1
|
|
|
|
# Remove /* ... */ style comments, and find CONFIG_ references in code
|
|
configs=$(sed -e '
|
|
:comment
|
|
s:/\*[^*][^*]*:/*:
|
|
s:/\*\*\**\([^/]\):/*\1:
|
|
t comment
|
|
s:/\*\*/: :
|
|
t comment
|
|
/\/\*/! b check
|
|
N
|
|
b comment
|
|
:print
|
|
P
|
|
D
|
|
:check
|
|
s:^\(CONFIG_[[:alnum:]_]*\):\1\n:
|
|
t print
|
|
s:^[[:alnum:]_][[:alnum:]_]*::
|
|
s:^[^[:alnum:]_][^[:alnum:]_]*::
|
|
t check
|
|
d
|
|
' $OUTFILE)
|
|
|
|
# The entries in the following list do not result in an error.
|
|
# Please do not add a new entry. This list is only for existing ones.
|
|
# The list will be reduced gradually, and deleted eventually. (hopefully)
|
|
#
|
|
# The format is <file-name>:<CONFIG-option> in each line.
|
|
config_leak_ignores="
|
|
arch/alpha/include/uapi/asm/setup.h:CONFIG_ALPHA_LEGACY_START_ADDRESS
|
|
arch/arc/include/uapi/asm/page.h:CONFIG_ARC_PAGE_SIZE_16K
|
|
arch/arc/include/uapi/asm/page.h:CONFIG_ARC_PAGE_SIZE_4K
|
|
arch/arc/include/uapi/asm/swab.h:CONFIG_ARC_HAS_SWAPE
|
|
arch/arm/include/uapi/asm/ptrace.h:CONFIG_CPU_ENDIAN_BE8
|
|
arch/hexagon/include/uapi/asm/ptrace.h:CONFIG_HEXAGON_ARCH_VERSION
|
|
arch/hexagon/include/uapi/asm/user.h:CONFIG_HEXAGON_ARCH_VERSION
|
|
arch/ia64/include/uapi/asm/cmpxchg.h:CONFIG_IA64_DEBUG_CMPXCHG
|
|
arch/m68k/include/uapi/asm/ptrace.h:CONFIG_COLDFIRE
|
|
arch/nios2/include/uapi/asm/swab.h:CONFIG_NIOS2_CI_SWAB_NO
|
|
arch/nios2/include/uapi/asm/swab.h:CONFIG_NIOS2_CI_SWAB_SUPPORT
|
|
arch/sh/include/uapi/asm/ptrace.h:CONFIG_CPU_SH5
|
|
arch/sh/include/uapi/asm/sigcontext.h:CONFIG_CPU_SH5
|
|
arch/sh/include/uapi/asm/stat.h:CONFIG_CPU_SH5
|
|
arch/x86/include/uapi/asm/auxvec.h:CONFIG_IA32_EMULATION
|
|
arch/x86/include/uapi/asm/auxvec.h:CONFIG_X86_64
|
|
arch/x86/include/uapi/asm/mman.h:CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS
|
|
include/uapi/asm-generic/fcntl.h:CONFIG_64BIT
|
|
include/uapi/linux/atmdev.h:CONFIG_COMPAT
|
|
include/uapi/linux/elfcore.h:CONFIG_BINFMT_ELF_FDPIC
|
|
include/uapi/linux/eventpoll.h:CONFIG_PM_SLEEP
|
|
include/uapi/linux/hw_breakpoint.h:CONFIG_HAVE_MIXED_BREAKPOINTS_REGS
|
|
include/uapi/linux/pktcdvd.h:CONFIG_CDROM_PKTCDVD_WCACHE
|
|
include/uapi/linux/raw.h:CONFIG_MAX_RAW_DEVS
|
|
"
|
|
|
|
for c in $configs
|
|
do
|
|
leak_error=1
|
|
|
|
for ignore in $config_leak_ignores
|
|
do
|
|
if echo "$INFILE:$c" | grep -q "$ignore$"; then
|
|
leak_error=
|
|
break
|
|
fi
|
|
done
|
|
|
|
if [ "$leak_error" = 1 ]; then
|
|
echo "error: $INFILE: leak $c to user-space" >&2
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
rm -f $TMPFILE
|
|
trap - EXIT
|