mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-05 03:01:05 +00:00
238032ead6
There are several compiler implementations that allow large stack allocations to jump over the guard page at the end of the stack and corrupt memory beyond that. See CVE-2017-1000364. Compilers can emit code to probe the stack such that the guard page cannot be skipped, but on aarch64 the probe interval is 64K by default instead of the minimum supported page size (4K). This patch enforces at least 64K guard on aarch64 unless the guard is disabled by setting its size to 0. For backward compatibility reasons the increased guard is not reported, so it is only observable by exhausting the address space or parsing /proc/self/maps on linux. On other targets the patch has no effect. If the stack probe interval is larger than a page size on a target then ARCH_MIN_GUARD_SIZE can be defined to get large enough stack guard on libc allocated stacks. The patch does not affect threads with user allocated stacks. Fixes bug 26691.
48 lines
1.8 KiB
C
48 lines
1.8 KiB
C
/* Copyright (C) 2002-2020 Free Software Foundation, Inc.
|
|
This file is part of the GNU C Library.
|
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
The GNU C Library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with the GNU C Library; if not, see
|
|
<https://www.gnu.org/licenses/>. */
|
|
|
|
/* Default stack size. */
|
|
#define ARCH_STACK_DEFAULT_SIZE (2 * 1024 * 1024)
|
|
|
|
/* Minimum guard size. */
|
|
#define ARCH_MIN_GUARD_SIZE 0
|
|
|
|
/* Required stack pointer alignment at beginning. SSE requires 16
|
|
bytes. */
|
|
#define STACK_ALIGN 16
|
|
|
|
/* Minimal stack size after allocating thread descriptor and guard size. */
|
|
#define MINIMAL_REST_STACK 2048
|
|
|
|
/* Alignment requirement for TCB.
|
|
|
|
We need to store post-AVX vector registers in the TCB and we want the
|
|
storage to be aligned to at least 32 bytes.
|
|
|
|
Some processors such as Intel Atom pay a big penalty on every
|
|
access using a segment override if that segment's base is not
|
|
aligned to the size of a cache line. (See Intel 64 and IA-32
|
|
Architectures Optimization Reference Manual, section 13.3.3.3,
|
|
"Segment Base".) On such machines, a cache line is 64 bytes. */
|
|
#define TCB_ALIGNMENT 64
|
|
|
|
|
|
/* Location of current stack frame. The frame pointer is not usable. */
|
|
#define CURRENT_STACK_FRAME \
|
|
({ register char *frame __asm__("rsp"); frame; })
|