[GIT PULL] siginfo updates for 4.20-rc1

From: Eric W. Biederman
Date: Mon Oct 22 2018 - 22:01:49 EST



Linus,

Please pull the siginfo-linus branch from the git tree:

git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace.git siginfo-linus

HEAD: a36700589b85443e28170be59fa11c8a104130a5 signal: Guard against negative signal numbers in copy_siginfo_from_user32

I have been slowly sorting out siginfo and this is the culmination of that work.

The primary result is in several ways the signal infrastructure has been made
less error prone. The code has been updated so that manually specifying
SEND_SIG_FORCED is never necessary. The conversion to the new siginfo sending
functions is now complete, which makes it difficult to send a signal without
filling in the proper siginfo fields.

At the tail end of the patchset comes the optimization of decreasing the size of
struct siginfo in the kernel from 128 bytes to about 48 bytes on 64bit. The
fundamental observation that enables this is by definition none of the known
ways to use struct siginfo uses the extra bytes.

This comes at the cost of a small user space observable difference. For the
rare case of siginfo being injected into the kernel only what can be copied
into kernel_siginfo is delivered to the destination, the rest of the bytes are
set to 0. For cases where the signal and the si_code are known this is safe,
because we know thos bytes are not used. For cases where the signal and si_code
combination is unknown the bits that won't fit into struct kernel_siginfo are
tested to verify they are zero, and the send fails if they are not.

I made an extensive search through userspace code and I could not find anything
that would break because of the above change. If it turns out I did break
something it will take just the revert of a single change to restore
kernel_siginfo to the same size as userspace siginfo.

Testing did reveal dependencies on preferring the signo passed to sigqueueinfo
over si->signo, so bit the bullet and added the complexity necessary to handle
that case.

Testing also revealed bad things can happen if a negative signal number is
passed into the system calls. Something no sane application will do but
something a malicious program or a fuzzer might do. So I have fixed the code
that performs the bounds checks to ensure negative signal numbers are handled.


There are minor conflicts between this tree and several other trees.
- The x86 tree
- The y2038 tree
- The arm64 tree
- The x86 tip tree

I think only the resolution of the x86 tip tree is at all difficult. None of
the conflicts are fundamental. They are all from changes to other parts of the
code that are just close enough to have context conflicts. The x86 tip tree
conflict actually involves a conflict from removing a unnecessary pkey parameter
on the siginfo side and a some small refactoring on the x86 side.

Eric W. Biederman (80):
signal: Always ignore SIGKILL and SIGSTOP sent to the global init
signal: Properly deliver SIGILL from uprobes
signal: Properly deliver SIGSEGV from x86 uprobes
signal: Always deliver the kernel's SIGKILL and SIGSTOP to a pid namespace init
signal: send_sig_all no longer needs SEND_SIG_FORCED
signal: Remove the siginfo paramater from kernel_dqueue_signal
signal: Don't send siginfo to kthreads.
signal: Never allocate siginfo for SIGKILL or SIGSTOP
signal: Use SEND_SIG_PRIV not SEND_SIG_FORCED with SIGKILL and SIGSTOP
signal: Remove SEND_SIG_FORCED
signal/GenWQE: Fix sending of SIGKILL
tty_io: Use group_send_sig_info in __do_SACK to note it is a session being killed
signal: Use group_send_sig_info to kill all processes in a pid namespace
signal: Remove specific_send_sig_info
signal: Pair exports with their functions
signal: Simplify tracehook_report_syscall_exit
signal/x86: Inline fill_sigtrap_info in it's only caller send_sigtrap
signal/x86: Move MCE error reporting out of force_sig_info_fault
signal/x86: Use send_sig_mceerr as apropriate
signal/x86: In trace_mpx_bounds_register_exception add __user annotations
signal/x86: Move mpx siginfo generation into do_bounds
signal/x86/traps: Factor out show_signal
signal/x86/traps: Move more code into do_trap_no_signal so it can be reused
signal/x86/traps: Use force_sig_bnderr
signal/x86/traps: Use force_sig instead of open coding it.
signal/x86/traps: Simplify trap generation
signal/x86: Remove pkey parameter from bad_area_nosemaphore
signal/x86: Remove the pkey parameter from do_sigbus
signal/x86: Remove pkey parameter from mm_fault_error
signal/x86: Don't compute pkey in __do_page_fault
signal/x86: Pass pkey not vma into __bad_area
signal/x86: Call force_sig_pkuerr from __bad_area_nosemaphore
signal/x86: Replace force_sig_info_fault with force_sig_fault
signal/x86: Pass pkey by value
signal/x86: Use force_sig_fault where appropriate
signal/powerpc: Use force_sig_mceerr as appropriate
signal/powerpc: Remove pkey parameter from __bad_area
signal/powerpc: Call _exception_pkey directly from bad_key_fault_exception
signal/powerpc: Remove pkey parameter from __bad_area_nosemaphore
signal/powerpc: Factor the common exception code into exception_common
signal/powerpc: Call force_sig_fault from _exception
signal/powerpc: Specialize _exception_pkey for handling pkey exceptions
signal/powerpc: Simplify _exception_pkey by using force_sig_pkuerr
signal/powerpc: Use force_sig_fault where appropriate
signal/arm64: Push siginfo generation into arm64_notify_die
signal/arm64: Remove unneeded tsk parameter from arm64_force_sig_info
signal/arm64: Factor out arm64_show_signal from arm64_force_sig_info
signal/arm64: Factor set_thread_esr out of __do_user_fault
signal/arm64: Consolidate the two hwpoison cases in do_page_fault
signal/arm64: For clarity separate the 3 signal sending cases in do_page_fault
signal/arm64: Expand __do_user_fault and remove it
signal/arm64: Only perform one esr_to_fault_info call in do_page_fault
signal/arm64: Only call set_thread_esr once in do_page_fault
signal/arm64: Add and use arm64_force_sig_fault where appropriate
signal/arm64: Add and use arm64_force_sig_mceerr as appropriate
signal/arm64: Remove arm64_force_sig_info
signal/arm64: In ptrace_hbptriggered name the signal description string
signal/arm64: Add and use arm64_force_sig_ptrace_errno_trap
signal/arm64: Use send_sig_fault where appropriate
signal/arm: Push siginfo generation into arm_notify_die
signal/arm: Use force_sig_fault where appropriate
signal/arm: Use send_sig_fault where appropriate
signal/arm/kvm: Use send_sig_mceerr
signal/ia64: Use the generic force_sigsegv in setup_frame
signal/ia64: Use the force_sig(SIGSEGV,...) in ia64_rt_sigreturn
signal/ia64: Use force_sig_fault where appropriate
signal/arc: Push siginfo generation into unhandled_exception
signal/arc: Use force_sig_fault where appropriate
signal/unicore32: Use send_sig_fault where appropriate
signal/unicore32: Generate siginfo in ucs32_notify_die
signal/unicore32: Use force_sig_fault where appropriate
signal/sparc: Move EMT_TAGOVF into the generic siginfo.h
signal: Fail sigqueueinfo if si_signo != sig
signal: Remove the need for __ARCH_SI_PREABLE_SIZE and SI_PAD_SIZE
signal: Introduce copy_siginfo_from_user and use it's return value
signal: Distinguish between kernel_siginfo and siginfo
signal: Use a smaller struct siginfo in the kernel
signal: In sigqueueinfo prefer sig not si_signo
signal: Guard against negative signal numbers in copy_siginfo_from_user
signal: Guard against negative signal numbers in copy_siginfo_from_user32

arch/alpha/include/uapi/asm/siginfo.h | 1 -
arch/arc/kernel/traps.c | 22 +-
arch/arc/mm/fault.c | 20 +-
arch/arm/include/asm/bug.h | 4 +-
arch/arm/kernel/ptrace.c | 11 +-
arch/arm/kernel/swp_emulate.c | 16 +-
arch/arm/kernel/traps.c | 63 ++--
arch/arm/mm/alignment.c | 10 +-
arch/arm/mm/fault.c | 28 +-
arch/arm/vfp/vfpmodule.c | 11 +-
arch/arm64/include/asm/system_misc.h | 3 +-
arch/arm64/include/asm/traps.h | 5 +-
arch/arm64/include/uapi/asm/Kbuild | 1 +
arch/arm64/include/uapi/asm/siginfo.h | 24 --
arch/arm64/kernel/debug-monitors.c | 11 +-
arch/arm64/kernel/fpsimd.c | 10 +-
arch/arm64/kernel/ptrace.c | 16 +-
arch/arm64/kernel/sys_compat.c | 13 +-
arch/arm64/kernel/traps.c | 67 ++---
arch/arm64/mm/fault.c | 94 +++---
arch/ia64/include/uapi/asm/siginfo.h | 2 -
arch/ia64/kernel/brl_emu.c | 31 +-
arch/ia64/kernel/signal.c | 60 +---
arch/ia64/kernel/traps.c | 144 +++------
arch/ia64/kernel/unaligned.c | 12 +-
arch/ia64/mm/fault.c | 12 +-
arch/mips/include/uapi/asm/siginfo.h | 11 -
arch/parisc/include/uapi/asm/Kbuild | 1 +
arch/parisc/include/uapi/asm/siginfo.h | 11 -
arch/powerpc/include/asm/bug.h | 2 +-
arch/powerpc/include/asm/ptrace.h | 2 +-
arch/powerpc/include/uapi/asm/Kbuild | 1 +
arch/powerpc/include/uapi/asm/siginfo.h | 18 --
arch/powerpc/kernel/process.c | 9 +-
arch/powerpc/kernel/traps.c | 34 +--
arch/powerpc/mm/fault.c | 55 ++--
arch/powerpc/platforms/cell/spu_base.c | 4 +-
arch/powerpc/platforms/cell/spufs/fault.c | 26 +-
arch/riscv/include/uapi/asm/Kbuild | 1 +
arch/riscv/include/uapi/asm/siginfo.h | 24 --
arch/s390/include/uapi/asm/Kbuild | 1 +
arch/s390/include/uapi/asm/siginfo.h | 17 --
arch/sparc/include/uapi/asm/siginfo.h | 7 -
arch/unicore32/include/asm/bug.h | 3 +-
arch/unicore32/kernel/fpu-ucf64.c | 12 +-
arch/unicore32/kernel/traps.c | 5 +-
arch/unicore32/mm/fault.c | 27 +-
arch/x86/entry/vsyscall/vsyscall_64.c | 9 +-
arch/x86/include/asm/compat.h | 2 +-
arch/x86/include/asm/mpx.h | 12 +-
arch/x86/include/asm/ptrace.h | 2 +-
arch/x86/include/asm/trace/mpx.h | 4 +-
arch/x86/include/uapi/asm/siginfo.h | 2 -
arch/x86/kernel/ptrace.c | 29 +-
arch/x86/kernel/traps.c | 176 +++++------
arch/x86/kernel/umip.c | 8 +-
arch/x86/kernel/uprobes.c | 2 +-
arch/x86/kvm/mmu.c | 11 +-
arch/x86/mm/fault.c | 167 ++++-------
arch/x86/mm/mpx.c | 30 +-
drivers/misc/genwqe/card_base.h | 2 +-
drivers/misc/genwqe/card_dev.c | 9 +-
drivers/tty/sysrq.c | 2 +-
drivers/tty/tty_io.c | 6 +-
drivers/usb/core/devio.c | 4 +-
drivers/usb/gadget/function/f_mass_storage.c | 4 +-
fs/binfmt_elf.c | 6 +-
fs/coredump.c | 2 +-
fs/fcntl.c | 2 +-
fs/jffs2/background.c | 2 +-
fs/signalfd.c | 6 +-
include/linux/binfmts.h | 2 +-
include/linux/compat.h | 4 +-
include/linux/coredump.h | 4 +-
include/linux/lsm_hooks.h | 4 +-
include/linux/posix-timers.h | 2 +-
include/linux/ptrace.h | 17 +-
include/linux/sched.h | 2 +-
include/linux/sched/signal.h | 23 +-
include/linux/security.h | 6 +-
include/linux/signal.h | 18 +-
include/linux/signal_types.h | 8 +-
include/linux/tracehook.h | 13 +-
include/trace/events/signal.h | 7 +-
include/uapi/asm-generic/siginfo.h | 193 ++++++------
ipc/mqueue.c | 2 +-
kernel/events/uprobes.c | 4 +-
kernel/pid_namespace.c | 2 +-
kernel/ptrace.c | 26 +-
kernel/seccomp.c | 6 +-
kernel/signal.c | 421 +++++++++++++++++----------
kernel/time/posix-timers.c | 2 +-
mm/oom_kill.c | 4 +-
security/apparmor/lsm.c | 2 +-
security/security.c | 2 +-
security/selinux/hooks.c | 2 +-
security/smack/smack_lsm.c | 2 +-
virt/kvm/arm/mmu.c | 14 +-
98 files changed, 925 insertions(+), 1328 deletions(-)