diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2021-01-26 20:48:45 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2021-01-29 03:58:11 -0800 |
commit | 04dff6fc0d4ad44fc4491f89fed6574380b78251 (patch) | |
tree | f90662c888d04e6323ab67a8035ff42a49394425 /sysdeps/x86/tst-cet-legacy-9.c | |
parent | 6032ae6514d2c8d47246f96626b5d8adc218b92d (diff) | |
download | glibc-04dff6fc0d4ad44fc4491f89fed6574380b78251.tar.gz |
x86: Properly set usable CET feature bits [BZ #26625]
commit 94cd37ebb293321115a36a422b091fdb72d2fb08
Author: H.J. Lu <hjl.tools@gmail.com>
Date: Wed Sep 16 05:27:32 2020 -0700
x86: Use HAS_CPU_FEATURE with IBT and SHSTK [BZ #26625]
broke
GLIBC_TUNABLES=glibc.cpu.hwcaps=-IBT,-SHSTK
since it can no longer disable IBT nor SHSTK. Handle IBT and SHSTK with:
1. Revert commit 94cd37ebb293321115a36a422b091fdb72d2fb08.
2. Clears the usable CET feature bits if kernel doesn't support CET.
3. Add GLIBC_TUNABLES tests without dlopen.
4. Add tests to verify that CPU_FEATURE_USABLE on IBT and SHSTK matches
_get_ssp.
5. Update GLIBC_TUNABLES tests with dlopen to verify that CET is disabled
with GLIBC_TUNABLES.
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Diffstat (limited to 'sysdeps/x86/tst-cet-legacy-9.c')
-rw-r--r-- | sysdeps/x86/tst-cet-legacy-9.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/sysdeps/x86/tst-cet-legacy-9.c b/sysdeps/x86/tst-cet-legacy-9.c new file mode 100644 index 0000000000..2b526c9055 --- /dev/null +++ b/sysdeps/x86/tst-cet-legacy-9.c @@ -0,0 +1,41 @@ +/* Check CET compatibility with legacy JIT engine via GLIBC_TUNABLES. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + 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/>. */ + +#include <stdio.h> +#include <stdlib.h> +#include <sys/mman.h> +#include <support/test-driver.h> +#include <support/xunistd.h> + +/* Check that mmapped legacy code won't trigger segfault with + -fcf-protection and GLIBC_TUNABLES=glibc.cpu.hwcaps=-IBT,-SHSTK. */ + +static int +do_test (void) +{ + void (*funcp) (void); + funcp = xmmap (NULL, 0x1000, PROT_EXEC | PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE, -1); + printf ("mmap = %p\n", funcp); + /* Write RET instruction. */ + *(char *) funcp = 0xc3; + funcp (); + return EXIT_SUCCESS; +} + +#include <support/test-driver.c> |