diff --git a/0183-syscall-do-not-use-uninitialized-parts-of-struct-ptr.patch b/0183-syscall-do-not-use-uninitialized-parts-of-struct-ptr.patch new file mode 100644 index 0000000..d38d55a --- /dev/null +++ b/0183-syscall-do-not-use-uninitialized-parts-of-struct-ptr.patch @@ -0,0 +1,102 @@ +From c7e0ea6d712eb214dafe7e9eae57661d9a427ea7 Mon Sep 17 00:00:00 2001 +From: "Dmitry V. Levin" +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 + diff --git a/0184-startup_tcb-add-a-comment.patch b/0184-startup_tcb-add-a-comment.patch new file mode 100644 index 0000000..39e7757 --- /dev/null +++ b/0184-startup_tcb-add-a-comment.patch @@ -0,0 +1,37 @@ +From 2048c136ba6edc4282dbc976c499e038d5b60c03 Mon Sep 17 00:00:00 2001 +From: "Dmitry V. Levin" +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 + diff --git a/0185-tests-add-another-test-of-restart_syscall-decoding.patch b/0185-tests-add-another-test-of-restart_syscall-decoding.patch new file mode 100644 index 0000000..c6252ae --- /dev/null +++ b/0185-tests-add-another-test-of-restart_syscall-decoding.patch @@ -0,0 +1,129 @@ +From 3bf08cbb388a89014252bdfe5143324bdaa4dc46 Mon Sep 17 00:00:00 2001 +From: "Dmitry V. Levin" +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 \ diff --git a/0186-tests-workaround-net-yy-inet-for-new-kernels.patch b/0186-tests-workaround-net-yy-inet-for-new-kernels.patch new file mode 100644 index 0000000..e24b974 --- /dev/null +++ b/0186-tests-workaround-net-yy-inet-for-new-kernels.patch @@ -0,0 +1,108 @@ +From e9d784ecd3ef0c5af9f8c74a830e797d773d71cb Mon Sep 17 00:00:00 2001 +From: "Dmitry V. Levin" +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 + diff --git a/0187-tests-avoid-linkat-secontext_mismatch-failures-on-se.patch b/0187-tests-avoid-linkat-secontext_mismatch-failures-on-se.patch new file mode 100644 index 0000000..715b3e8 --- /dev/null +++ b/0187-tests-avoid-linkat-secontext_mismatch-failures-on-se.patch @@ -0,0 +1,530 @@ +From 660186018897b386fb05d7951aec57a81211a1a4 Mon Sep 17 00:00:00 2001 +From: Eugene Syromyatnikov +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 . +(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 +--- + 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 + + #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 + #include + + 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 + + #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 + #include + + 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 + + #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 + #include + + 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 + diff --git a/0188-linux-s390-get_scno.c-use-NT_S390_SYSTEM_CALL-if-gpr.patch b/0188-linux-s390-get_scno.c-use-NT_S390_SYSTEM_CALL-if-gpr.patch new file mode 100644 index 0000000..eb4220a --- /dev/null +++ b/0188-linux-s390-get_scno.c-use-NT_S390_SYSTEM_CALL-if-gpr.patch @@ -0,0 +1,76 @@ +From d08dfdebb381427cbd8565994868926ba9bc4b40 Mon Sep 17 00:00:00 2001 +From: Eugene Syromyatnikov +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 + diff --git a/0189-tests-move-k_setsockopt-definition-into-a-separate-f.patch b/0189-tests-move-k_setsockopt-definition-into-a-separate-f.patch new file mode 100644 index 0000000..7688ddb --- /dev/null +++ b/0189-tests-move-k_setsockopt-definition-into-a-separate-f.patch @@ -0,0 +1,698 @@ +From e7f488a6d267001214636507c79210af57c2c6a7 Mon Sep 17 00:00:00 2001 +From: Eugene Syromyatnikov +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 ++ * 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 ++#include ++ ++#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 ++ * 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 ++ * 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 ++#include ++ ++#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 ++ * 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 ++ * 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 ++#include ++ ++#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 ++ * 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 diff --git a/0190-tests-sockopt-timestamp.c-use-k_getsockopt-and-k_set.patch b/0190-tests-sockopt-timestamp.c-use-k_getsockopt-and-k_set.patch new file mode 100644 index 0000000..07ba684 --- /dev/null +++ b/0190-tests-sockopt-timestamp.c-use-k_getsockopt-and-k_set.patch @@ -0,0 +1,60 @@ +From cbda4efac4d55f8b3bf6622cdb764d2375a2cf3a Mon Sep 17 00:00:00 2001 +From: Eugene Syromyatnikov +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 + #include + ++#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 + diff --git a/strace.spec b/strace.spec index f3fd7c4..f8ea188 100644 --- a/strace.spec +++ b/strace.spec @@ -1,7 +1,7 @@ Summary: Tracks and displays system calls associated with a running process Name: strace Version: 6.7 -Release: 1%{?dist} +Release: 2%{?dist} # The test suite is GPLv2+, the bundled headers are GPLv2 with Linux syscall # exception, all the rest is LGPLv2.1+. # https://docs.fedoraproject.org/en-US/legal/license-field/#_no_effective_license_analysis @@ -176,6 +176,27 @@ BuildRequires: pkgconfig(bluez) ## v5.18-21-g5338636 "tests/bpf: fix sloppy low FD number usage" #Patch182: 0182-tests-bpf-fix-sloppy-low-FD-number-usage.patch +## 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 %{?!__make: %global __make %_bindir/make} %{?!__install: %global __install %_bindir/install} @@ -221,6 +242,16 @@ received by a process. #%patch181 -p1 #%patch182 -p1 +%patch183 -p1 +%patch184 -p1 +%patch185 -p1 + +%patch186 -p1 +%patch187 -p1 +%patch188 -p1 +%patch189 -p1 +%patch190 -p1 + chmod a+x tests/*.test echo -n %version-%release > .tarball-version @@ -288,7 +319,12 @@ fi %{_mandir}/man1/* %changelog -* Wed Feb 01 2024 Eugene Syromiatnikov - 6.7-1 +* Tue Oct 29 2024 Eugene Syromiatnikov - 6.7-2 +- Fix incorrect syscall name reporting in restart_syscall() on attach when + PTRACE_GET_SYSCALL_INFO is in use (RHEL-65109). +- Update net-yy-inet* and linkat--secontext_mismatch tests. + +* Thu Feb 01 2024 Eugene Syromiatnikov - 6.7-1 - Rebase to v6.7; drop upstream patches on top of 5.18 (RHEL-8646). - Updated the SPDX license expression.