scripts/headers_check.pl can detect references to CONFIG options in exported headers, but it has been disabled for more than a decade. Reverting commit 7e3fa5614117 ("kbuild: drop check for CONFIG_ in headers_check") would emit the following warnings for headers_check on x86: usr/include/mtd/ubi-user.h:283: leaks CONFIG_MTD_UBI_BEB_LIMIT to userspace where it is not valid usr/include/linux/cm4000_cs.h:26: leaks CONFIG_COMPAT to userspace where it is not valid usr/include/linux/pkt_cls.h:301: leaks CONFIG_NET_CLS_ACT to userspace where it is not valid usr/include/linux/videodev2.h:2465: leaks CONFIG_VIDEO_ADV_DEBUG to userspace where it is not valid usr/include/linux/bpf.h:249: leaks CONFIG_EFFICIENT_UNALIGNED_ACCESS to userspace where it is not valid usr/include/linux/bpf.h:819: leaks CONFIG_CGROUP_NET_CLASSID to userspace where it is not valid usr/include/linux/bpf.h:1011: leaks CONFIG_IP_ROUTE_CLASSID to userspace where it is not valid usr/include/linux/bpf.h:1742: leaks CONFIG_BPF_KPROBE_OVERRIDE to userspace where it is not valid usr/include/linux/bpf.h:1747: leaks CONFIG_FUNCTION_ERROR_INJECTION to userspace where it is not valid usr/include/linux/bpf.h:1936: leaks CONFIG_XFRM to userspace where it is not valid usr/include/linux/bpf.h:2184: leaks CONFIG_BPF_LIRC_MODE2 to userspace where it is not valid usr/include/linux/bpf.h:2210: leaks CONFIG_BPF_LIRC_MODE2 to userspace where it is not valid usr/include/linux/bpf.h:2227: leaks CONFIG_SOCK_CGROUP_DATA to userspace where it is not valid usr/include/linux/bpf.h:2311: leaks CONFIG_NET to userspace where it is not valid usr/include/linux/bpf.h:2348: leaks CONFIG_NET to userspace where it is not valid usr/include/linux/bpf.h:2422: leaks CONFIG_BPF_LIRC_MODE2 to userspace where it is not valid usr/include/linux/bpf.h:2528: leaks CONFIG_NET to userspace where it is not valid usr/include/linux/pktcdvd.h:37: leaks CONFIG_CDROM_PKTCDVD_WCACHE to userspace where it is not valid usr/include/linux/hw_breakpoint.h:27: leaks CONFIG_HAVE_MIXED_BREAKPOINTS_REGS to userspace where it is not valid usr/include/linux/raw.h:17: leaks CONFIG_MAX_RAW_DEVS to userspace where it is not valid usr/include/linux/elfcore.h:62: leaks CONFIG_BINFMT_ELF_FDPIC to userspace where it is not valid usr/include/linux/eventpoll.h:82: leaks CONFIG_PM_SLEEP to userspace where it is not valid usr/include/linux/atmdev.h:104: leaks CONFIG_COMPAT to userspace where it is not valid usr/include/asm-generic/unistd.h:651: leaks CONFIG_MMU to userspace where it is not valid usr/include/asm-generic/bitsperlong.h:9: leaks CONFIG_64BIT to userspace where it is not valid usr/include/asm-generic/fcntl.h:119: leaks CONFIG_64BIT to userspace where it is not valid usr/include/asm/auxvec.h:14: leaks CONFIG_IA32_EMULATION to userspace where it is not valid usr/include/asm/e820.h:14: leaks CONFIG_NODES_SHIFT to userspace where it is not valid usr/include/asm/e820.h:39: leaks CONFIG_X86_PMEM_LEGACY to userspace where it is not valid usr/include/asm/e820.h:49: leaks CONFIG_INTEL_TXT to userspace where it is not valid usr/include/asm/mman.h:7: leaks CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS to userspace where it is not valid Most of these are false positives because scripts/headers_check.pl parses comment lines. It is also false negative. arch/x86/include/uapi/asm/auxvec.h contains CONFIG_IA32_EMULATION and CONFIG_X86_64, but the only former is reported. It would be possible to fix scripts/headers_check.pl, of course. However, we already have some duplicated checks between headers_check and CONFIG_UAPI_HEADER_TEST. At this moment of time, there are still dozens of headers excluded from the header test (usr/include/Makefile), but we might be able to remove headers_check eventually. I re-implemented it in scripts/headers_install.sh by using sed because the most of code in scripts/headers_install.sh is written in sed. This patch works like this: [1] Run scripts/unifdef first because we need to drop the code surrounded by #ifdef __KERNEL__ ... #endif [2] Remove all C style comments. The sed code is somewhat complicated since we need to deal with both single and multi line comments. Precisely speaking, a comment block is replaced with a space just in case. CONFIG_FOO/* this is a comment */CONFIG_BAR should be converted into: CONFIG_FOO CONFIG_BAR instead of: CONFIG_FOOCONFIG_BAR [3] Match CONFIG_... pattern. It correctly matches to all CONFIG options that appear in a single line. After this commit, this would detect the following warnings, all of which are real ones. warning: include/uapi/linux/pktcdvd.h: leak CONFIG_CDROM_PKTCDVD_WCACHE to user-space warning: include/uapi/linux/hw_breakpoint.h: leak CONFIG_HAVE_MIXED_BREAKPOINTS_REGS to user-space warning: include/uapi/linux/raw.h: leak CONFIG_MAX_RAW_DEVS to user-space warning: include/uapi/linux/elfcore.h: leak CONFIG_BINFMT_ELF_FDPIC to user-space warning: include/uapi/linux/eventpoll.h: leak CONFIG_PM_SLEEP to user-space warning: include/uapi/linux/atmdev.h: leak CONFIG_COMPAT to user-space warning: include/uapi/asm-generic/fcntl.h: leak CONFIG_64BIT to user-space warning: arch/x86/include/uapi/asm/auxvec.h: leak CONFIG_IA32_EMULATION to user-space warning: arch/x86/include/uapi/asm/auxvec.h: leak CONFIG_X86_64 to user-space warning: arch/x86/include/uapi/asm/mman.h: leak CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS to user-space However, it is not nice to show them right now. I created a list of existing leakages. They are not warned, but a new leakage will be blocked by the 0-day bot.
Showing the changes to scripts (1 of 1 file). Show all
Unified · Split
| @@ -41,5 +41,77 @@ sed -E -e ' · 40 unmodified lines | ||
| 41 | 41 | scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__ $TMPFILE > $OUTFILE |
| 42 | 42 | [ $? -gt 1 ] && exit 1 |
| 43 | 43 | |
| 44 | +# Remove /* ... */ style comments, and find CONFIG_ references in code | |
| 45 | +configs=$(sed -e ' | |
| 46 | +:comment | |
| 47 | + s:/\*[^*][^*]*:/*: | |
| 48 | + s:/\*\*\**\([^/]\):/*\1: | |
| 49 | + t comment | |
| 50 | + s:/\*\*/: : | |
| 51 | + t comment | |
| 52 | + /\/\*/! b check | |
| 53 | + N | |
| 54 | + b comment | |
| 55 | ||
| 56 | + P | |
| 57 | + D | |
| 58 | +:check | |
| 59 | + s:^\(CONFIG_[[:alnum:]_]*\):\1\n: | |
| 60 | + t print | |
| 61 | + s:^[[:alnum:]_][[:alnum:]_]*:: | |
| 62 | + s:^[^[:alnum:]_][^[:alnum:]_]*:: | |
| 63 | + t check | |
| 64 | + d | |
| 65 | +' $OUTFILE) | |
| 66 | + | |
| 67 | +# The entries in the following list are not warned. | |
| 68 | +# Please do not add a new entry. This list is only for existing ones. | |
| 69 | +# The list will be reduced gradually, and deleted eventually. (hopefully) | |
| 70 | +# | |
| 71 | +# The format is <file-name>:<CONFIG-option> in each line. | |
| 72 | +config_leak_ignores=" | |
| 73 | +arch/alpha/include/uapi/asm/setup.h:CONFIG_ALPHA_LEGACY_START_ADDRESS | |
| 74 | +arch/arc/include/uapi/asm/page.h:CONFIG_ARC_PAGE_SIZE_16K | |
| 75 | +arch/arc/include/uapi/asm/page.h:CONFIG_ARC_PAGE_SIZE_4K | |
| 76 | +arch/arc/include/uapi/asm/swab.h:CONFIG_ARC_HAS_SWAPE | |
| 77 | +arch/arm/include/uapi/asm/ptrace.h:CONFIG_CPU_ENDIAN_BE8 | |
| 78 | +arch/hexagon/include/uapi/asm/ptrace.h:CONFIG_HEXAGON_ARCH_VERSION | |
| 79 | +arch/hexagon/include/uapi/asm/user.h:CONFIG_HEXAGON_ARCH_VERSION | |
| 80 | +arch/ia64/include/uapi/asm/cmpxchg.h:CONFIG_IA64_DEBUG_CMPXCHG | |
| 81 | +arch/m68k/include/uapi/asm/ptrace.h:CONFIG_COLDFIRE | |
| 82 | +arch/nios2/include/uapi/asm/swab.h:CONFIG_NIOS2_CI_SWAB_NO | |
| 83 | +arch/nios2/include/uapi/asm/swab.h:CONFIG_NIOS2_CI_SWAB_SUPPORT | |
| 84 | +arch/sh/include/uapi/asm/ptrace.h:CONFIG_CPU_SH5 | |
| 85 | +arch/sh/include/uapi/asm/sigcontext.h:CONFIG_CPU_SH5 | |
| 86 | +arch/sh/include/uapi/asm/stat.h:CONFIG_CPU_SH5 | |
| 87 | +arch/x86/include/uapi/asm/auxvec.h:CONFIG_IA32_EMULATION | |
| 88 | +arch/x86/include/uapi/asm/auxvec.h:CONFIG_X86_64 | |
| 89 | +arch/x86/include/uapi/asm/mman.h:CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS | |
| 90 | +include/uapi/asm-generic/fcntl.h:CONFIG_64BIT | |
| 91 | +include/uapi/linux/atmdev.h:CONFIG_COMPAT | |
| 92 | +include/uapi/linux/elfcore.h:CONFIG_BINFMT_ELF_FDPIC | |
| 93 | +include/uapi/linux/eventpoll.h:CONFIG_PM_SLEEP | |
| 94 | +include/uapi/linux/hw_breakpoint.h:CONFIG_HAVE_MIXED_BREAKPOINTS_REGS | |
| 95 | +include/uapi/linux/pktcdvd.h:CONFIG_CDROM_PKTCDVD_WCACHE | |
| 96 | +include/uapi/linux/raw.h:CONFIG_MAX_RAW_DEVS | |
| 97 | +" | |
| 98 | + | |
| 99 | +for c in $configs | |
| 100 | +do | |
| 101 | + warn=1 | |
| 102 | + | |
| 103 | + for ignore in $config_leak_ignores | |
| 104 | + do | |
| 105 | + if echo "$INFILE:$c" | grep -q "$ignore$"; then | |
| 106 | + warn= | |
| 107 | + break | |
| 108 | + fi | |
| 109 | + done | |
| 110 | + | |
| 111 | + if [ "$warn" = 1 ]; then | |
| 112 | + echo "warning: $INFILE: leak $c to user-space" >&2 | |
| 113 | + fi | |
| 114 | +done | |
| 115 | + | |
| 44 | 116 | rm -f $TMPFILE |
| 45 | 117 | trap - EXIT |