Fix incorrect syscall name reporting in restart_syscall() on attach

* 0183-syscall-do-not-use-uninitialized-parts-of-struct-ptr.patch: New
file.
* 0184-startup_tcb-add-a-comment.patch: Likewise.
* 0185-tests-add-another-test-of-restart_syscall-decoding.patch:
Likewise.
* 0186-tests-workaround-net-yy-inet-for-new-kernels.patch: Rename
from 0001-tests-workaround-net-yy-inet-for-new-kernels.patch
to be in sync with RHEL 9, add tests-m32 and tests-mx32 hunks.
* 0187-tests-avoid-linkat-secontext_mismatch-failures-on-se.patch: New
file.
* 0188-linux-s390-get_scno.c-use-NT_S390_SYSTEM_CALL-if-gpr.patch:
Likewise.
* 0189-tests-move-k_setsockopt-definition-into-a-separate-f.patch:
Likewise.
* 0190-tests-sockopt-timestamp.c-use-k_getsockopt-and-k_set.patch:
Likewise.
* strace.spec (Patch183, Patch184, Patch185, Patch186, Patch187,
Patch188, Patch189, Patch190): New patches.
(Patch0001): Remove.
(%prep): Apply them.
(%changelog): Add a record.

Resolves: RHEL-65108
Signed-off-by: Eugene Syromiatnikov <esyr@redhat.com>
This commit is contained in:
Eugene Syromiatnikov 2024-10-31 15:08:18 +01:00
parent 4656d2c177
commit bf36fdf2da
10 changed files with 1780 additions and 58 deletions

View File

@ -1,52 +0,0 @@
From e9d784ecd3ef0c5af9f8c74a830e797d773d71cb Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@strace.io>
Date: Sun, 21 Apr 2024 08:00:00 +0000
Subject: [PATCH] tests: workaround net-yy-inet* for new kernels
Starting with Linux kernel commit v6.8-rc1~131^2~223, NETLINK_INET_DIAG
works also for bound-only sockets. As there is no easy way to tell
whether the running kernel contains that commit, the test cannot easily
predict the kernel behavior in case of sockets in bound-only state.
Workaround this by skipping the corresponding part of the test.
* tests/net-yy-inet.test: Filter out listen() calls.
* tests/net-yy-inet.c (main): Do not print expected output for listen()
syscall.
Resolves: https://github.com/strace/strace/issues/299
---
tests/net-yy-inet.c | 2 --
tests/net-yy-inet.test | 6 +++++-
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/tests/net-yy-inet.c b/tests/net-yy-inet.c
index 1a83548bf..7f8e05783 100644
--- a/tests/net-yy-inet.c
+++ b/tests/net-yy-inet.c
@@ -63,8 +63,6 @@ main(void)
if (listen(listen_fd, 1))
perror_msg_and_skip("listen");
- printf("listen(%d<" TCP_STR ":[%lu]>, 1) = 0\n",
- listen_fd, listen_inode);
memset(listen_sa, 0, sizeof(addr));
*len = sizeof(addr);
diff --git a/tests/net-yy-inet.test b/tests/net-yy-inet.test
index 9a3f851bf..d45414bcb 100755
--- a/tests/net-yy-inet.test
+++ b/tests/net-yy-inet.test
@@ -17,5 +17,9 @@ run_prog > /dev/null
run_strace -a22 -yy -eclose,network $args > "$EXP"
# Filter out close() calls made by ld.so and libc.
-sed -n '/socket/,$p' < "$LOG" > "$OUT"
+#
+# Filter out listen() call as we cannot easily predict the kernel
+# behaviour because there is no easy way to tell whether the Linux kernel
+# contains commit v6.8-rc1~131^2~223.
+sed -n '/^listen/d;/^socket/,$p' < "$LOG" > "$OUT"
match_diff "$OUT" "$EXP"
--
2.28.0

View File

@ -0,0 +1,102 @@
From c7e0ea6d712eb214dafe7e9eae57661d9a427ea7 Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@strace.io>
Date: Mon, 28 Oct 2024 08:00:00 +0000
Subject: [PATCH 183/185] syscall: do not use uninitialized parts of struct
ptrace_syscall_info
* src/syscall.c (ptrace_syscall_info_is_entry,
ptrace_syscall_info_is_exit): New functions.
(get_scno): Replace ptrace_syscall_info_is_valid() with
ptrace_syscall_info_is_entry().
(get_error): Replace ptrace_syscall_info_is_valid() with
ptrace_syscall_info_is_exit().
(get_syscall_regs): Fall back to get_regs() if strace_get_syscall_info()
succeeded but couldn't obtain the necessary data.
Resolves: https://github.com/strace/strace/issues/322
---
src/syscall.c | 40 +++++++++++++++++++++++++++++++++++-----
1 file changed, 35 insertions(+), 5 deletions(-)
diff --git a/src/syscall.c b/src/syscall.c
index a6692721a..1f4d86dc1 100644
--- a/src/syscall.c
+++ b/src/syscall.c
@@ -1082,6 +1082,21 @@ ptrace_syscall_info_is_valid(void)
ptrace_sci.op <= PTRACE_SYSCALL_INFO_SECCOMP;
}
+static bool
+ptrace_syscall_info_is_entry(void)
+{
+ return ptrace_get_syscall_info_supported &&
+ (ptrace_sci.op == PTRACE_SYSCALL_INFO_ENTRY ||
+ ptrace_sci.op == PTRACE_SYSCALL_INFO_SECCOMP);
+}
+
+static bool
+ptrace_syscall_info_is_exit(void)
+{
+ return ptrace_get_syscall_info_supported &&
+ ptrace_sci.op == PTRACE_SYSCALL_INFO_EXIT;
+}
+
#define XLAT_MACROS_ONLY
#include "xlat/nt_descriptor_types.h"
#undef XLAT_MACROS_ONLY
@@ -1376,8 +1391,23 @@ get_syscall_regs(struct tcb *tcp)
if (get_regs_error != -1)
return get_regs_error;
- if (ptrace_get_syscall_info_supported)
- return strace_get_syscall_info(tcp) ? 0 : get_regs_error;
+ if (ptrace_get_syscall_info_supported) {
+ if (!strace_get_syscall_info(tcp))
+ return get_regs_error;
+
+ if ((entering(tcp) && ptrace_syscall_info_is_entry()) ||
+ (exiting(tcp) && ptrace_syscall_info_is_exit()))
+ return 0;
+
+ /*
+ * PTRACE_GET_SYSCALL_INFO succeeded but didn't help,
+ * falling back to get_regs().
+ *
+ * This can happen when get_syscall_regs() is called
+ * from startup_tcb() via get_scno().
+ */
+ debug_func_msg("ptrace_sci.op = %d", ptrace_sci.op);
+ }
return get_regs(tcp);
}
@@ -1408,7 +1438,7 @@ get_scno(struct tcb *tcp)
if (get_syscall_regs(tcp) < 0)
return -1;
- if (ptrace_syscall_info_is_valid()) {
+ if (ptrace_syscall_info_is_entry()) {
/* Apply arch-specific workarounds. */
int rc = arch_check_scno(tcp);
if (rc != 1)
@@ -1456,7 +1486,7 @@ get_scno(struct tcb *tcp)
static int
get_syscall_args(struct tcb *tcp)
{
- if (ptrace_syscall_info_is_valid()) {
+ if (ptrace_syscall_info_is_entry()) {
const unsigned int n =
MIN(ARRAY_SIZE(tcp->u_arg),
ARRAY_SIZE(ptrace_sci.entry.args));
@@ -1507,7 +1537,7 @@ get_syscall_result(struct tcb *tcp)
static void
get_error(struct tcb *tcp, const bool check_errno)
{
- if (ptrace_syscall_info_is_valid()) {
+ if (ptrace_syscall_info_is_exit()) {
if (ptrace_sci.exit.is_error) {
tcp->u_rval = -1;
tcp->u_error = -ptrace_sci.exit.rval;
--
2.13.6

View File

@ -0,0 +1,37 @@
From 2048c136ba6edc4282dbc976c499e038d5b60c03 Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@strace.io>
Date: Mon, 28 Oct 2024 08:00:00 +0000
Subject: [PATCH 184/185] startup_tcb: add a comment
* src/strace.c (startup_tcb): Add a comment explaining why it is safe
to call get_scno().
---
src/strace.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/src/strace.c b/src/strace.c
index 45ab48c43..1a9d53bc8 100644
--- a/src/strace.c
+++ b/src/strace.c
@@ -3549,8 +3549,16 @@ startup_tcb(struct tcb *tcp)
}
}
- if ((tcp->flags & TCB_GRABBED) && (get_scno(tcp) == 1))
- tcp->s_prev_ent = tcp->s_ent;
+ if (tcp->flags & TCB_GRABBED) {
+ /*
+ * There is no guarantee the state of the tracee is such that
+ * would allow get_scno() to obtain meaningful information.
+ * However, if the tracee is not in a syscall, then the garbage
+ * obtained by get_scno() is not going to be used.
+ */
+ if (get_scno(tcp) == 1)
+ tcp->s_prev_ent = tcp->s_ent;
+ }
if (cflag) {
tcp->atime = tcp->stime;
--
2.13.6

View File

@ -0,0 +1,129 @@
From 3bf08cbb388a89014252bdfe5143324bdaa4dc46 Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@strace.io>
Date: Mon, 28 Oct 2024 08:00:00 +0000
Subject: [PATCH 185/185] tests: add another test of restart_syscall decoding
* tests/restart_syscall-p.test: New test.
* tests/restart_syscall-p.expected: New file.
* tests/Makefile.am (DECODER_TESTS): Add restart_syscall-p.test.
(check_DATA): Add restart_syscall-p.expected.
---
tests/Makefile.am | 2 ++
tests/restart_syscall-p.expected | 2 ++
tests/restart_syscall-p.test | 20 ++++++++++++++++++++
3 files changed, 24 insertions(+)
create mode 100644 tests/restart_syscall-p.expected
create mode 100755 tests/restart_syscall-p.test
Index: strace-6.7/tests/Makefile.am
===================================================================
--- strace-6.7.orig/tests/Makefile.am 2024-10-29 13:05:29.486223478 +0100
+++ strace-6.7/tests/Makefile.am 2024-10-29 13:58:46.485209167 +0100
@@ -565,6 +565,7 @@
prctl-seccomp-strict.test \
qual_fault-exit_group.test \
readv.test \
+ restart_syscall-p.test \
rt_sigaction.test \
scm_rights-fd.test \
seccomp-strict.test \
@@ -736,6 +737,7 @@
qual_inject-signal.expected \
qualify_personality_empty.in \
regex.in \
+ restart_syscall-p.expected \
rt_sigaction.awk \
sched.in \
sigaltstack.expected \
Index: strace-6.7/tests/restart_syscall-p.expected
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-6.7/tests/restart_syscall-p.expected 2024-10-29 13:58:46.485209167 +0100
@@ -0,0 +1,2 @@
+restart_syscall(<... resuming interrupted nanosleep ...>) = 0
+exit_group(0) = ?
Index: strace-6.7/tests/restart_syscall-p.test
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-6.7/tests/restart_syscall-p.test 2024-10-29 13:58:46.485209167 +0100
@@ -0,0 +1,20 @@
+#!/bin/sh
+#
+# Check restart_syscall decoding.
+#
+# Copyright (c) 2015-2024 The strace developers.
+# All rights reserved.
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+. "${srcdir=.}/init.sh"
+
+run_prog ../sleep 0
+
+../set_ptracer_any ../sleep 2 > /dev/null &
+tracee_pid=$!
+
+../sleep 1
+
+run_strace -qq -a14 -p $tracee_pid
+match_diff
Index: strace-6.7/tests-m32/Makefile.in
===================================================================
--- strace-6.7.orig/tests-m32/Makefile.in 2024-01-29 13:43:44.000000000 +0100
+++ strace-6.7/tests-m32/Makefile.in 2024-10-29 13:59:34.146652355 +0100
@@ -10531,6 +10531,7 @@
prctl-seccomp-strict.test \
qual_fault-exit_group.test \
readv.test \
+ restart_syscall-p.test \
rt_sigaction.test \
scm_rights-fd.test \
seccomp-strict.test \
@@ -10697,6 +10698,7 @@
qual_inject-signal.expected \
qualify_personality_empty.in \
regex.in \
+ restart_syscall-p.expected \
rt_sigaction.awk \
sched.in \
sigaltstack.expected \
Index: strace-6.7/tests-mx32/Makefile.in
===================================================================
--- strace-6.7.orig/tests-mx32/Makefile.in 2024-01-29 13:43:45.000000000 +0100
+++ strace-6.7/tests-mx32/Makefile.in 2024-10-29 13:59:43.762540016 +0100
@@ -10531,6 +10531,7 @@
prctl-seccomp-strict.test \
qual_fault-exit_group.test \
readv.test \
+ restart_syscall-p.test \
rt_sigaction.test \
scm_rights-fd.test \
seccomp-strict.test \
@@ -10697,6 +10698,7 @@
qual_inject-signal.expected \
qualify_personality_empty.in \
regex.in \
+ restart_syscall-p.expected \
rt_sigaction.awk \
sched.in \
sigaltstack.expected \
Index: strace-6.7/tests/Makefile.in
===================================================================
--- strace-6.7.orig/tests/Makefile.in 2024-01-29 13:43:45.000000000 +0100
+++ strace-6.7/tests/Makefile.in 2024-10-29 13:59:15.712867710 +0100
@@ -10530,6 +10530,7 @@
prctl-seccomp-strict.test \
qual_fault-exit_group.test \
readv.test \
+ restart_syscall-p.test \
rt_sigaction.test \
scm_rights-fd.test \
seccomp-strict.test \
@@ -10696,6 +10697,7 @@
qual_inject-signal.expected \
qualify_personality_empty.in \
regex.in \
+ restart_syscall-p.expected \
rt_sigaction.awk \
sched.in \
sigaltstack.expected \

View File

@ -0,0 +1,108 @@
From e9d784ecd3ef0c5af9f8c74a830e797d773d71cb Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@strace.io>
Date: Sun, 21 Apr 2024 08:00:00 +0000
Subject: [PATCH] tests: workaround net-yy-inet* for new kernels
Starting with Linux kernel commit v6.8-rc1~131^2~223, NETLINK_INET_DIAG
works also for bound-only sockets. As there is no easy way to tell
whether the running kernel contains that commit, the test cannot easily
predict the kernel behavior in case of sockets in bound-only state.
Workaround this by skipping the corresponding part of the test.
* tests/net-yy-inet.test: Filter out listen() calls.
* tests/net-yy-inet.c (main): Do not print expected output for listen()
syscall.
Resolves: https://github.com/strace/strace/issues/299
---
tests/net-yy-inet.c | 2 --
tests/net-yy-inet.test | 6 +++++-
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/tests/net-yy-inet.c b/tests/net-yy-inet.c
index 1a83548bf..7f8e05783 100644
--- a/tests/net-yy-inet.c
+++ b/tests/net-yy-inet.c
@@ -63,8 +63,6 @@ main(void)
if (listen(listen_fd, 1))
perror_msg_and_skip("listen");
- printf("listen(%d<" TCP_STR ":[%lu]>, 1) = 0\n",
- listen_fd, listen_inode);
memset(listen_sa, 0, sizeof(addr));
*len = sizeof(addr);
diff --git a/tests/net-yy-inet.test b/tests/net-yy-inet.test
index 9a3f851bf..d45414bcb 100755
--- a/tests/net-yy-inet.test
+++ b/tests/net-yy-inet.test
@@ -17,5 +17,9 @@ run_prog > /dev/null
run_strace -a22 -yy -eclose,network $args > "$EXP"
# Filter out close() calls made by ld.so and libc.
-sed -n '/socket/,$p' < "$LOG" > "$OUT"
+#
+# Filter out listen() call as we cannot easily predict the kernel
+# behaviour because there is no easy way to tell whether the Linux kernel
+# contains commit v6.8-rc1~131^2~223.
+sed -n '/^listen/d;/^socket/,$p' < "$LOG" > "$OUT"
match_diff "$OUT" "$EXP"
diff --git a/tests-m32/net-yy-inet.c b/tests-m32/net-yy-inet.c
index 1a83548bf..7f8e05783 100644
--- a/tests-m32/net-yy-inet.c
+++ b/tests-m32/net-yy-inet.c
@@ -63,8 +63,6 @@ main(void)
if (listen(listen_fd, 1))
perror_msg_and_skip("listen");
- printf("listen(%d<" TCP_STR ":[%lu]>, 1) = 0\n",
- listen_fd, listen_inode);
memset(listen_sa, 0, sizeof(addr));
*len = sizeof(addr);
diff --git a/tests-m32/net-yy-inet.test b/tests-m32/net-yy-inet.test
index 9a3f851bf..d45414bcb 100755
--- a/tests-m32/net-yy-inet.test
+++ b/tests-m32/net-yy-inet.test
@@ -17,5 +17,9 @@ run_prog > /dev/null
run_strace -a22 -yy -eclose,network $args > "$EXP"
# Filter out close() calls made by ld.so and libc.
-sed -n '/socket/,$p' < "$LOG" > "$OUT"
+#
+# Filter out listen() call as we cannot easily predict the kernel
+# behaviour because there is no easy way to tell whether the Linux kernel
+# contains commit v6.8-rc1~131^2~223.
+sed -n '/^listen/d;/^socket/,$p' < "$LOG" > "$OUT"
match_diff "$OUT" "$EXP"
diff --git a/tests-mx32/net-yy-inet.c b/tests-mx32/net-yy-inet.c
index 1a83548bf..7f8e05783 100644
--- a/tests-mx32/net-yy-inet.c
+++ b/tests-mx32/net-yy-inet.c
@@ -63,8 +63,6 @@ main(void)
if (listen(listen_fd, 1))
perror_msg_and_skip("listen");
- printf("listen(%d<" TCP_STR ":[%lu]>, 1) = 0\n",
- listen_fd, listen_inode);
memset(listen_sa, 0, sizeof(addr));
*len = sizeof(addr);
diff --git a/tests-mx32/net-yy-inet.test b/tests-mx32/net-yy-inet.test
index 9a3f851bf..d45414bcb 100755
--- a/tests-mx32/net-yy-inet.test
+++ b/tests-mx32/net-yy-inet.test
@@ -17,5 +17,9 @@ run_prog > /dev/null
run_strace -a22 -yy -eclose,network $args > "$EXP"
# Filter out close() calls made by ld.so and libc.
-sed -n '/socket/,$p' < "$LOG" > "$OUT"
+#
+# Filter out listen() call as we cannot easily predict the kernel
+# behaviour because there is no easy way to tell whether the Linux kernel
+# contains commit v6.8-rc1~131^2~223.
+sed -n '/^listen/d;/^socket/,$p' < "$LOG" > "$OUT"
match_diff "$OUT" "$EXP"
--
2.13.6

View File

@ -0,0 +1,530 @@
From 660186018897b386fb05d7951aec57a81211a1a4 Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Wed, 21 Aug 2024 15:32:42 +0200
Subject: [PATCH] tests: avoid linkat--secontext_mismatch failures on
setfilecon errors
linkat--secontext_mismatch can fail if setfilecon cannot update SELinux
context (for example, that happens when the test is run under
an unprivileged user and tries to change the type to unconfined_t).
Avoid it by actually checking the return code and skipping the test
if there are errors reported by reset_secontext_file
or update_secontext_field calls.
* tests/secontext.h: Include <errno.h>.
(reset_secontext_file, update_secontext_field): Change the return type
from void to int.
[!(TEST_SECONTEXT && HAVE_SELINUX_RUNTIME)] (reset_secontext_file,
update_secontext_field): Return -ENOSYS.
* tests/secontext.c: (reset_secontext_file): Change the return type
to int; save the setfilecon return value to ret and reset it to -errno
if the latter is non-zero; return ret.
(update_secontext_field): Change the return type to int; return -1
if ctx is NULL; save the setfilecon return value to ret and reset
it to -errno if the latter is non-zero; return ret.
* tests/linkat.c: Include "xlat.h".
(secontext_types_data, secontext_types): New constants.
(mangle_secontext_field): Store the new field value in the new variable;
store the update_secontext_field return value to the ret variable, error
and skip if it is non-zero.
(main): Error and skip if reset_secontext_file returns non-zero.
Reported-by: Edjunior Machado <emachado@redhat.com>
---
tests/linkat.c | 34 ++++++++++++++++++++++++++++++----
tests/secontext.c | 19 ++++++++++++++-----
tests/secontext.h | 14 +++++++++-----
3 files changed, 53 insertions(+), 14 deletions(-)
diff --git a/tests/linkat.c b/tests/linkat.c
index 1d0ee3c9f..832392ca0 100644
--- a/tests/linkat.c
+++ b/tests/linkat.c
@@ -19,8 +19,20 @@
#include <string.h>
#include "secontext.h"
+#include "xlat.h"
#include "xmalloc.h"
+struct xlat_data secontext_types_data[] = {
+ [SECONTEXT_USER] = XLAT_PAIR(SECONTEXT_USER, "user"),
+ [SECONTEXT_ROLE] = XLAT_PAIR(SECONTEXT_ROLE, "role"),
+ [SECONTEXT_TYPE] = XLAT_PAIR(SECONTEXT_TYPE, "type"),
+};
+struct xlat secontext_types = {
+ .data = secontext_types_data,
+ .size = ARRAY_SIZE(secontext_types_data),
+ .type = XT_INDEXED,
+};
+
static void
mangle_secontext_field(const char *path, enum secontext_field field,
const char *new_val, const char *fallback_val)
@@ -29,10 +41,18 @@ mangle_secontext_field(const char *path, enum secontext_field field,
if (!orig)
return;
- update_secontext_field(path, field,
- strcmp(new_val, orig) ? new_val : fallback_val);
+ const char *new = strcmp(new_val, orig) ? new_val : fallback_val;
free(orig);
+
+ int ret = update_secontext_field(path, field, new);
+ if (ret) {
+ error_msg_and_skip("Failed to mangle secontext %s for "
+ "'%s' to %s: %d",
+ sprintxval_abbrev(&secontext_types, field,
+ "SECONTEXT_???"),
+ path, new, ret);
+ }
}
int
@@ -103,8 +123,14 @@ main(void)
if (close(fd_sample_2))
perror_msg_and_fail("close");
- if (*sample_1_secontext && strstr(sample_1_secontext, "!!"))
- reset_secontext_file(sample_1);
+ if (*sample_1_secontext && strstr(sample_1_secontext, "!!")) {
+ int ret;
+ if ((ret = reset_secontext_file(sample_1))) {
+ errno = -ret;
+ perror_msg_and_skip("Reset secontext for '%s'",
+ sample_1);
+ }
+ }
free(sample_1_secontext);
diff --git a/tests/secontext.c b/tests/secontext.c
index 84c682869..a0463c467 100644
--- a/tests/secontext.c
+++ b/tests/secontext.c
@@ -284,14 +284,19 @@ secontext_short_pid(pid_t pid)
return FORMAT_SPACE_AFTER(raw_secontext_short_pid(pid));
}
-void reset_secontext_file(const char *file)
+int
+reset_secontext_file(const char *file)
{
char *proper_ctx = raw_expected_secontext_full_file(file);
- (void) setfilecon(file, proper_ctx);
+ int ret = setfilecon(file, proper_ctx);
+ if (ret && errno)
+ ret = -errno;
free(proper_ctx);
+
+ return ret;
}
-void
+int
update_secontext_field(const char *file, enum secontext_field field,
const char *newvalue)
{
@@ -300,7 +305,7 @@ update_secontext_field(const char *file, enum secontext_field field,
char *ctx = raw_secontext_full_file(file);
if (ctx == NULL)
- return;
+ return -1;
char *saveptr = NULL;
char *token;
@@ -319,11 +324,15 @@ update_secontext_field(const char *file, enum secontext_field field,
char *newcontext = xasprintf("%s:%s:%s:%s", split[0], split[1],
split[2], split[3]);
- (void) setfilecon(file, newcontext);
+ int ret = setfilecon(file, newcontext);
+ if (ret && errno)
+ ret = -errno;
free(newcontext);
free(ctx);
errno = saved_errno;
+
+ return ret;
}
#endif /* HAVE_SELINUX_RUNTIME */
diff --git a/tests/secontext.h b/tests/secontext.h
index b5bba2272..dab33e6a5 100644
--- a/tests/secontext.h
+++ b/tests/secontext.h
@@ -7,6 +7,8 @@
#include "tests.h"
#include "xmalloc.h"
+
+#include <errno.h>
#include <unistd.h>
char *secontext_full_fd(int) ATTRIBUTE_MALLOC;
@@ -35,10 +37,10 @@ char *get_secontext_field(const char *full_context, enum secontext_field field);
char *get_secontext_field_fd(int fd, enum secontext_field field);
char *get_secontext_field_file(const char *file, enum secontext_field field);
-void reset_secontext_file(const char *file);
+int reset_secontext_file(const char *file);
-void update_secontext_field(const char *file, enum secontext_field field,
- const char *newvalue);
+int update_secontext_field(const char *file, enum secontext_field field,
+ const char *newvalue);
# ifdef PRINT_SECONTEXT_FULL
@@ -81,15 +83,17 @@ get_secontext_field_file(const char *file, enum secontext_field field)
return NULL;
}
-static inline void
+static inline int
reset_secontext_file(const char *file)
{
+ return -ENOSYS;
}
-static inline void
+static inline int
update_secontext_field(const char *file, enum secontext_field field,
const char *newvalue)
{
+ return -ENOSYS;
}
# define SECONTEXT_FD(fd) xstrdup("")
diff --git a/tests-m32/linkat.c b/tests-m32/linkat.c
index 1d0ee3c9f..832392ca0 100644
--- a/tests-m32/linkat.c
+++ b/tests-m32/linkat.c
@@ -19,8 +19,20 @@
#include <string.h>
#include "secontext.h"
+#include "xlat.h"
#include "xmalloc.h"
+struct xlat_data secontext_types_data[] = {
+ [SECONTEXT_USER] = XLAT_PAIR(SECONTEXT_USER, "user"),
+ [SECONTEXT_ROLE] = XLAT_PAIR(SECONTEXT_ROLE, "role"),
+ [SECONTEXT_TYPE] = XLAT_PAIR(SECONTEXT_TYPE, "type"),
+};
+struct xlat secontext_types = {
+ .data = secontext_types_data,
+ .size = ARRAY_SIZE(secontext_types_data),
+ .type = XT_INDEXED,
+};
+
static void
mangle_secontext_field(const char *path, enum secontext_field field,
const char *new_val, const char *fallback_val)
@@ -29,10 +41,18 @@ mangle_secontext_field(const char *path, enum secontext_field field,
if (!orig)
return;
- update_secontext_field(path, field,
- strcmp(new_val, orig) ? new_val : fallback_val);
+ const char *new = strcmp(new_val, orig) ? new_val : fallback_val;
free(orig);
+
+ int ret = update_secontext_field(path, field, new);
+ if (ret) {
+ error_msg_and_skip("Failed to mangle secontext %s for "
+ "'%s' to %s: %d",
+ sprintxval_abbrev(&secontext_types, field,
+ "SECONTEXT_???"),
+ path, new, ret);
+ }
}
int
@@ -103,8 +123,14 @@ main(void)
if (close(fd_sample_2))
perror_msg_and_fail("close");
- if (*sample_1_secontext && strstr(sample_1_secontext, "!!"))
- reset_secontext_file(sample_1);
+ if (*sample_1_secontext && strstr(sample_1_secontext, "!!")) {
+ int ret;
+ if ((ret = reset_secontext_file(sample_1))) {
+ errno = -ret;
+ perror_msg_and_skip("Reset secontext for '%s'",
+ sample_1);
+ }
+ }
free(sample_1_secontext);
diff --git a/tests-m32/secontext.c b/tests-m32/secontext.c
index 84c682869..a0463c467 100644
--- a/tests-m32/secontext.c
+++ b/tests-m32/secontext.c
@@ -284,14 +284,19 @@ secontext_short_pid(pid_t pid)
return FORMAT_SPACE_AFTER(raw_secontext_short_pid(pid));
}
-void reset_secontext_file(const char *file)
+int
+reset_secontext_file(const char *file)
{
char *proper_ctx = raw_expected_secontext_full_file(file);
- (void) setfilecon(file, proper_ctx);
+ int ret = setfilecon(file, proper_ctx);
+ if (ret && errno)
+ ret = -errno;
free(proper_ctx);
+
+ return ret;
}
-void
+int
update_secontext_field(const char *file, enum secontext_field field,
const char *newvalue)
{
@@ -300,7 +305,7 @@ update_secontext_field(const char *file, enum secontext_field field,
char *ctx = raw_secontext_full_file(file);
if (ctx == NULL)
- return;
+ return -1;
char *saveptr = NULL;
char *token;
@@ -319,11 +324,15 @@ update_secontext_field(const char *file, enum secontext_field field,
char *newcontext = xasprintf("%s:%s:%s:%s", split[0], split[1],
split[2], split[3]);
- (void) setfilecon(file, newcontext);
+ int ret = setfilecon(file, newcontext);
+ if (ret && errno)
+ ret = -errno;
free(newcontext);
free(ctx);
errno = saved_errno;
+
+ return ret;
}
#endif /* HAVE_SELINUX_RUNTIME */
diff --git a/tests-m32/secontext.h b/tests-m32/secontext.h
index b5bba2272..dab33e6a5 100644
--- a/tests-m32/secontext.h
+++ b/tests-m32/secontext.h
@@ -7,6 +7,8 @@
#include "tests.h"
#include "xmalloc.h"
+
+#include <errno.h>
#include <unistd.h>
char *secontext_full_fd(int) ATTRIBUTE_MALLOC;
@@ -35,10 +37,10 @@ char *get_secontext_field(const char *full_context, enum secontext_field field);
char *get_secontext_field_fd(int fd, enum secontext_field field);
char *get_secontext_field_file(const char *file, enum secontext_field field);
-void reset_secontext_file(const char *file);
+int reset_secontext_file(const char *file);
-void update_secontext_field(const char *file, enum secontext_field field,
- const char *newvalue);
+int update_secontext_field(const char *file, enum secontext_field field,
+ const char *newvalue);
# ifdef PRINT_SECONTEXT_FULL
@@ -81,15 +83,17 @@ get_secontext_field_file(const char *file, enum secontext_field field)
return NULL;
}
-static inline void
+static inline int
reset_secontext_file(const char *file)
{
+ return -ENOSYS;
}
-static inline void
+static inline int
update_secontext_field(const char *file, enum secontext_field field,
const char *newvalue)
{
+ return -ENOSYS;
}
# define SECONTEXT_FD(fd) xstrdup("")
diff --git a/tests-mx32/linkat.c b/tests-mx32/linkat.c
index 1d0ee3c9f..832392ca0 100644
--- a/tests-mx32/linkat.c
+++ b/tests-mx32/linkat.c
@@ -19,8 +19,20 @@
#include <string.h>
#include "secontext.h"
+#include "xlat.h"
#include "xmalloc.h"
+struct xlat_data secontext_types_data[] = {
+ [SECONTEXT_USER] = XLAT_PAIR(SECONTEXT_USER, "user"),
+ [SECONTEXT_ROLE] = XLAT_PAIR(SECONTEXT_ROLE, "role"),
+ [SECONTEXT_TYPE] = XLAT_PAIR(SECONTEXT_TYPE, "type"),
+};
+struct xlat secontext_types = {
+ .data = secontext_types_data,
+ .size = ARRAY_SIZE(secontext_types_data),
+ .type = XT_INDEXED,
+};
+
static void
mangle_secontext_field(const char *path, enum secontext_field field,
const char *new_val, const char *fallback_val)
@@ -29,10 +41,18 @@ mangle_secontext_field(const char *path, enum secontext_field field,
if (!orig)
return;
- update_secontext_field(path, field,
- strcmp(new_val, orig) ? new_val : fallback_val);
+ const char *new = strcmp(new_val, orig) ? new_val : fallback_val;
free(orig);
+
+ int ret = update_secontext_field(path, field, new);
+ if (ret) {
+ error_msg_and_skip("Failed to mangle secontext %s for "
+ "'%s' to %s: %d",
+ sprintxval_abbrev(&secontext_types, field,
+ "SECONTEXT_???"),
+ path, new, ret);
+ }
}
int
@@ -103,8 +123,14 @@ main(void)
if (close(fd_sample_2))
perror_msg_and_fail("close");
- if (*sample_1_secontext && strstr(sample_1_secontext, "!!"))
- reset_secontext_file(sample_1);
+ if (*sample_1_secontext && strstr(sample_1_secontext, "!!")) {
+ int ret;
+ if ((ret = reset_secontext_file(sample_1))) {
+ errno = -ret;
+ perror_msg_and_skip("Reset secontext for '%s'",
+ sample_1);
+ }
+ }
free(sample_1_secontext);
diff --git a/tests-mx32/secontext.c b/tests-mx32/secontext.c
index 84c682869..a0463c467 100644
--- a/tests-mx32/secontext.c
+++ b/tests-mx32/secontext.c
@@ -284,14 +284,19 @@ secontext_short_pid(pid_t pid)
return FORMAT_SPACE_AFTER(raw_secontext_short_pid(pid));
}
-void reset_secontext_file(const char *file)
+int
+reset_secontext_file(const char *file)
{
char *proper_ctx = raw_expected_secontext_full_file(file);
- (void) setfilecon(file, proper_ctx);
+ int ret = setfilecon(file, proper_ctx);
+ if (ret && errno)
+ ret = -errno;
free(proper_ctx);
+
+ return ret;
}
-void
+int
update_secontext_field(const char *file, enum secontext_field field,
const char *newvalue)
{
@@ -300,7 +305,7 @@ update_secontext_field(const char *file, enum secontext_field field,
char *ctx = raw_secontext_full_file(file);
if (ctx == NULL)
- return;
+ return -1;
char *saveptr = NULL;
char *token;
@@ -319,11 +324,15 @@ update_secontext_field(const char *file, enum secontext_field field,
char *newcontext = xasprintf("%s:%s:%s:%s", split[0], split[1],
split[2], split[3]);
- (void) setfilecon(file, newcontext);
+ int ret = setfilecon(file, newcontext);
+ if (ret && errno)
+ ret = -errno;
free(newcontext);
free(ctx);
errno = saved_errno;
+
+ return ret;
}
#endif /* HAVE_SELINUX_RUNTIME */
diff --git a/tests-mx32/secontext.h b/tests-mx32/secontext.h
index b5bba2272..dab33e6a5 100644
--- a/tests-mx32/secontext.h
+++ b/tests-mx32/secontext.h
@@ -7,6 +7,8 @@
#include "tests.h"
#include "xmalloc.h"
+
+#include <errno.h>
#include <unistd.h>
char *secontext_full_fd(int) ATTRIBUTE_MALLOC;
@@ -35,10 +37,10 @@ char *get_secontext_field(const char *full_context, enum secontext_field field);
char *get_secontext_field_fd(int fd, enum secontext_field field);
char *get_secontext_field_file(const char *file, enum secontext_field field);
-void reset_secontext_file(const char *file);
+int reset_secontext_file(const char *file);
-void update_secontext_field(const char *file, enum secontext_field field,
- const char *newvalue);
+int update_secontext_field(const char *file, enum secontext_field field,
+ const char *newvalue);
# ifdef PRINT_SECONTEXT_FULL
@@ -81,15 +83,17 @@ get_secontext_field_file(const char *file, enum secontext_field field)
return NULL;
}
-static inline void
+static inline int
reset_secontext_file(const char *file)
{
+ return -ENOSYS;
}
-static inline void
+static inline int
update_secontext_field(const char *file, enum secontext_field field,
const char *newvalue)
{
+ return -ENOSYS;
}
# define SECONTEXT_FD(fd) xstrdup("")
--
2.13.6

View File

@ -0,0 +1,76 @@
From d08dfdebb381427cbd8565994868926ba9bc4b40 Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Wed, 30 Oct 2024 15:16:47 +0100
Subject: [PATCH 188/190] linux/s390/get_scno.c: use NT_S390_SYSTEM_CALL if
gprs[2] is clobbered
The way the syscall number is retrieved currently relies on the kernel
propagating it properly into gprs[2], which is not however always the case;
apart of the situation where scno > NR_syscalls, there is also an issue
of inspecting it during syscall restart (as it happens on attach, for
example), when it is already clobbered by a ERESTART* errno. Luckily
for strace, this issue has been already foreseen by the kernel
developers, and support for retrieving syscall number on s390
via a separate ptrace regset has been added by the Linux commit
v3.2-rc1~109^2~34; 13 years later, it is time for it to fulfill
its purpose and finally get utilised.
* src/linux/s390/get_scno.c (arch_get_scno): Try to retrieve the syscall
number by querying NT_S390_SYSTEM_CALL regset if gprs[2] contains an errno.
Complements: v6.11-21-gc7e0ea6d712e "syscall: do not use uninitialized parts of struct ptrace_syscall_info"
---
src/linux/s390/get_scno.c | 34 ++++++++++++++++++++++++++++++++--
1 file changed, 32 insertions(+), 2 deletions(-)
diff --git a/src/linux/s390/get_scno.c b/src/linux/s390/get_scno.c
index f0863e26d701..fdc94d025280 100644
--- a/src/linux/s390/get_scno.c
+++ b/src/linux/s390/get_scno.c
@@ -9,11 +9,41 @@
# define ARCH_REGSET s390_regset
#endif
+#ifndef NT_ARM_SYSTEM_CALL
+# define NT_S390_SYSTEM_CALL 0x307
+#endif
+
/* Return codes: 1 - ok, 0 - ignore, other - error. */
static int
arch_get_scno(struct tcb *tcp)
{
- tcp->scno = ARCH_REGSET.gprs[2] ?
- ARCH_REGSET.gprs[2] : ARCH_REGSET.gprs[1];
+ typeof(ARCH_REGSET.gprs[2]) gpr2 = ARCH_REGSET.gprs[2];
+
+ if (gpr2 > (typeof(gpr2)) (-4095ULL)) {
+ /*
+ * We are in restart_syscall and gprs[2] is clobbered
+ * by the errno, using pulling the syscall number
+ * via NT_S390_SYSTEM_CALL regset.
+ */
+ unsigned int scno;
+ const struct iovec io = {
+ .iov_base = &scno,
+ .iov_len = sizeof(scno)
+ };
+ int rc = ptrace(PTRACE_GETREGSET, tcp->pid, NT_S390_SYSTEM_CALL,
+ &io);
+ if (rc && errno != ESRCH) {
+ perror_func_msg("NT_S390_SYSTEM_CALL pid:%d", tcp->pid);
+ return -1;
+ }
+ /*
+ * The ptrace call returns thread.system_call, that stores raw
+ * int_code, and the syscall number part is the lowest 16 bits
+ * of it.
+ */
+ tcp->scno = scno & 0xffff;
+ } else {
+ tcp->scno = gpr2 ?: ARCH_REGSET.gprs[1];
+ }
return 1;
}
--
2.28.0

View File

@ -0,0 +1,698 @@
From e7f488a6d267001214636507c79210af57c2c6a7 Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Thu, 31 Oct 2024 13:28:00 +0100
Subject: [PATCH 189/190] tests: move k_setsockopt definition into a separate
file
...and add k_getsockopt definition as well (for completeness's sake
and because it will be utilised in the next patch).
* tests/k_sockopt.c: New file.
* tests/k_sockopt.h: Likewise.
* tests/Makefile.am (libtests_a_SOURCES): Add k_sockopt.c
and k_sockopt.h.
* tests/sockopt-timestamp.c: Include "k_sockopt.h".
---
tests/Makefile.am | 2 ++
tests/k_sockopt.c | 61 +++++++++++++++++++++++++++++++++++++++
tests/k_sockopt.h | 24 +++++++++++++++
tests/sockopt-timestamp.c | 25 +---------------
4 files changed, 88 insertions(+), 24 deletions(-)
create mode 100644 tests/k_sockopt.c
create mode 100644 tests/k_sockopt.h
Index: strace-6.7/tests/Makefile.am
===================================================================
--- strace-6.7.orig/tests/Makefile.am 2024-10-31 14:07:30.389665979 +0100
+++ strace-6.7/tests/Makefile.am 2024-10-31 14:07:30.445665345 +0100
@@ -61,6 +61,8 @@
hexquote_strndup.c \
ifindex.c \
inode_of_sockfd.c \
+ k_sockopt.c \
+ k_sockopt.h \
libmmsg.c \
libsocketcall.c \
lock_file.c \
Index: strace-6.7/tests/k_sockopt.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-6.7/tests/k_sockopt.c 2024-10-31 14:07:30.445665345 +0100
@@ -0,0 +1,61 @@
+/*
+ * [gs]etsockopt() wrappers that avoid glibc and perform syscalls directly.
+ *
+ * Copyright (c) 2019 Dmitry V. Levin <ldv@strace.io>
+ * Copyright (c) 2019-2024 The strace developers.
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "tests.h"
+#include "scno.h"
+
+#include <unistd.h>
+#include <sys/socket.h>
+
+#include "k_sockopt.h"
+
+static const kernel_ulong_t fill = (kernel_ulong_t) 0xdefaced00000000ULL;
+
+#if defined __NR_getsockopt || defined __NR_setsockopt
+static const kernel_ulong_t bad = (kernel_ulong_t) 0xbadc0dedbadc0dedULL;
+#endif
+
+#define SC_getsockopt 15
+long
+k_getsockopt(const unsigned int fd, const unsigned int level,
+ const unsigned int optname, const void *const optval,
+ const unsigned int *len)
+{
+ return syscall(
+#ifdef __NR_getsockopt
+ __NR_getsockopt,
+#else /* socketcall */
+ __NR_socketcall, SC_getsockopt,
+#endif
+ fill | fd , fill | level, fill | optname, optval, len
+#ifdef __NR_getsockopt
+ , bad
+#endif
+ );
+}
+
+# define SC_setsockopt 14
+long
+k_setsockopt(const unsigned int fd, const unsigned int level,
+ const unsigned int optname, const void *const optval,
+ const unsigned int len)
+{
+ return syscall(
+#ifdef __NR_setsockopt
+ __NR_setsockopt,
+#else /* socketcall */
+ __NR_socketcall, SC_setsockopt,
+#endif
+ fill | fd , fill | level, fill | optname, optval, fill | len
+#ifdef __NR_setsockopt
+ , bad
+#endif
+ );
+}
Index: strace-6.7/tests/k_sockopt.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-6.7/tests/k_sockopt.h 2024-10-31 14:07:30.445665345 +0100
@@ -0,0 +1,24 @@
+/*
+ * [gs]etsockopt() wrappers that avoid glibc and perform syscalls directly.
+ *
+ * Copyright (c) 2019 Dmitry V. Levin <ldv@strace.io>
+ * Copyright (c) 2019-2024 The strace developers.
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef STRACE_K_SOCKOPT_H
+#define STRACE_K_SOCKOPT_H
+
+extern long
+k_getsockopt(const unsigned int fd, const unsigned int level,
+ const unsigned int optname, const void *const optval,
+ const unsigned int *len);
+
+extern long
+k_setsockopt(const unsigned int fd, const unsigned int level,
+ const unsigned int optname, const void *const optval,
+ const unsigned int len);
+
+#endif /* STRACE_K_SOCKOPT_H */
Index: strace-6.7/tests/sockopt-timestamp.c
===================================================================
--- strace-6.7.orig/tests/sockopt-timestamp.c 2024-10-31 14:07:27.014704200 +0100
+++ strace-6.7/tests/sockopt-timestamp.c 2024-10-31 14:07:30.446665333 +0100
@@ -22,6 +22,7 @@
# include "kernel_time_types.h"
# include "kernel_timeval.h"
# include "kernel_old_timespec.h"
+# include "k_sockopt.h"
# define XLAT_MACROS_ONLY
# include "xlat/sock_options.h"
@@ -44,30 +45,6 @@
return rc;
}
-# define SC_setsockopt 14
-static long
-k_setsockopt(const unsigned int fd, const unsigned int level,
- const unsigned int optname, const void *const optval,
- const unsigned int len)
-{
- const kernel_ulong_t fill = (kernel_ulong_t) 0xdefaced00000000ULL;
-# ifdef __NR_setsockopt
- const kernel_ulong_t bad = (kernel_ulong_t) 0xbadc0dedbadc0dedULL;
-# endif
-
- return syscall(
-# ifdef __NR_setsockopt
- __NR_setsockopt,
-# else /* socketcall */
- __NR_socketcall, SC_setsockopt,
-# endif
- fill | fd , fill | level, fill | optname, optval, fill | len
-# ifdef __NR_setsockopt
- , bad
-# endif
- );
-}
-
static void
print_timestamp_old(const struct cmsghdr *c)
{
Index: strace-6.7/tests/Makefile.in
===================================================================
--- strace-6.7.orig/tests/Makefile.in 2024-10-31 14:07:30.402665832 +0100
+++ strace-6.7/tests/Makefile.in 2024-10-31 14:09:57.964994687 +0100
@@ -850,6 +850,7 @@
libtests_a-hexquote_strndup.$(OBJEXT) \
libtests_a-ifindex.$(OBJEXT) \
libtests_a-inode_of_sockfd.$(OBJEXT) \
+ libtests_a-k_sockopt.$(OBJEXT) \
libtests_a-libmmsg.$(OBJEXT) \
libtests_a-libsocketcall.$(OBJEXT) \
libtests_a-lock_file.$(OBJEXT) \
@@ -6803,6 +6804,7 @@
./$(DEPDIR)/libtests_a-hexquote_strndup.Po \
./$(DEPDIR)/libtests_a-ifindex.Po \
./$(DEPDIR)/libtests_a-inode_of_sockfd.Po \
+ ./$(DEPDIR)/libtests_a-k_sockopt.Po \
./$(DEPDIR)/libtests_a-libmmsg.Po \
./$(DEPDIR)/libtests_a-libsocketcall.Po \
./$(DEPDIR)/libtests_a-lock_file.Po \
@@ -8709,6 +8711,8 @@
hexquote_strndup.c \
ifindex.c \
inode_of_sockfd.c \
+ k_sockopt.c \
+ k_sockopt.h \
libmmsg.c \
libsocketcall.c \
lock_file.c \
@@ -16432,6 +16436,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-hexquote_strndup.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-ifindex.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-inode_of_sockfd.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-k_sockopt.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-libmmsg.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-libsocketcall.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-lock_file.Po@am__quote@ # am--include-marker
@@ -17367,6 +17372,20 @@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtests_a-inode_of_sockfd.obj `if test -f 'inode_of_sockfd.c'; then $(CYGPATH_W) 'inode_of_sockfd.c'; else $(CYGPATH_W) '$(srcdir)/inode_of_sockfd.c'; fi`
+libtests_a-k_sockopt.o: k_sockopt.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtests_a-k_sockopt.o -MD -MP -MF $(DEPDIR)/libtests_a-k_sockopt.Tpo -c -o libtests_a-k_sockopt.o `test -f 'k_sockopt.c' || echo '$(srcdir)/'`k_sockopt.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libtests_a-k_sockopt.Tpo $(DEPDIR)/libtests_a-k_sockopt.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='k_sockopt.c' object='libtests_a-k_sockopt.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtests_a-k_sockopt.o `test -f 'k_sockopt.c' || echo '$(srcdir)/'`k_sockopt.c
+
+libtests_a-k_sockopt.obj: k_sockopt.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtests_a-k_sockopt.obj -MD -MP -MF $(DEPDIR)/libtests_a-k_sockopt.Tpo -c -o libtests_a-k_sockopt.obj `if test -f 'k_sockopt.c'; then $(CYGPATH_W) 'k_sockopt.c'; else $(CYGPATH_W) '$(srcdir)/k_sockopt.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libtests_a-k_sockopt.Tpo $(DEPDIR)/libtests_a-k_sockopt.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='k_sockopt.c' object='libtests_a-k_sockopt.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtests_a-k_sockopt.obj `if test -f 'k_sockopt.c'; then $(CYGPATH_W) 'k_sockopt.c'; else $(CYGPATH_W) '$(srcdir)/k_sockopt.c'; fi`
+
libtests_a-libmmsg.o: libmmsg.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtests_a-libmmsg.o -MD -MP -MF $(DEPDIR)/libtests_a-libmmsg.Tpo -c -o libtests_a-libmmsg.o `test -f 'libmmsg.c' || echo '$(srcdir)/'`libmmsg.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libtests_a-libmmsg.Tpo $(DEPDIR)/libtests_a-libmmsg.Po
@@ -19014,6 +19033,7 @@
-rm -f ./$(DEPDIR)/libtests_a-hexquote_strndup.Po
-rm -f ./$(DEPDIR)/libtests_a-ifindex.Po
-rm -f ./$(DEPDIR)/libtests_a-inode_of_sockfd.Po
+ -rm -f ./$(DEPDIR)/libtests_a-k_sockopt.Po
-rm -f ./$(DEPDIR)/libtests_a-libmmsg.Po
-rm -f ./$(DEPDIR)/libtests_a-libsocketcall.Po
-rm -f ./$(DEPDIR)/libtests_a-lock_file.Po
@@ -20341,6 +20361,7 @@
-rm -f ./$(DEPDIR)/libtests_a-hexquote_strndup.Po
-rm -f ./$(DEPDIR)/libtests_a-ifindex.Po
-rm -f ./$(DEPDIR)/libtests_a-inode_of_sockfd.Po
+ -rm -f ./$(DEPDIR)/libtests_a-k_sockopt.Po
-rm -f ./$(DEPDIR)/libtests_a-libmmsg.Po
-rm -f ./$(DEPDIR)/libtests_a-libsocketcall.Po
-rm -f ./$(DEPDIR)/libtests_a-lock_file.Po
Index: strace-6.7/tests-m32/Makefile.am
===================================================================
--- strace-6.7.orig/tests-m32/Makefile.am 2024-10-31 14:07:27.014704200 +0100
+++ strace-6.7/tests-m32/Makefile.am 2024-10-31 14:07:30.449665299 +0100
@@ -61,6 +61,8 @@
hexquote_strndup.c \
ifindex.c \
inode_of_sockfd.c \
+ k_sockopt.c \
+ k_sockopt.h \
libmmsg.c \
libsocketcall.c \
lock_file.c \
Index: strace-6.7/tests-m32/k_sockopt.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-6.7/tests-m32/k_sockopt.c 2024-10-31 14:07:30.449665299 +0100
@@ -0,0 +1,61 @@
+/*
+ * [gs]etsockopt() wrappers that avoid glibc and perform syscalls directly.
+ *
+ * Copyright (c) 2019 Dmitry V. Levin <ldv@strace.io>
+ * Copyright (c) 2019-2024 The strace developers.
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "tests.h"
+#include "scno.h"
+
+#include <unistd.h>
+#include <sys/socket.h>
+
+#include "k_sockopt.h"
+
+static const kernel_ulong_t fill = (kernel_ulong_t) 0xdefaced00000000ULL;
+
+#if defined __NR_getsockopt || defined __NR_setsockopt
+static const kernel_ulong_t bad = (kernel_ulong_t) 0xbadc0dedbadc0dedULL;
+#endif
+
+#define SC_getsockopt 15
+long
+k_getsockopt(const unsigned int fd, const unsigned int level,
+ const unsigned int optname, const void *const optval,
+ const unsigned int *len)
+{
+ return syscall(
+#ifdef __NR_getsockopt
+ __NR_getsockopt,
+#else /* socketcall */
+ __NR_socketcall, SC_getsockopt,
+#endif
+ fill | fd , fill | level, fill | optname, optval, len
+#ifdef __NR_getsockopt
+ , bad
+#endif
+ );
+}
+
+# define SC_setsockopt 14
+long
+k_setsockopt(const unsigned int fd, const unsigned int level,
+ const unsigned int optname, const void *const optval,
+ const unsigned int len)
+{
+ return syscall(
+#ifdef __NR_setsockopt
+ __NR_setsockopt,
+#else /* socketcall */
+ __NR_socketcall, SC_setsockopt,
+#endif
+ fill | fd , fill | level, fill | optname, optval, fill | len
+#ifdef __NR_setsockopt
+ , bad
+#endif
+ );
+}
Index: strace-6.7/tests-m32/k_sockopt.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-6.7/tests-m32/k_sockopt.h 2024-10-31 14:07:30.449665299 +0100
@@ -0,0 +1,24 @@
+/*
+ * [gs]etsockopt() wrappers that avoid glibc and perform syscalls directly.
+ *
+ * Copyright (c) 2019 Dmitry V. Levin <ldv@strace.io>
+ * Copyright (c) 2019-2024 The strace developers.
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef STRACE_K_SOCKOPT_H
+#define STRACE_K_SOCKOPT_H
+
+extern long
+k_getsockopt(const unsigned int fd, const unsigned int level,
+ const unsigned int optname, const void *const optval,
+ const unsigned int *len);
+
+extern long
+k_setsockopt(const unsigned int fd, const unsigned int level,
+ const unsigned int optname, const void *const optval,
+ const unsigned int len);
+
+#endif /* STRACE_K_SOCKOPT_H */
Index: strace-6.7/tests-m32/sockopt-timestamp.c
===================================================================
--- strace-6.7.orig/tests-m32/sockopt-timestamp.c 2024-10-31 14:07:27.014704200 +0100
+++ strace-6.7/tests-m32/sockopt-timestamp.c 2024-10-31 14:07:30.450665288 +0100
@@ -22,6 +22,7 @@
# include "kernel_time_types.h"
# include "kernel_timeval.h"
# include "kernel_old_timespec.h"
+# include "k_sockopt.h"
# define XLAT_MACROS_ONLY
# include "xlat/sock_options.h"
@@ -44,30 +45,6 @@
return rc;
}
-# define SC_setsockopt 14
-static long
-k_setsockopt(const unsigned int fd, const unsigned int level,
- const unsigned int optname, const void *const optval,
- const unsigned int len)
-{
- const kernel_ulong_t fill = (kernel_ulong_t) 0xdefaced00000000ULL;
-# ifdef __NR_setsockopt
- const kernel_ulong_t bad = (kernel_ulong_t) 0xbadc0dedbadc0dedULL;
-# endif
-
- return syscall(
-# ifdef __NR_setsockopt
- __NR_setsockopt,
-# else /* socketcall */
- __NR_socketcall, SC_setsockopt,
-# endif
- fill | fd , fill | level, fill | optname, optval, fill | len
-# ifdef __NR_setsockopt
- , bad
-# endif
- );
-}
-
static void
print_timestamp_old(const struct cmsghdr *c)
{
Index: strace-6.7/tests-m32/Makefile.in
===================================================================
--- strace-6.7.orig/tests-m32/Makefile.in 2024-10-31 14:07:30.394665922 +0100
+++ strace-6.7/tests-m32/Makefile.in 2024-10-31 14:07:30.453665254 +0100
@@ -850,6 +850,7 @@
libtests_a-hexquote_strndup.$(OBJEXT) \
libtests_a-ifindex.$(OBJEXT) \
libtests_a-inode_of_sockfd.$(OBJEXT) \
+ libtests_a-k_sockopt.$(OBJEXT) \
libtests_a-libmmsg.$(OBJEXT) \
libtests_a-libsocketcall.$(OBJEXT) \
libtests_a-lock_file.$(OBJEXT) \
@@ -6803,6 +6804,7 @@
./$(DEPDIR)/libtests_a-hexquote_strndup.Po \
./$(DEPDIR)/libtests_a-ifindex.Po \
./$(DEPDIR)/libtests_a-inode_of_sockfd.Po \
+ ./$(DEPDIR)/libtests_a-k_sockopt.Po \
./$(DEPDIR)/libtests_a-libmmsg.Po \
./$(DEPDIR)/libtests_a-libsocketcall.Po \
./$(DEPDIR)/libtests_a-lock_file.Po \
@@ -8709,6 +8711,8 @@
hexquote_strndup.c \
ifindex.c \
inode_of_sockfd.c \
+ k_sockopt.c \
+ k_sockopt.h \
libmmsg.c \
libsocketcall.c \
lock_file.c \
@@ -16432,6 +16436,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-hexquote_strndup.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-ifindex.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-inode_of_sockfd.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-k_sockopt.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-libmmsg.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-libsocketcall.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-lock_file.Po@am__quote@ # am--include-marker
@@ -17367,6 +17372,20 @@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtests_a-inode_of_sockfd.obj `if test -f 'inode_of_sockfd.c'; then $(CYGPATH_W) 'inode_of_sockfd.c'; else $(CYGPATH_W) '$(srcdir)/inode_of_sockfd.c'; fi`
+libtests_a-k_sockopt.o: k_sockopt.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtests_a-k_sockopt.o -MD -MP -MF $(DEPDIR)/libtests_a-k_sockopt.Tpo -c -o libtests_a-k_sockopt.o `test -f 'k_sockopt.c' || echo '$(srcdir)/'`k_sockopt.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libtests_a-k_sockopt.Tpo $(DEPDIR)/libtests_a-k_sockopt.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='k_sockopt.c' object='libtests_a-k_sockopt.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtests_a-k_sockopt.o `test -f 'k_sockopt.c' || echo '$(srcdir)/'`k_sockopt.c
+
+libtests_a-k_sockopt.obj: k_sockopt.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtests_a-k_sockopt.obj -MD -MP -MF $(DEPDIR)/libtests_a-k_sockopt.Tpo -c -o libtests_a-k_sockopt.obj `if test -f 'k_sockopt.c'; then $(CYGPATH_W) 'k_sockopt.c'; else $(CYGPATH_W) '$(srcdir)/k_sockopt.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libtests_a-k_sockopt.Tpo $(DEPDIR)/libtests_a-k_sockopt.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='k_sockopt.c' object='libtests_a-k_sockopt.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtests_a-k_sockopt.obj `if test -f 'k_sockopt.c'; then $(CYGPATH_W) 'k_sockopt.c'; else $(CYGPATH_W) '$(srcdir)/k_sockopt.c'; fi`
+
libtests_a-libmmsg.o: libmmsg.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtests_a-libmmsg.o -MD -MP -MF $(DEPDIR)/libtests_a-libmmsg.Tpo -c -o libtests_a-libmmsg.o `test -f 'libmmsg.c' || echo '$(srcdir)/'`libmmsg.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libtests_a-libmmsg.Tpo $(DEPDIR)/libtests_a-libmmsg.Po
@@ -19014,6 +19033,7 @@
-rm -f ./$(DEPDIR)/libtests_a-hexquote_strndup.Po
-rm -f ./$(DEPDIR)/libtests_a-ifindex.Po
-rm -f ./$(DEPDIR)/libtests_a-inode_of_sockfd.Po
+ -rm -f ./$(DEPDIR)/libtests_a-k_sockopt.Po
-rm -f ./$(DEPDIR)/libtests_a-libmmsg.Po
-rm -f ./$(DEPDIR)/libtests_a-libsocketcall.Po
-rm -f ./$(DEPDIR)/libtests_a-lock_file.Po
@@ -20341,6 +20361,7 @@
-rm -f ./$(DEPDIR)/libtests_a-hexquote_strndup.Po
-rm -f ./$(DEPDIR)/libtests_a-ifindex.Po
-rm -f ./$(DEPDIR)/libtests_a-inode_of_sockfd.Po
+ -rm -f ./$(DEPDIR)/libtests_a-k_sockopt.Po
-rm -f ./$(DEPDIR)/libtests_a-libmmsg.Po
-rm -f ./$(DEPDIR)/libtests_a-libsocketcall.Po
-rm -f ./$(DEPDIR)/libtests_a-lock_file.Po
Index: strace-6.7/tests-mx32/Makefile.am
===================================================================
--- strace-6.7.orig/tests-mx32/Makefile.am 2024-10-31 14:07:27.014704200 +0100
+++ strace-6.7/tests-mx32/Makefile.am 2024-10-31 14:07:30.453665254 +0100
@@ -61,6 +61,8 @@
hexquote_strndup.c \
ifindex.c \
inode_of_sockfd.c \
+ k_sockopt.c \
+ k_sockopt.h \
libmmsg.c \
libsocketcall.c \
lock_file.c \
Index: strace-6.7/tests-mx32/k_sockopt.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-6.7/tests-mx32/k_sockopt.c 2024-10-31 14:07:30.453665254 +0100
@@ -0,0 +1,61 @@
+/*
+ * [gs]etsockopt() wrappers that avoid glibc and perform syscalls directly.
+ *
+ * Copyright (c) 2019 Dmitry V. Levin <ldv@strace.io>
+ * Copyright (c) 2019-2024 The strace developers.
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "tests.h"
+#include "scno.h"
+
+#include <unistd.h>
+#include <sys/socket.h>
+
+#include "k_sockopt.h"
+
+static const kernel_ulong_t fill = (kernel_ulong_t) 0xdefaced00000000ULL;
+
+#if defined __NR_getsockopt || defined __NR_setsockopt
+static const kernel_ulong_t bad = (kernel_ulong_t) 0xbadc0dedbadc0dedULL;
+#endif
+
+#define SC_getsockopt 15
+long
+k_getsockopt(const unsigned int fd, const unsigned int level,
+ const unsigned int optname, const void *const optval,
+ const unsigned int *len)
+{
+ return syscall(
+#ifdef __NR_getsockopt
+ __NR_getsockopt,
+#else /* socketcall */
+ __NR_socketcall, SC_getsockopt,
+#endif
+ fill | fd , fill | level, fill | optname, optval, len
+#ifdef __NR_getsockopt
+ , bad
+#endif
+ );
+}
+
+# define SC_setsockopt 14
+long
+k_setsockopt(const unsigned int fd, const unsigned int level,
+ const unsigned int optname, const void *const optval,
+ const unsigned int len)
+{
+ return syscall(
+#ifdef __NR_setsockopt
+ __NR_setsockopt,
+#else /* socketcall */
+ __NR_socketcall, SC_setsockopt,
+#endif
+ fill | fd , fill | level, fill | optname, optval, fill | len
+#ifdef __NR_setsockopt
+ , bad
+#endif
+ );
+}
Index: strace-6.7/tests-mx32/k_sockopt.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-6.7/tests-mx32/k_sockopt.h 2024-10-31 14:07:30.453665254 +0100
@@ -0,0 +1,24 @@
+/*
+ * [gs]etsockopt() wrappers that avoid glibc and perform syscalls directly.
+ *
+ * Copyright (c) 2019 Dmitry V. Levin <ldv@strace.io>
+ * Copyright (c) 2019-2024 The strace developers.
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef STRACE_K_SOCKOPT_H
+#define STRACE_K_SOCKOPT_H
+
+extern long
+k_getsockopt(const unsigned int fd, const unsigned int level,
+ const unsigned int optname, const void *const optval,
+ const unsigned int *len);
+
+extern long
+k_setsockopt(const unsigned int fd, const unsigned int level,
+ const unsigned int optname, const void *const optval,
+ const unsigned int len);
+
+#endif /* STRACE_K_SOCKOPT_H */
Index: strace-6.7/tests-mx32/sockopt-timestamp.c
===================================================================
--- strace-6.7.orig/tests-mx32/sockopt-timestamp.c 2024-10-31 14:07:27.014704200 +0100
+++ strace-6.7/tests-mx32/sockopt-timestamp.c 2024-10-31 14:07:30.453665254 +0100
@@ -22,6 +22,7 @@
# include "kernel_time_types.h"
# include "kernel_timeval.h"
# include "kernel_old_timespec.h"
+# include "k_sockopt.h"
# define XLAT_MACROS_ONLY
# include "xlat/sock_options.h"
@@ -44,30 +45,6 @@
return rc;
}
-# define SC_setsockopt 14
-static long
-k_setsockopt(const unsigned int fd, const unsigned int level,
- const unsigned int optname, const void *const optval,
- const unsigned int len)
-{
- const kernel_ulong_t fill = (kernel_ulong_t) 0xdefaced00000000ULL;
-# ifdef __NR_setsockopt
- const kernel_ulong_t bad = (kernel_ulong_t) 0xbadc0dedbadc0dedULL;
-# endif
-
- return syscall(
-# ifdef __NR_setsockopt
- __NR_setsockopt,
-# else /* socketcall */
- __NR_socketcall, SC_setsockopt,
-# endif
- fill | fd , fill | level, fill | optname, optval, fill | len
-# ifdef __NR_setsockopt
- , bad
-# endif
- );
-}
-
static void
print_timestamp_old(const struct cmsghdr *c)
{
Index: strace-6.7/tests-mx32/Makefile.in
===================================================================
--- strace-6.7.orig/tests-mx32/Makefile.in 2024-10-31 14:07:30.398665877 +0100
+++ strace-6.7/tests-mx32/Makefile.in 2024-10-31 14:07:30.456665220 +0100
@@ -850,6 +850,7 @@
libtests_a-hexquote_strndup.$(OBJEXT) \
libtests_a-ifindex.$(OBJEXT) \
libtests_a-inode_of_sockfd.$(OBJEXT) \
+ libtests_a-k_sockopt.$(OBJEXT) \
libtests_a-libmmsg.$(OBJEXT) \
libtests_a-libsocketcall.$(OBJEXT) \
libtests_a-lock_file.$(OBJEXT) \
@@ -6803,6 +6804,7 @@
./$(DEPDIR)/libtests_a-hexquote_strndup.Po \
./$(DEPDIR)/libtests_a-ifindex.Po \
./$(DEPDIR)/libtests_a-inode_of_sockfd.Po \
+ ./$(DEPDIR)/libtests_a-k_sockopt.Po \
./$(DEPDIR)/libtests_a-libmmsg.Po \
./$(DEPDIR)/libtests_a-libsocketcall.Po \
./$(DEPDIR)/libtests_a-lock_file.Po \
@@ -8709,6 +8711,8 @@
hexquote_strndup.c \
ifindex.c \
inode_of_sockfd.c \
+ k_sockopt.c \
+ k_sockopt.h \
libmmsg.c \
libsocketcall.c \
lock_file.c \
@@ -16432,6 +16436,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-hexquote_strndup.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-ifindex.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-inode_of_sockfd.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-k_sockopt.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-libmmsg.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-libsocketcall.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtests_a-lock_file.Po@am__quote@ # am--include-marker
@@ -17367,6 +17372,20 @@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtests_a-inode_of_sockfd.obj `if test -f 'inode_of_sockfd.c'; then $(CYGPATH_W) 'inode_of_sockfd.c'; else $(CYGPATH_W) '$(srcdir)/inode_of_sockfd.c'; fi`
+libtests_a-k_sockopt.o: k_sockopt.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtests_a-k_sockopt.o -MD -MP -MF $(DEPDIR)/libtests_a-k_sockopt.Tpo -c -o libtests_a-k_sockopt.o `test -f 'k_sockopt.c' || echo '$(srcdir)/'`k_sockopt.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libtests_a-k_sockopt.Tpo $(DEPDIR)/libtests_a-k_sockopt.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='k_sockopt.c' object='libtests_a-k_sockopt.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtests_a-k_sockopt.o `test -f 'k_sockopt.c' || echo '$(srcdir)/'`k_sockopt.c
+
+libtests_a-k_sockopt.obj: k_sockopt.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtests_a-k_sockopt.obj -MD -MP -MF $(DEPDIR)/libtests_a-k_sockopt.Tpo -c -o libtests_a-k_sockopt.obj `if test -f 'k_sockopt.c'; then $(CYGPATH_W) 'k_sockopt.c'; else $(CYGPATH_W) '$(srcdir)/k_sockopt.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libtests_a-k_sockopt.Tpo $(DEPDIR)/libtests_a-k_sockopt.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='k_sockopt.c' object='libtests_a-k_sockopt.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtests_a-k_sockopt.obj `if test -f 'k_sockopt.c'; then $(CYGPATH_W) 'k_sockopt.c'; else $(CYGPATH_W) '$(srcdir)/k_sockopt.c'; fi`
+
libtests_a-libmmsg.o: libmmsg.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtests_a-libmmsg.o -MD -MP -MF $(DEPDIR)/libtests_a-libmmsg.Tpo -c -o libtests_a-libmmsg.o `test -f 'libmmsg.c' || echo '$(srcdir)/'`libmmsg.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libtests_a-libmmsg.Tpo $(DEPDIR)/libtests_a-libmmsg.Po
@@ -19014,6 +19033,7 @@
-rm -f ./$(DEPDIR)/libtests_a-hexquote_strndup.Po
-rm -f ./$(DEPDIR)/libtests_a-ifindex.Po
-rm -f ./$(DEPDIR)/libtests_a-inode_of_sockfd.Po
+ -rm -f ./$(DEPDIR)/libtests_a-k_sockopt.Po
-rm -f ./$(DEPDIR)/libtests_a-libmmsg.Po
-rm -f ./$(DEPDIR)/libtests_a-libsocketcall.Po
-rm -f ./$(DEPDIR)/libtests_a-lock_file.Po
@@ -20341,6 +20361,7 @@
-rm -f ./$(DEPDIR)/libtests_a-hexquote_strndup.Po
-rm -f ./$(DEPDIR)/libtests_a-ifindex.Po
-rm -f ./$(DEPDIR)/libtests_a-inode_of_sockfd.Po
+ -rm -f ./$(DEPDIR)/libtests_a-k_sockopt.Po
-rm -f ./$(DEPDIR)/libtests_a-libmmsg.Po
-rm -f ./$(DEPDIR)/libtests_a-libsocketcall.Po
-rm -f ./$(DEPDIR)/libtests_a-lock_file.Po

View File

@ -0,0 +1,60 @@
From cbda4efac4d55f8b3bf6622cdb764d2375a2cf3a Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Thu, 31 Oct 2024 13:31:14 +0100
Subject: [PATCH 190/190] tests/sockopt-timestamp.c: use k_getsockopt and
k_setsockopt
Avoid using glibc wrappers as these performs additional actions
that lead to the following issues:
- Test segfault on 32-bit compat when an attempt to use
SO_RCVTIMEO_NEW/SO_SNDTIMEO_NEW with opt pointing to unavailable
memory is made;
- Additional calls to SO_TIMESTAMP{,NS}_OLD when SO_TIMESTAMP{NS}_NEW
are called:
-getsockopt(3, SOL_SOCKET, SO_TIMESTAMP_NEW, [0], [4]) = 0
[...]
+getsockopt(3, SOL_SOCKET, SO_TIMESTAMP_NEW, 0xf7d3cffc, [4]) = -1 ENOPROTOOPT (Protocol not available)
+getsockopt(3, SOL_SOCKET, SO_TIMESTAMP_OLD, [0], [4]) = 0
* tests/sockopt-sol_socket.c: Include "k_sockopt.h".
{get_sockopt): Use k_getsockopt() instead of getsockopt().
{set_sockopt): Use k_setsockopt() instead of setsockopt().
---
tests/sockopt-sol_socket.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/tests/sockopt-sol_socket.c b/tests/sockopt-sol_socket.c
index 833aee6e1904..ee7a866c4385 100644
--- a/tests/sockopt-sol_socket.c
+++ b/tests/sockopt-sol_socket.c
@@ -13,6 +13,8 @@
#include <sys/socket.h>
#include <sys/un.h>
+#include "k_sockopt.h"
+
#define XLAT_MACROS_ONLY
# include "xlat/sock_options.h"
#undef XLAT_MACROS_ONLY
@@ -34,7 +36,7 @@ struct intstr {
static int
get_sockopt(int fd, int name, void *val, socklen_t *len)
{
- rc = getsockopt(fd, SOL_SOCKET, name, val, len);
+ rc = k_getsockopt(fd, SOL_SOCKET, name, val, len);
errstr = sprintrc(rc);
return rc;
}
@@ -42,7 +44,7 @@ get_sockopt(int fd, int name, void *val, socklen_t *len)
static int
set_sockopt(int fd, int name, void *val, socklen_t len)
{
- rc = setsockopt(fd, SOL_SOCKET, name, val, len);
+ rc = k_setsockopt(fd, SOL_SOCKET, name, val, len);
errstr = sprintrc(rc);
return rc;
}
--
2.28.0

View File

@ -1,7 +1,7 @@
Summary: Tracks and displays system calls associated with a running process Summary: Tracks and displays system calls associated with a running process
Name: strace Name: strace
Version: 6.7 Version: 6.7
Release: 4%{?dist} Release: 5%{?dist}
# The test suite is GPLv2+, the bundled headers are GPLv2 with Linux syscall # The test suite is GPLv2+, the bundled headers are GPLv2 with Linux syscall
# exception, all the rest is LGPLv2.1+. # exception, all the rest is LGPLv2.1+.
%if 0%{?fedora} >= 35 || 0%{?centos} >= 9 || 0%{?rhel} >= 9 %if 0%{?fedora} >= 35 || 0%{?centos} >= 9 || 0%{?rhel} >= 9
@ -105,9 +105,6 @@ URL: https://strace.io
%if 0%{?fedora} >= 12 || 0%{?centos} >= 6 || 0%{?rhel} >= 6 || 0%{?suse_version} >= 1200 %if 0%{?fedora} >= 12 || 0%{?centos} >= 6 || 0%{?rhel} >= 6 || 0%{?suse_version} >= 1200
Source: https://strace.io/files/%{version}/strace-%{version}.tar.xz Source: https://strace.io/files/%{version}/strace-%{version}.tar.xz
# v6.9~27 "tests: workaround net-yy-inet* for new kernels"
Patch0001: 0001-tests-workaround-net-yy-inet-for-new-kernels.patch
BuildRequires: xz BuildRequires: xz
%else %else
Source: strace-%{version}.tar.gz Source: strace-%{version}.tar.gz
@ -136,6 +133,27 @@ BuildRequires: pkgconfig(bluez)
%{?!buildroot:BuildRoot: %_tmppath/buildroot-%name-%version-%release} %{?!buildroot:BuildRoot: %_tmppath/buildroot-%name-%version-%release}
%define maybe_use_defattr %{?suse_version:%%defattr(-,root,root)} %define maybe_use_defattr %{?suse_version:%%defattr(-,root,root)}
## https://issues.redhat.com/browse/RHEL-8570
# v6.11-21-gc7e0ea6d7 "syscall: do not use uninitialized parts of struct ptrace_syscall_info"
Patch183: 0183-syscall-do-not-use-uninitialized-parts-of-struct-ptr.patch
# v6.11-22-g2048c136b "startup_tcb: add a comment"
Patch184: 0184-startup_tcb-add-a-comment.patch
# v6.11-23-g3bf08cbb3 "tests: add another test of restart_syscall decoding"
Patch185: 0185-tests-add-another-test-of-restart_syscall-decoding.patch
## kernel-5.14.0-417.el9~9 (RHEL 9.4+) has v6.8-rc1~131^2~223 "tcp: Dump bound-only sockets in inet_diag."
# v6.9~27 "tests: workaround net-yy-inet* for new kernels"
Patch186: 0186-tests-workaround-net-yy-inet-for-new-kernels.patch
## Update linkat--secontext_mismatch test to fix the failures reported by QE
# v6.11~4 "tests: avoid linkat--secontext_mismatch failures on setfilecon errors"
Patch187: 0187-tests-avoid-linkat-secontext_mismatch-failures-on-se.patch
# "linux/s390/get_scno.c: use NT_S390_SYSTEM_CALL if gprs[2] is clobbered"
Patch188: 0188-linux-s390-get_scno.c-use-NT_S390_SYSTEM_CALL-if-gpr.patch
# "tests: move k_setsockopt definition into a separate"
Patch189: 0189-tests-move-k_setsockopt-definition-into-a-separate-f.patch
# "tests/sockopt-timestamp.c: use k_getsockopt and k_setsockopt"
Patch190: 0190-tests-sockopt-timestamp.c-use-k_getsockopt-and-k_set.patch
# Fallback definitions for make_build/make_install macros # Fallback definitions for make_build/make_install macros
%{?!__make: %global __make %_bindir/make} %{?!__make: %global __make %_bindir/make}
%{?!__install: %global __install %_bindir/install} %{?!__install: %global __install %_bindir/install}
@ -154,13 +172,24 @@ received by a process.
%prep %prep
%setup -q %setup -q
%patch 183 -p1
%patch 184 -p1
%patch 185 -p1
%patch 186 -p1
%patch 187 -p1
%patch 188 -p1
%patch 189 -p1
%patch 190 -p1
chmod a+x tests/*.test
echo -n %version-%release > .tarball-version echo -n %version-%release > .tarball-version
echo -n 2024 > .year echo -n 2024 > .year
echo -n 2023-11-21 > doc/.strace.1.in.date echo -n 2023-11-21 > doc/.strace.1.in.date
echo -n 2022-01-01 > doc/.strace-log-merge.1.in.date echo -n 2022-01-01 > doc/.strace-log-merge.1.in.date
%patch0001 -p1
%build %build
echo 'BEGIN OF BUILD ENVIRONMENT INFORMATION' echo 'BEGIN OF BUILD ENVIRONMENT INFORMATION'
uname -a |head -1 uname -a |head -1
@ -211,6 +240,11 @@ fi
%{_mandir}/man1/* %{_mandir}/man1/*
%changelog %changelog
* Tue Oct 29 2024 Eugene Syromiatnikov <esyr@redhat.com> - 6.7-5
- Fix incorrect syscall name reporting in restart_syscall() on attach when
PTRACE_GET_SYSCALL_INFO is in use (RHEL-65108).
- Update net-yy-inet* and linkat--secontext_mismatch tests.
* Tue Oct 29 2024 Troy Dawson <tdawson@redhat.com> - 6.7-4 * Tue Oct 29 2024 Troy Dawson <tdawson@redhat.com> - 6.7-4
- Bump release for October 2024 mass rebuild: - Bump release for October 2024 mass rebuild:
Resolves: RHEL-64018 Resolves: RHEL-64018