summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Syromyatnikov <evgsyr@gmail.com>2021-08-07 17:58:56 +0200
committerDmitry V. Levin <ldv@strace.io>2021-08-14 01:25:12 +0000
commita00dd88a530376de8dc7eeb65460c0e7208b2a8d (patch)
tree9769a2484b49839549d53a6728517c16c555fcbe
parent7dd19ca64a6bb8a0dc805a9984a36c6b17f65885 (diff)
downloadstrace-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.c25
-rw-r--r--src/xlat/pr_pac_enabled_keys.in5
-rw-r--r--src/xlat/pr_pac_keys.in4
-rw-r--r--tests/.gitignore8
-rw-r--r--tests/Makefile.am4
-rw-r--r--tests/gen_tests.in8
-rw-r--r--tests/prctl-pac-enabled-keys-Xabbrev.c2
-rw-r--r--tests/prctl-pac-enabled-keys-Xraw.c2
-rw-r--r--tests/prctl-pac-enabled-keys-Xverbose.c2
-rw-r--r--tests/prctl-pac-enabled-keys-success-Xabbrev.c2
-rw-r--r--tests/prctl-pac-enabled-keys-success-Xraw.c2
-rw-r--r--tests/prctl-pac-enabled-keys-success-Xverbose.c2
-rw-r--r--tests/prctl-pac-enabled-keys-success.c2
-rw-r--r--tests/prctl-pac-enabled-keys.c133
-rwxr-xr-xtests/pure_executables.list4
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