diff options
author | Eugene Syromyatnikov <evgsyr@gmail.com> | 2021-08-07 17:58:56 +0200 |
---|---|---|
committer | Dmitry V. Levin <ldv@strace.io> | 2021-08-14 01:25:12 +0000 |
commit | a00dd88a530376de8dc7eeb65460c0e7208b2a8d (patch) | |
tree | 9769a2484b49839549d53a6728517c16c555fcbe | |
parent | 7dd19ca64a6bb8a0dc805a9984a36c6b17f65885 (diff) | |
download | strace-a00dd88a530376de8dc7eeb65460c0e7208b2a8d.tar.gz |
prctl: implement PR_PAC_[GS]ET_ENABLED_KEYS ops decoding
Introduced by Linux commit v5.13-rc1~17^2~18^2~1.
* src/xlat/pr_pac_enabled_keys.in: New file.
* src/xlat/pr_pac_keys.in (PR_PAC_APIAKEY, PR_PAC_APIBKEY,
PR_PAC_APDAKEY, PR_PAC_APDBKEY): Remove entries that moved
to src/xlat/pr_pac_enabled_keys.in.
* src/prctl.c: Include "xlat/pr_pac_enabled_keys.h".
(SYS_FUNC(prctl)) <case PR_PAC_SET_ENABLED_KEYS, case PR_PAC_GET_ENABLED_KEYS>:
Implement decoding.
(SYS_FUNC(prctl)) <case PR_PAC_RESET_KEYS>: Call printflags_ex with both
pr_pac_enabled_keys and pr_pac_keys.
* tests/.gitignore: Add prctl-pac-enabled-keys, prctl-pac-enabled-keys-Xabbrev,
prctl-pac-enabled-keys-Xraw, prctl-pac-enabled-keys-Xverbose,
prctl-pac-enabled-keys-success, prctl-pac-enabled-keys-success-Xabbrev,
prctl-pac-enabled-keys-success-Xraw,
and prctl-pac-enabled-keys-success-Xverbose.
* tests/Makefile.am (check_PROGRAMS): Add prctl-pac-enabled-keys-success,
prctl-pac-enabled-keys-success-Xabbrev,
prctl-pac-enabled-keys-success-Xraw,
and prctl-pac-enabled-keys-success-Xverbose.
* tests/prctl-pac-enabled-keys-Xabbrev.c: New file.
* tests/prctl-pac-enabled-keys-Xraw.c: Likewise.
* tests/prctl-pac-enabled-keys-Xverbose.c: Likewise.
* tests/prctl-pac-enabled-keys-success-Xabbrev.c: Likewise.
* tests/prctl-pac-enabled-keys-success-Xraw.c: Likewise.
* tests/prctl-pac-enabled-keys-success-Xverbose.c: Likewise.
* tests/prctl-pac-enabled-keys-success.c: Likewise.
* tests/prctl-pac-enabled-keys.c: Likewise.
* tests/gen_tests.in (prctl-pac-enabled-keys, prctl-pac-enabled-keys-Xabbrev,
prctl-pac-enabled-keys-Xraw, prctl-pac-enabled-keys-Xverbose,
prctl-pac-enabled-keys-success, prctl-pac-enabled-keys-success-Xabbrev,
prctl-pac-enabled-keys-success-Xraw, prctl-pac-enabled-keys-success-Xverbose):
New tests.
* tests/pure_executables.list: Add prctl-pac-enabled-keys,
prctl-pac-enabled-keys-Xabbrev, prctl-pac-enabled-keys-Xraw,
and prctl-pac-enabled-keys-Xverbose.
-rw-r--r-- | src/prctl.c | 25 | ||||
-rw-r--r-- | src/xlat/pr_pac_enabled_keys.in | 5 | ||||
-rw-r--r-- | src/xlat/pr_pac_keys.in | 4 | ||||
-rw-r--r-- | tests/.gitignore | 8 | ||||
-rw-r--r-- | tests/Makefile.am | 4 | ||||
-rw-r--r-- | tests/gen_tests.in | 8 | ||||
-rw-r--r-- | tests/prctl-pac-enabled-keys-Xabbrev.c | 2 | ||||
-rw-r--r-- | tests/prctl-pac-enabled-keys-Xraw.c | 2 | ||||
-rw-r--r-- | tests/prctl-pac-enabled-keys-Xverbose.c | 2 | ||||
-rw-r--r-- | tests/prctl-pac-enabled-keys-success-Xabbrev.c | 2 | ||||
-rw-r--r-- | tests/prctl-pac-enabled-keys-success-Xraw.c | 2 | ||||
-rw-r--r-- | tests/prctl-pac-enabled-keys-success-Xverbose.c | 2 | ||||
-rw-r--r-- | tests/prctl-pac-enabled-keys-success.c | 2 | ||||
-rw-r--r-- | tests/prctl-pac-enabled-keys.c | 133 | ||||
-rwxr-xr-x | tests/pure_executables.list | 4 |
15 files changed, 200 insertions, 5 deletions
diff --git a/src/prctl.c b/src/prctl.c index e530be5de..abd398b87 100644 --- a/src/prctl.c +++ b/src/prctl.c @@ -27,6 +27,7 @@ #include "xlat/pr_fp_mode.h" #include "xlat/pr_mce_kill.h" #include "xlat/pr_mce_kill_policy.h" +#include "xlat/pr_pac_enabled_keys.h" #include "xlat/pr_pac_keys.h" #include "xlat/pr_set_mm.h" #include "xlat/pr_spec_cmds.h" @@ -473,11 +474,33 @@ SYS_FUNC(prctl) case PR_PAC_RESET_KEYS: tprint_arg_next(); - printflags64(pr_pac_keys, arg2, "PR_PAC_???"); + printflags_ex(arg2, "PR_PAC_???", XLAT_STYLE_DEFAULT, + pr_pac_enabled_keys, pr_pac_keys, NULL); print_prctl_args(tcp, 2); return RVAL_DECODED; + case PR_PAC_SET_ENABLED_KEYS: + tprint_arg_next(); + printflags64(pr_pac_enabled_keys, arg2, "PR_PAC_???"); + tprint_arg_next(); + printflags64(pr_pac_enabled_keys, arg3, "PR_PAC_???"); + print_prctl_args(tcp, 3); + + return RVAL_DECODED; + + case PR_PAC_GET_ENABLED_KEYS: + if (entering(tcp)) { + print_prctl_args(tcp, 1); + return 0; + } + if (syserror(tcp)) + return 0; + tcp->auxstr = sprintflags_ex("", pr_pac_enabled_keys, + (kernel_ulong_t) tcp->u_rval, '\0', + XLAT_STYLE_DEFAULT | SPFF_AUXSTR_MODE); + return RVAL_HEX | RVAL_STR; + case PR_SET_SYSCALL_USER_DISPATCH: tprint_arg_next(); printxval64(pr_sud_cmds, arg2, "PR_SYS_DISPATCH_???"); diff --git a/src/xlat/pr_pac_enabled_keys.in b/src/xlat/pr_pac_enabled_keys.in new file mode 100644 index 000000000..fe61b3496 --- /dev/null +++ b/src/xlat/pr_pac_enabled_keys.in @@ -0,0 +1,5 @@ +#unconditional +PR_PAC_APIAKEY +PR_PAC_APIBKEY +PR_PAC_APDAKEY +PR_PAC_APDBKEY diff --git a/src/xlat/pr_pac_keys.in b/src/xlat/pr_pac_keys.in index 21543cbc7..5b96600dd 100644 --- a/src/xlat/pr_pac_keys.in +++ b/src/xlat/pr_pac_keys.in @@ -1,6 +1,2 @@ #unconditional -PR_PAC_APIAKEY -PR_PAC_APIBKEY -PR_PAC_APDAKEY -PR_PAC_APDBKEY PR_PAC_APGAKEY diff --git a/tests/.gitignore b/tests/.gitignore index 696549e0e..fd37cc375 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -618,6 +618,14 @@ prctl-fp-mode prctl-mce-kill prctl-name prctl-no-args +prctl-pac-enabled-keys +prctl-pac-enabled-keys-Xabbrev +prctl-pac-enabled-keys-Xraw +prctl-pac-enabled-keys-Xverbose +prctl-pac-enabled-keys-success +prctl-pac-enabled-keys-success-Xabbrev +prctl-pac-enabled-keys-success-Xraw +prctl-pac-enabled-keys-success-Xverbose prctl-pac-reset-keys prctl-pdeathsig prctl-seccomp-filter-v diff --git a/tests/Makefile.am b/tests/Makefile.am index 693c22377..ce3014df8 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -244,6 +244,10 @@ check_PROGRAMS = $(PURE_EXECUTABLES) \ ppoll-P \ ppoll-v \ prctl-fp-mode \ + prctl-pac-enabled-keys-success \ + prctl-pac-enabled-keys-success-Xabbrev \ + prctl-pac-enabled-keys-success-Xraw \ + prctl-pac-enabled-keys-success-Xverbose \ prctl-seccomp-filter-v \ prctl-seccomp-strict \ prctl-securebits-success \ diff --git a/tests/gen_tests.in b/tests/gen_tests.in index 5ef8479dd..c5a1fbd94 100644 --- a/tests/gen_tests.in +++ b/tests/gen_tests.in @@ -587,6 +587,14 @@ prctl-dumpable +prctl.sh -a23 prctl-mce-kill +prctl.sh -a21 prctl-name +prctl.sh -a23 prctl-no-args +prctl.sh -a21 +prctl-pac-enabled-keys +prctl.sh -a43 +prctl-pac-enabled-keys-Xabbrev +prctl.sh -a43 -Xabbrev +prctl-pac-enabled-keys-Xraw +prctl.sh -a24 -Xraw +prctl-pac-enabled-keys-Xverbose +prctl.sh -a54 -Xverbose +prctl-pac-enabled-keys-success +prctl-success.sh PRCTL_INJECT_RETVALS="0 1 30 0xbeef0" -a43 +prctl-pac-enabled-keys-success-Xabbrev +prctl-success.sh PRCTL_INJECT_RETVALS="0 1 30 0xbeef0" -a43 -Xabbrev +prctl-pac-enabled-keys-success-Xraw +prctl-success.sh PRCTL_INJECT_RETVALS="0 1 30 0xbeef0" -a24 -Xraw +prctl-pac-enabled-keys-success-Xverbose +prctl-success.sh PRCTL_INJECT_RETVALS="0 1 30 0xbeef0" -a54 -Xverbose prctl-pac-reset-keys +prctl.sh -a43 prctl-pdeathsig +prctl.sh -a30 prctl-seccomp-filter-v +prctl.sh -v diff --git a/tests/prctl-pac-enabled-keys-Xabbrev.c b/tests/prctl-pac-enabled-keys-Xabbrev.c new file mode 100644 index 000000000..571090049 --- /dev/null +++ b/tests/prctl-pac-enabled-keys-Xabbrev.c @@ -0,0 +1,2 @@ +#define XLAT_ABBREV 1 +#include "prctl-pac-enabled-keys.c" diff --git a/tests/prctl-pac-enabled-keys-Xraw.c b/tests/prctl-pac-enabled-keys-Xraw.c new file mode 100644 index 000000000..139d8adf5 --- /dev/null +++ b/tests/prctl-pac-enabled-keys-Xraw.c @@ -0,0 +1,2 @@ +#define XLAT_RAW 1 +#include "prctl-pac-enabled-keys.c" diff --git a/tests/prctl-pac-enabled-keys-Xverbose.c b/tests/prctl-pac-enabled-keys-Xverbose.c new file mode 100644 index 000000000..496b5a55a --- /dev/null +++ b/tests/prctl-pac-enabled-keys-Xverbose.c @@ -0,0 +1,2 @@ +#define XLAT_VERBOSE 1 +#include "prctl-pac-enabled-keys.c" diff --git a/tests/prctl-pac-enabled-keys-success-Xabbrev.c b/tests/prctl-pac-enabled-keys-success-Xabbrev.c new file mode 100644 index 000000000..1f22b4c92 --- /dev/null +++ b/tests/prctl-pac-enabled-keys-success-Xabbrev.c @@ -0,0 +1,2 @@ +#define XLAT_ABBREV 1 +#include "prctl-pac-enabled-keys-success.c" diff --git a/tests/prctl-pac-enabled-keys-success-Xraw.c b/tests/prctl-pac-enabled-keys-success-Xraw.c new file mode 100644 index 000000000..bcaa76a2c --- /dev/null +++ b/tests/prctl-pac-enabled-keys-success-Xraw.c @@ -0,0 +1,2 @@ +#define XLAT_RAW 1 +#include "prctl-pac-enabled-keys-success.c" diff --git a/tests/prctl-pac-enabled-keys-success-Xverbose.c b/tests/prctl-pac-enabled-keys-success-Xverbose.c new file mode 100644 index 000000000..3f01cbc85 --- /dev/null +++ b/tests/prctl-pac-enabled-keys-success-Xverbose.c @@ -0,0 +1,2 @@ +#define XLAT_VERBOSE 1 +#include "prctl-pac-enabled-keys-success.c" diff --git a/tests/prctl-pac-enabled-keys-success.c b/tests/prctl-pac-enabled-keys-success.c new file mode 100644 index 000000000..1033a32f0 --- /dev/null +++ b/tests/prctl-pac-enabled-keys-success.c @@ -0,0 +1,2 @@ +#define INJECT_RETVAL +#include "prctl-pac-enabled-keys.c" diff --git a/tests/prctl-pac-enabled-keys.c b/tests/prctl-pac-enabled-keys.c new file mode 100644 index 000000000..3f93cc777 --- /dev/null +++ b/tests/prctl-pac-enabled-keys.c @@ -0,0 +1,133 @@ +/* + * Check decoding of prctl PR_PAC_RESET_KEYS operation. + * + * Copyright (c) 2021 The strace developers. + * All rights reserved. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "tests.h" +#include "scno.h" +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <linux/prctl.h> + +#include "xlat.h" +#include "xlat/pr_pac_enabled_keys.h" + +#ifdef INJECT_RETVAL +# define INJ_STR " (INJECTED)" +#else +# define INJ_STR "" +#endif + +#define PR_PAC_ENABLE_FLAGS_MASK \ + (PR_PAC_APIAKEY|PR_PAC_APIBKEY|PR_PAC_APDAKEY|PR_PAC_APDBKEY) + +int +main(int argc, char *argv[]) +{ + syscall(__NR_prctl, -1U, (unsigned long) -2U, (unsigned long) -3U, + (unsigned long) -4U, (unsigned long) -5U); + +#ifdef INJECT_RETVAL + unsigned long num_skip; + long inject_retval; + bool locked = false; + + if (argc < 3) + error_msg_and_fail("Usage: %s NUM_SKIP INJECT_RETVAL", argv[0]); + + num_skip = strtoul(argv[1], NULL, 0); + inject_retval = strtol(argv[2], NULL, 0); + + for (size_t i = 0; i < num_skip; i++) { + long ret = syscall(__NR_prctl, -1U, (unsigned long) -2U, + (unsigned long) -3U, (unsigned long) -4U, + (unsigned long) -5U); + + if (ret != inject_retval) + continue; + + locked = true; + break; + } + + if (!locked) + error_msg_and_fail("Have not locked on prctl(-1, -2, -3, -4" + ", -5) returning %ld", inject_retval); +#endif /* INJECT_RETVAL */ + + static const struct { + kernel_ulong_t val; + const char *str; + } args[] = { + { ARG_STR(0) }, + { ARG_STR(PR_PAC_APIAKEY) }, + { ARG_STR(PR_PAC_APIBKEY|PR_PAC_APDAKEY|PR_PAC_APDBKEY|0x10) }, + { 0x7ffffff0, NVERB("0x7ffffff0 /* ") "PR_PAC_???" NVERB(" */") }, + }; + long rc; + const char *errstr; + size_t i = 0; + + for (i = 0; i < ARRAY_SIZE(args); i++) { + for (size_t j = 0; j < ARRAY_SIZE(args); j++) { + rc = syscall(__NR_prctl, PR_PAC_SET_ENABLED_KEYS, + args[i].val, args[j].val, 0, 1); + errstr = sprintrc(rc); + printf("prctl(" + XLAT_KNOWN(0x3c, "PR_PAC_SET_ENABLED_KEYS")); + if (args[i].val) { + printf(", " XLAT_FMT_LL, + XLAT_SEL((unsigned long long) args[i].val, + args[i].str)); + } else { + printf(", 0"); + } + if (args[j].val) { + printf(", " XLAT_FMT_LL, + XLAT_SEL((unsigned long long) args[j].val, + args[j].str)); + } else { + printf(", 0"); + } + printf(", 0, 0x1) = %s" INJ_STR "\n", errstr); + } + } + + rc = syscall(__NR_prctl, PR_PAC_GET_ENABLED_KEYS, 0, 0, 0, 0); + errstr = sprintrc(rc); + printf("prctl(" XLAT_KNOWN(0x3d, "PR_PAC_GET_ENABLED_KEYS") + ", 0, 0, 0, 0) = "); + + if (rc > 0) { + printf("%#lx", rc); +#if !XLAT_RAW + for (i = 0; i < ARRAY_SIZE(args); i++) { + if (!(rc & PR_PAC_ENABLE_FLAGS_MASK)) + break; + + if (args[i].val == (unsigned long) rc) { + printf(" (%s)", args[i].str); + break; + } + } + + if (i == ARRAY_SIZE(args)) { + printf(" ("); + printflags(pr_pac_enabled_keys, rc, "PR_PAC_???"); + printf(")"); + } +#endif /* !XLAT_RAW */ + puts(INJ_STR); + } else { + printf("%s" INJ_STR "\n", errstr); + } + + + puts("+++ exited with 0 +++"); + return 0; +} diff --git a/tests/pure_executables.list b/tests/pure_executables.list index ed35e3f6c..169af8e4c 100755 --- a/tests/pure_executables.list +++ b/tests/pure_executables.list @@ -466,6 +466,10 @@ prctl-dumpable prctl-mce-kill prctl-name prctl-no-args +prctl-pac-enabled-keys +prctl-pac-enabled-keys-Xabbrev +prctl-pac-enabled-keys-Xraw +prctl-pac-enabled-keys-Xverbose prctl-pac-reset-keys prctl-pdeathsig prctl-securebits |