1c33bb0507
Historically, signal.h defines MINSIGSTKSZ (2KB) and SIGSTKSZ (8KB), for
use by all architectures with sigaltstack(2). Over time, the hardware state
size grew, but these constants did not evolve. Today, literal use of these
constants on several architectures may result in signal stack overflow, and
thus user data corruption.
A few years ago, the ARM team addressed this issue by establishing
getauxval(AT_MINSIGSTKSZ). This enables the kernel to supply a value
at runtime that is an appropriate replacement on current and future
hardware.
Add getauxval(AT_MINSIGSTKSZ) support to x86, analogous to the support
added for ARM in
94b07c1f8c
("arm64: signal: Report signal frame size to userspace via auxv").
Also, include a documentation to describe x86-specific auxiliary vectors.
Signed-off-by: Chang S. Bae <chang.seok.bae@intel.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Reviewed-by: Len Brown <len.brown@intel.com>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lkml.kernel.org/r/20210518200320.17239-4-chang.seok.bae@intel.com
54 lines
1.4 KiB
ReStructuredText
54 lines
1.4 KiB
ReStructuredText
.. SPDX-License-Identifier: GPL-2.0
|
|
|
|
==================================
|
|
x86-specific ELF Auxiliary Vectors
|
|
==================================
|
|
|
|
This document describes the semantics of the x86 auxiliary vectors.
|
|
|
|
Introduction
|
|
============
|
|
|
|
ELF Auxiliary vectors enable the kernel to efficiently provide
|
|
configuration-specific parameters to userspace. In this example, a program
|
|
allocates an alternate stack based on the kernel-provided size::
|
|
|
|
#include <sys/auxv.h>
|
|
#include <elf.h>
|
|
#include <signal.h>
|
|
#include <stdlib.h>
|
|
#include <assert.h>
|
|
#include <err.h>
|
|
|
|
#ifndef AT_MINSIGSTKSZ
|
|
#define AT_MINSIGSTKSZ 51
|
|
#endif
|
|
|
|
....
|
|
stack_t ss;
|
|
|
|
ss.ss_sp = malloc(ss.ss_size);
|
|
assert(ss.ss_sp);
|
|
|
|
ss.ss_size = getauxval(AT_MINSIGSTKSZ) + SIGSTKSZ;
|
|
ss.ss_flags = 0;
|
|
|
|
if (sigaltstack(&ss, NULL))
|
|
err(1, "sigaltstack");
|
|
|
|
|
|
The exposed auxiliary vectors
|
|
=============================
|
|
|
|
AT_SYSINFO is used for locating the vsyscall entry point. It is not
|
|
exported on 64-bit mode.
|
|
|
|
AT_SYSINFO_EHDR is the start address of the page containing the vDSO.
|
|
|
|
AT_MINSIGSTKSZ denotes the minimum stack size required by the kernel to
|
|
deliver a signal to user-space. AT_MINSIGSTKSZ comprehends the space
|
|
consumed by the kernel to accommodate the user context for the current
|
|
hardware configuration. It does not comprehend subsequent user-space stack
|
|
consumption, which must be added by the user. (e.g. Above, user-space adds
|
|
SIGSTKSZ to AT_MINSIGSTKSZ.)
|