diff --git a/.devtoolset-12-strace.metadata b/.devtoolset-12-strace.metadata new file mode 100644 index 0000000..276bae2 --- /dev/null +++ b/.devtoolset-12-strace.metadata @@ -0,0 +1 @@ +e038ea9fc29366ce6119cde27d8cf16ac554a353 SOURCES/strace-5.18.tar.xz diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8711380 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/strace-5.18.tar.xz diff --git a/SOURCES/0175-src-xlat-remove-remnants-of-unnecessary-idx-usage-in.patch b/SOURCES/0175-src-xlat-remove-remnants-of-unnecessary-idx-usage-in.patch new file mode 100644 index 0000000..a393a8e --- /dev/null +++ b/SOURCES/0175-src-xlat-remove-remnants-of-unnecessary-idx-usage-in.patch @@ -0,0 +1,58 @@ +From 2bf069698a384ff2bc62d2a10544d49d766b4d7f Mon Sep 17 00:00:00 2001 +From: Eugene Syromyatnikov +Date: Mon, 27 Jun 2022 18:00:17 +0200 +Subject: [PATCH] src/xlat: remove remnants of unnecessary idx usage in xlookup + +As there is no idx saving between calls anymore, there's no need to use +(and update) idx in the XT_SORTED case. Reported by clang as a dead store: + + Error: CLANG_WARNING: + strace-5.18/src/xlat.c:84:4: warning[deadcode.DeadStores]: Value stored to 'idx' is never read + +* src/xlat.c (xlookup): Remove idx declaration; declare idx inside +of the for loop in the XT_NORMAL case; do not offset x->data and x->size +by offs in the XT_SORTED case and do not update idx upon successful +lookup. + +Complements: v5.15~164 "xlat: no longer interpret NULL xlat as continuation" +--- + src/xlat.c | 10 +++------- + 1 file changed, 3 insertions(+), 7 deletions(-) + +Index: strace-5.18/src/xlat.c +=================================================================== +--- strace-5.18.orig/src/xlat.c 2022-07-12 17:11:52.660927011 +0200 ++++ strace-5.18/src/xlat.c 2022-07-12 17:16:18.116794139 +0200 +@@ -61,7 +61,6 @@ + const char * + xlookup(const struct xlat *x, const uint64_t val) + { +- size_t idx = 0; + const struct xlat_data *e; + + if (!x || !x->data) +@@ -69,21 +68,18 @@ + + switch (x->type) { + case XT_NORMAL: +- for (; idx < x->size; idx++) ++ for (size_t idx = 0; idx < x->size; idx++) + if (x->data[idx].val == val) + return x->data[idx].str; + break; + + case XT_SORTED: + e = bsearch((const void *) &val, +- x->data + idx, +- x->size - idx, ++ x->data, x->size, + sizeof(x->data[0]), + xlat_bsearch_compare); +- if (e) { +- idx = e - x->data; ++ if (e) + return e->str; +- } + break; + + case XT_INDEXED: diff --git a/SOURCES/0176-strauss-tips-whitespace-and-phrasing-cleanups.patch b/SOURCES/0176-strauss-tips-whitespace-and-phrasing-cleanups.patch new file mode 100644 index 0000000..1c132f9 --- /dev/null +++ b/SOURCES/0176-strauss-tips-whitespace-and-phrasing-cleanups.patch @@ -0,0 +1,56 @@ +From e604d7bfd18cf5f29e6723091cc1db2945c918c9 Mon Sep 17 00:00:00 2001 +From: Eugene Syromyatnikov +Date: Tue, 28 Jun 2022 16:46:53 +0200 +Subject: [PATCH] strauss: tips whitespace and phrasing cleanups + +* src/strauss.c (tips_tricks_tweaks): Fix some whitespace and phrasing +issues. +--- + src/strauss.c | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +Index: strace-5.18/src/strauss.c +=================================================================== +--- strace-5.18.orig/src/strauss.c 2022-07-12 17:17:08.712197019 +0200 ++++ strace-5.18/src/strauss.c 2022-07-12 17:17:20.685055717 +0200 +@@ -128,8 +128,8 @@ + { "strace is about as old as the Linux kernel.", + "It has been originally written for SunOS", + "by Paul Kranenburg in 1991. The support", +- "for all OSes except Linux has been dropped", +- "since 2012, though, in strace 4.7." }, ++ "for all OSes except Linux was dropped" ++ "in 2012, though, in strace 4.7." }, + { "strace is able to decode netlink messages.", + "It does so automatically for I/O performed", + "on netlink sockets. Try it yourself:", "", +@@ -187,7 +187,7 @@ + "want to try --seccomp-bpf option, maybe you", + "will feel better." }, + { "-v is a shorthand for -e abbrev=none and not", +- " for -e verbose=all. It is idiosyncratic,", ++ "for -e verbose=all. It is idiosyncratic,", + "but it is the historic behaviour." }, + { "strace uses netlink for printing", + "protocol-specific information about socket", +@@ -254,7 +254,7 @@ + "by invoking it with the following options:", "", + " strace -DDDqqq -enone --signal=none" }, + { "Historically, supplying -o option to strace", +- "led to silencing of messages about tracee", ++ "leads to silencing of messages about tracee", + "attach/detach and personality changes.", + "It can be now overridden with --quiet=none", + "option." }, +@@ -285,8 +285,9 @@ + "will trace all syscalls related to accessing", + "and modifying process's user/group IDs", + "and capability sets. Other pre-defined", +- "syscall classes include %clock, %desc,%file,", +- "%ipc,%memory, %net,%process, and %signal." }, ++ "syscall classes include %clock, %desc," ++ "%file, %ipc, %memory, %net, %process," ++ "and %signal." }, + { "Trying to figure out communication between", + "tracees inside a different PID namespace", + "(in so-called \"containers\", for example)?", diff --git a/SOURCES/0177-strauss-fix-off-by-one-error-in-strauss-array-access.patch b/SOURCES/0177-strauss-fix-off-by-one-error-in-strauss-array-access.patch new file mode 100644 index 0000000..3faa9a4 --- /dev/null +++ b/SOURCES/0177-strauss-fix-off-by-one-error-in-strauss-array-access.patch @@ -0,0 +1,48 @@ +From 968789d5426442ac43b96eabd65f3e5c0c141e62 Mon Sep 17 00:00:00 2001 +From: Eugene Syromyatnikov +Date: Tue, 28 Jun 2022 16:47:56 +0200 +Subject: [PATCH] strauss: fix off-by-one error in strauss array access + +It has to be limited with strauss_lines - 1, not strauss_lines. +Reported by covscan: + + Error: OVERRUN (CWE-119): + strace-5.18/src/strauss.c:380: cond_at_least: Checking "4UL + i < 37UL" + implies that "i" is at least 33 on the false branch. + strace-5.18/src/strauss.c:380: overrun-local: Overrunning array "strauss" + of 37 8-byte elements at element index 37 (byte offset 303) using index + "(4UL + i < 37UL) ? 4UL + i : 37UL" (which evaluates to 37). + +* src/strauss.c (print_totd): Limit strauss array accesses to +strauss_lines - 1 instead of strauss_lines. +--- + src/strauss.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/src/strauss.c b/src/strauss.c +index 98af183..b22ab6a 100644 +--- a/src/strauss.c ++++ b/src/strauss.c +@@ -373,16 +373,16 @@ print_totd(void) + tip_left[MIN(i + 1, ARRAY_SIZE(tip_left) - 1)], + w, w, tips_tricks_tweaks[id][i] ?: "", + tip_right[MIN(i + 1, ARRAY_SIZE(tip_right) - 1)], +- strauss[MIN(3 + i, strauss_lines)]); ++ strauss[MIN(3 + i, strauss_lines - 1)]); + } + fprintf(stderr, "%s%s\n", +- tip_bottom, strauss[MIN(3 + i, strauss_lines)]); ++ tip_bottom, strauss[MIN(3 + i, strauss_lines - 1)]); + do { + fprintf(stderr, "%*s%*s%*s%s\n", + (int) strlen(tip_left[0]), "", + w, "", + (int) strlen(tip_right[0]), "", +- strauss[MIN(4 + i, strauss_lines)]); ++ strauss[MIN(4 + i, strauss_lines - 1)]); + } while ((show_tips == TIPS_FULL) && (4 + ++i < strauss_lines)); + + printed = true; +-- +2.1.4 + diff --git a/SOURCES/0178-util-add-offs-sanity-check-to-print_clock_t.patch b/SOURCES/0178-util-add-offs-sanity-check-to-print_clock_t.patch new file mode 100644 index 0000000..1924ea1 --- /dev/null +++ b/SOURCES/0178-util-add-offs-sanity-check-to-print_clock_t.patch @@ -0,0 +1,62 @@ +From 6d3e97e83a7d61cbb2f5109efb4b519383a55712 Mon Sep 17 00:00:00 2001 +From: Eugene Syromyatnikov +Date: Tue, 28 Jun 2022 16:55:49 +0200 +Subject: [PATCH] util: add offs sanity check to print_clock_t + +While it is not strictly needed right now, the code that uses +the calculated offs value lacks any checks for possible buf overruns, +which is not defensive enough, so let's add them. Reported by covscan: + + Error: OVERRUN (CWE-119): + strace-5.18/src/util.c:248: assignment: Assigning: + "offs" = "ilog10(val / clk_tck)". The value of "offs" is now between + 16 and 31 (inclusive). + strace-5.18/src/util.c:249: overrun-local: Overrunning array of 30 bytes + at byte offset 31 by dereferencing pointer "buf + offs". [Note: The source + code implementation of the function has been overridden by a builtin model.] + + Error: OVERRUN (CWE-119): + strace-5.18/src/util.c:248: assignment: Assigning: + "offs" = "ilog10(val / clk_tck)". The value of "offs" is now between + 16 and 31 (inclusive). + strace-5.18/src/util.c:253: overrun-buffer-arg: Overrunning array "buf" + of 30 bytes by passing it to a function which accesses it at byte offset + 32 using argument "offs + 2UL" (which evaluates to 33). [Note: The source + code implementation of the function has been overridden by a builtin model.] + + Error: OVERRUN (CWE-119): + strace-5.18/src/util.c:248: assignment: Assigning: + "offs" = "ilog10(val / clk_tck)". The value of "offs" is now between + 16 and 31 (inclusive). + strace-5.18/src/util.c:254: overrun-local: Overrunning array "buf" + of 30 bytes at byte offset 32 using index "offs + 1UL" (which evaluates + to 32). + +* src/util.c (print_clock_t): Add check that offs is small enough +for it and "offs + 2" not to overrun buf. +--- + src/util.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/src/util.c b/src/util.c +index 5f87acb..93aa7b3 100644 +--- a/src/util.c ++++ b/src/util.c +@@ -246,6 +246,14 @@ print_clock_t(uint64_t val) + */ + char buf[sizeof(uint64_t) * 3 + sizeof("0.0 s")]; + size_t offs = ilog10(val / clk_tck); ++ /* ++ * This check is mostly to appease covscan, which thinks ++ * that offs can go as high as 31 (it cannot), but since ++ * there is no proper sanity checks against offs overrunning ++ * buf down the code, it may as well be here. ++ */ ++ if (offs > (sizeof(buf) - sizeof("0.0 s"))) ++ return; + int ret = snprintf(buf + offs, sizeof(buf) - offs, "%.*f s", + frac_width, + (double) (val % clk_tck) / clk_tck); +-- +2.1.4 + diff --git a/SOURCES/0179-secontext-print-context-of-Unix-socket-s-sun_path-fi.patch b/SOURCES/0179-secontext-print-context-of-Unix-socket-s-sun_path-fi.patch new file mode 100644 index 0000000..1bf7cb7 --- /dev/null +++ b/SOURCES/0179-secontext-print-context-of-Unix-socket-s-sun_path-fi.patch @@ -0,0 +1,882 @@ +From 960e78f208b4f6d48962bbc9cad45588cc8c90ad Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Renaud=20M=C3=A9trich?= +Date: Tue, 21 Jun 2022 08:43:00 +0200 +Subject: [PATCH] secontext: print context of Unix socket's sun_path field +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Renaud Métrich + +* src/sockaddr.c: Include "secontext.h". +(print_sockaddr_data_un): Print the SELinux context of sun_path field +using selinux_printfilecon. +* NEWS: Mention this change. +* tests/secontext.c (raw_secontext_full_fd, get_secontext_field_fd, +raw_secontext_short_fd, secontext_full_fd, secontext_short_fd): New +functions. +* tests/secontext.h (secontext_full_fd, secontext_short_fd, +get_secontext_field_fd): New prototypes. +(SECONTEXT_FD): New macro. +* tests/sockname.c: Include "secontext.h". +(test_sockname_syscall): Update expected output. +* tests/gen_tests.in (getsockname--secontext, +getsockname--secontext_full, getsockname--secontext_full_mismatch, +getsockname--secontext_mismatch): New tests. + +Resolves: https://github.com/strace/strace/pull/214 +--- + NEWS | 1 + + src/sockaddr.c | 3 +++ + tests/gen_tests.in | 4 ++++ + tests/secontext.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ + tests/secontext.h | 12 ++++++++++++ + tests/sockname.c | 54 +++++++++++++++++++++++++++++++++++------------------- + 6 files changed, 104 insertions(+), 19 deletions(-) + +Index: strace-5.18/NEWS +=================================================================== +--- strace-5.18.orig/NEWS 2022-07-12 18:20:18.495470531 +0200 ++++ strace-5.18/NEWS 2022-07-12 18:20:44.531163262 +0200 +@@ -5,6 +5,7 @@ + * Added an interface of raising des Strausses awareness. + * Added --tips option to print strace tips, tricks, and tweaks + at the end of the tracing session. ++ * Implemented printing of Unix socket sun_path field's SELinux context. + * Enhanced decoding of bpf and io_uring_register syscalls. + * Implemented decoding of COUNTER_*, RTC_PARAM_GET, and RTC_PARAM_SET ioctl + commands. +Index: strace-5.18/src/sockaddr.c +=================================================================== +--- strace-5.18.orig/src/sockaddr.c 2022-07-12 18:17:36.745379483 +0200 ++++ strace-5.18/src/sockaddr.c 2022-07-12 18:20:18.495470531 +0200 +@@ -63,6 +63,8 @@ + #include "xlat/mctp_addrs.h" + #include "xlat/mctp_nets.h" + ++#include "secontext.h" ++ + #define SIZEOF_SA_FAMILY sizeof_field(struct sockaddr, sa_family) + + struct sockaddr_rxrpc { +@@ -115,6 +117,7 @@ + if (sa_un->sun_path[0]) { + print_quoted_string(sa_un->sun_path, path_len + 1, + QUOTE_0_TERMINATED); ++ selinux_printfilecon(tcp, sa_un->sun_path); + } else { + tprints("@"); + print_quoted_string(sa_un->sun_path + 1, path_len - 1, 0); +Index: strace-5.18/tests/gen_tests.in +=================================================================== +--- strace-5.18.orig/tests/gen_tests.in 2022-07-12 18:17:36.746379471 +0200 ++++ strace-5.18/tests/gen_tests.in 2022-07-12 18:20:18.496470519 +0200 +@@ -225,6 +225,10 @@ + getsid -a10 + getsid--pidns-translation test_pidns -e trace=getsid -a10 + getsockname -a27 ++getsockname--secontext -a27 --secontext -e trace=getsockname ++getsockname--secontext_full -a27 --secontext=full -e trace=getsockname ++getsockname--secontext_full_mismatch -a27 --secontext=full,mismatch -e trace=getsockname ++getsockname--secontext_mismatch -a27 --secontext=mismatch -e trace=getsockname + gettid -a9 + getuid-creds +getuid.test + getuid32 +getuid.test +Index: strace-5.18/tests/secontext.c +=================================================================== +--- strace-5.18.orig/tests/secontext.c 2022-07-12 18:17:36.747379459 +0200 ++++ strace-5.18/tests/secontext.c 2022-07-12 18:20:18.496470519 +0200 +@@ -141,6 +141,21 @@ + return full_secontext; + } + ++static char * ++raw_secontext_full_fd(int fd) ++{ ++ int saved_errno = errno; ++ char *full_secontext = NULL; ++ char *secontext; ++ ++ if (fgetfilecon(fd, &secontext) >= 0) { ++ full_secontext = strip_trailing_newlines(xstrdup(secontext)); ++ freecon(secontext); ++ } ++ errno = saved_errno; ++ return full_secontext; ++} ++ + char * + get_secontext_field_file(const char *file, enum secontext_field field) + { +@@ -151,6 +166,16 @@ + return type; + } + ++char * ++get_secontext_field_fd(int fd, enum secontext_field field) ++{ ++ char *ctx = raw_secontext_full_fd(fd); ++ char *type = get_secontext_field(ctx, field); ++ free(ctx); ++ ++ return type; ++} ++ + static char * + raw_secontext_short_file(const char *filename) + { +@@ -158,6 +183,12 @@ + } + + static char * ++raw_secontext_short_fd(int fd) ++{ ++ return get_secontext_field_fd(fd, SECONTEXT_TYPE); ++} ++ ++static char * + raw_secontext_full_pid(pid_t pid) + { + int saved_errno = errno; +@@ -205,6 +236,15 @@ + } + + char * ++secontext_full_fd(int fd) ++{ ++ int saved_errno = errno; ++ char *context = raw_secontext_full_fd(fd); ++ errno = saved_errno; ++ return FORMAT_SPACE_BEFORE(context); ++} ++ ++char * + secontext_full_pid(pid_t pid) + { + return FORMAT_SPACE_AFTER(raw_secontext_full_pid(pid)); +@@ -228,6 +268,15 @@ + errno = saved_errno; + return FORMAT_SPACE_BEFORE(context); + } ++ ++char * ++secontext_short_fd(int fd) ++{ ++ int saved_errno = errno; ++ char *context = raw_secontext_short_fd(fd); ++ errno = saved_errno; ++ return FORMAT_SPACE_BEFORE(context); ++} + + char * + secontext_short_pid(pid_t pid) +Index: strace-5.18/tests/secontext.h +=================================================================== +--- strace-5.18.orig/tests/secontext.h 2022-07-12 18:17:36.747379459 +0200 ++++ strace-5.18/tests/secontext.h 2022-07-12 18:20:18.496470519 +0200 +@@ -9,9 +9,11 @@ + #include "xmalloc.h" + #include + ++char *secontext_full_fd(int) ATTRIBUTE_MALLOC; + char *secontext_full_file(const char *, bool) ATTRIBUTE_MALLOC; + char *secontext_full_pid(pid_t) ATTRIBUTE_MALLOC; + ++char *secontext_short_fd(int) ATTRIBUTE_MALLOC; + char *secontext_short_file(const char *, bool) ATTRIBUTE_MALLOC; + char *secontext_short_pid(pid_t) ATTRIBUTE_MALLOC; + +@@ -30,6 +32,7 @@ + */ + 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); +@@ -44,6 +47,7 @@ + # else + # define SECONTEXT_FILE(filename) secontext_full_file(filename, false) + # endif ++# define SECONTEXT_FD(fd) secontext_full_fd(fd) + # define SECONTEXT_PID(pid) secontext_full_pid(pid) + + # else +@@ -53,6 +57,7 @@ + # else + # define SECONTEXT_FILE(filename) secontext_short_file(filename, false) + # endif ++# define SECONTEXT_FD(fd) secontext_short_fd(fd) + # define SECONTEXT_PID(pid) secontext_short_pid(pid) + + # endif +@@ -65,6 +70,12 @@ + return NULL; + } + static inline char * ++get_secontext_field_fd(int fd, enum secontext_field field) ++{ ++ return NULL; ++} ++ ++static inline char * + get_secontext_field_file(const char *file, enum secontext_field field) + { + return NULL; +@@ -81,6 +92,7 @@ + { + } + ++# define SECONTEXT_FD(fd) xstrdup("") + # define SECONTEXT_FILE(filename) xstrdup("") + # define SECONTEXT_PID(pid) xstrdup("") + +Index: strace-5.18/tests/sockname.c +=================================================================== +--- strace-5.18.orig/tests/sockname.c 2022-07-12 18:17:36.748379448 +0200 ++++ strace-5.18/tests/sockname.c 2022-07-12 18:20:18.496470519 +0200 +@@ -18,6 +18,8 @@ + #include + #include + ++#include "secontext.h" ++ + #ifndef TEST_SYSCALL_NAME + # error TEST_SYSCALL_NAME must be defined + #endif +@@ -59,14 +61,19 @@ + *plen = sizeof(struct sockaddr_un); + struct sockaddr_un *addr = tail_alloc(*plen); + ++ char *my_secontext = SECONTEXT_PID_MY(); ++ char *fd_secontext = SECONTEXT_FD(fd); ++ + PREPARE_TEST_SYSCALL_INVOCATION; + int rc = TEST_SYSCALL_NAME(fd PREFIX_S_ARGS, (void *) addr, + plen SUFFIX_ARGS); + if (rc < 0) + perror_msg_and_skip(TEST_SYSCALL_STR); +- printf("%s(%d%s, {sa_family=AF_UNIX, sun_path=\"%s\"}" ++ printf("%s%s(%d%s%s, {sa_family=AF_UNIX, sun_path=\"%s\"%s}" + ", [%d => %d]%s) = %d\n", +- TEST_SYSCALL_STR, fd, PREFIX_S_STR, addr->sun_path, ++ my_secontext, ++ TEST_SYSCALL_STR, fd, fd_secontext, PREFIX_S_STR, ++ addr->sun_path, SECONTEXT_FILE(addr->sun_path), + (int) sizeof(struct sockaddr_un), (int) *plen, SUFFIX_STR, rc); + + memset(addr, 0, sizeof(*addr)); +@@ -75,28 +82,34 @@ + plen SUFFIX_ARGS); + if (rc < 0) + perror_msg_and_skip(TEST_SYSCALL_STR); +- printf("%s(%d%s, {sa_family=AF_UNIX, sun_path=\"%s\"}" ++ printf("%s%s(%d%s%s, {sa_family=AF_UNIX, sun_path=\"%s\"%s}" + ", [%d]%s) = %d\n", +- TEST_SYSCALL_STR, fd, PREFIX_S_STR, addr->sun_path, ++ my_secontext, ++ TEST_SYSCALL_STR, fd, fd_secontext, PREFIX_S_STR, ++ addr->sun_path, SECONTEXT_FILE(addr->sun_path), + (int) *plen, SUFFIX_STR, rc); + + PREPARE_TEST_SYSCALL_INVOCATION; + rc = TEST_SYSCALL_NAME(fd PREFIX_F_ARGS, (void *) addr, 0 SUFFIX_ARGS); +- printf("%s(%d%s, %p, NULL%s) = %s\n", +- TEST_SYSCALL_STR, fd, PREFIX_F_STR, addr, SUFFIX_STR, +- sprintrc(rc)); ++ printf("%s%s(%d%s%s, %p, NULL%s) = %s\n", ++ my_secontext, ++ TEST_SYSCALL_STR, fd, fd_secontext, PREFIX_F_STR, ++ addr, SUFFIX_STR, sprintrc(rc)); + + PREPARE_TEST_SYSCALL_INVOCATION; + rc = TEST_SYSCALL_NAME(fd PREFIX_S_ARGS, 0, 0 SUFFIX_ARGS); +- printf("%s(%d%s, NULL, NULL%s) = %s\n", +- TEST_SYSCALL_STR, fd, rc == -1 ? PREFIX_F_STR : PREFIX_S_STR, ++ printf("%s%s(%d%s%s, NULL, NULL%s) = %s\n", ++ my_secontext, ++ TEST_SYSCALL_STR, fd, fd_secontext, ++ rc == -1 ? PREFIX_F_STR : PREFIX_S_STR, + SUFFIX_STR, sprintrc(rc)); + + PREPARE_TEST_SYSCALL_INVOCATION; + rc = TEST_SYSCALL_NAME(fd PREFIX_F_ARGS, (void *) addr, + plen + 1 SUFFIX_ARGS); +- printf("%s(%d%s, %p, %p%s) = %s\n", +- TEST_SYSCALL_STR, fd, PREFIX_F_STR, addr, ++ printf("%s%s(%d%s%s, %p, %p%s) = %s\n", ++ my_secontext, ++ TEST_SYSCALL_STR, fd, fd_secontext, PREFIX_F_STR, addr, + plen + 1, SUFFIX_STR, sprintrc(rc)); + + const size_t offsetof_sun_path = offsetof(struct sockaddr_un, sun_path); +@@ -108,8 +121,9 @@ + plen SUFFIX_ARGS); + if (rc < 0) + perror_msg_and_skip(TEST_SYSCALL_STR); +- printf("%s(%d%s, {sa_family=AF_UNIX}, [%d => %d]%s) = %d\n", +- TEST_SYSCALL_STR, fd, PREFIX_S_STR, ++ printf("%s%s(%d%s%s, {sa_family=AF_UNIX}, [%d => %d]%s) = %d\n", ++ my_secontext, ++ TEST_SYSCALL_STR, fd, fd_secontext, PREFIX_S_STR, + (int) offsetof_sun_path, (int) *plen, SUFFIX_STR, rc); + + ++addr; +@@ -121,17 +135,19 @@ + plen SUFFIX_ARGS); + if (rc < 0) + perror_msg_and_skip(TEST_SYSCALL_STR); +- printf("%s(%d%s, {sa_family=AF_UNIX, sun_path=\"%.*s\"}" ++ printf("%s%s(%d%s%s, {sa_family=AF_UNIX, sun_path=\"%.*s\"%s}" + ", [%d => %d]%s) = %d\n", +- TEST_SYSCALL_STR, fd, PREFIX_S_STR, ++ my_secontext, ++ TEST_SYSCALL_STR, fd, fd_secontext, PREFIX_S_STR, + (int) (sizeof(struct sockaddr) - offsetof_sun_path), +- addr->sun_path, (int) sizeof(struct sockaddr), +- (int) *plen, SUFFIX_STR, rc); ++ addr->sun_path, SECONTEXT_FILE(addr->sun_path), ++ (int) sizeof(struct sockaddr), (int) *plen, SUFFIX_STR, rc); + + PREPARE_TEST_SYSCALL_INVOCATION; + rc = TEST_SYSCALL_NAME(fd PREFIX_F_ARGS, (void *) addr, + plen SUFFIX_ARGS); +- printf("%s(%d%s, %p, [%d]%s) = %s\n", +- TEST_SYSCALL_STR, fd, PREFIX_F_STR, addr, ++ printf("%s%s(%d%s%s, %p, [%d]%s) = %s\n", ++ my_secontext, ++ TEST_SYSCALL_STR, fd, fd_secontext, PREFIX_F_STR, addr, + *plen, SUFFIX_STR, sprintrc(rc)); + } +Index: strace-5.18/tests-m32/secontext.c +=================================================================== +--- strace-5.18.orig/tests-m32/secontext.c 2022-07-12 18:17:36.747379459 +0200 ++++ strace-5.18/tests-m32/secontext.c 2022-07-12 18:20:18.496470519 +0200 +@@ -141,6 +141,21 @@ + return full_secontext; + } + ++static char * ++raw_secontext_full_fd(int fd) ++{ ++ int saved_errno = errno; ++ char *full_secontext = NULL; ++ char *secontext; ++ ++ if (fgetfilecon(fd, &secontext) >= 0) { ++ full_secontext = strip_trailing_newlines(xstrdup(secontext)); ++ freecon(secontext); ++ } ++ errno = saved_errno; ++ return full_secontext; ++} ++ + char * + get_secontext_field_file(const char *file, enum secontext_field field) + { +@@ -151,6 +166,16 @@ + return type; + } + ++char * ++get_secontext_field_fd(int fd, enum secontext_field field) ++{ ++ char *ctx = raw_secontext_full_fd(fd); ++ char *type = get_secontext_field(ctx, field); ++ free(ctx); ++ ++ return type; ++} ++ + static char * + raw_secontext_short_file(const char *filename) + { +@@ -158,6 +183,12 @@ + } + + static char * ++raw_secontext_short_fd(int fd) ++{ ++ return get_secontext_field_fd(fd, SECONTEXT_TYPE); ++} ++ ++static char * + raw_secontext_full_pid(pid_t pid) + { + int saved_errno = errno; +@@ -205,6 +236,15 @@ + } + + char * ++secontext_full_fd(int fd) ++{ ++ int saved_errno = errno; ++ char *context = raw_secontext_full_fd(fd); ++ errno = saved_errno; ++ return FORMAT_SPACE_BEFORE(context); ++} ++ ++char * + secontext_full_pid(pid_t pid) + { + return FORMAT_SPACE_AFTER(raw_secontext_full_pid(pid)); +@@ -228,6 +268,15 @@ + errno = saved_errno; + return FORMAT_SPACE_BEFORE(context); + } ++ ++char * ++secontext_short_fd(int fd) ++{ ++ int saved_errno = errno; ++ char *context = raw_secontext_short_fd(fd); ++ errno = saved_errno; ++ return FORMAT_SPACE_BEFORE(context); ++} + + char * + secontext_short_pid(pid_t pid) +Index: strace-5.18/tests-m32/secontext.h +=================================================================== +--- strace-5.18.orig/tests-m32/secontext.h 2022-07-12 18:17:36.747379459 +0200 ++++ strace-5.18/tests-m32/secontext.h 2022-07-12 18:20:18.496470519 +0200 +@@ -9,9 +9,11 @@ + #include "xmalloc.h" + #include + ++char *secontext_full_fd(int) ATTRIBUTE_MALLOC; + char *secontext_full_file(const char *, bool) ATTRIBUTE_MALLOC; + char *secontext_full_pid(pid_t) ATTRIBUTE_MALLOC; + ++char *secontext_short_fd(int) ATTRIBUTE_MALLOC; + char *secontext_short_file(const char *, bool) ATTRIBUTE_MALLOC; + char *secontext_short_pid(pid_t) ATTRIBUTE_MALLOC; + +@@ -30,6 +32,7 @@ + */ + 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); +@@ -44,6 +47,7 @@ + # else + # define SECONTEXT_FILE(filename) secontext_full_file(filename, false) + # endif ++# define SECONTEXT_FD(fd) secontext_full_fd(fd) + # define SECONTEXT_PID(pid) secontext_full_pid(pid) + + # else +@@ -53,6 +57,7 @@ + # else + # define SECONTEXT_FILE(filename) secontext_short_file(filename, false) + # endif ++# define SECONTEXT_FD(fd) secontext_short_fd(fd) + # define SECONTEXT_PID(pid) secontext_short_pid(pid) + + # endif +@@ -65,6 +70,12 @@ + return NULL; + } + static inline char * ++get_secontext_field_fd(int fd, enum secontext_field field) ++{ ++ return NULL; ++} ++ ++static inline char * + get_secontext_field_file(const char *file, enum secontext_field field) + { + return NULL; +@@ -81,6 +92,7 @@ + { + } + ++# define SECONTEXT_FD(fd) xstrdup("") + # define SECONTEXT_FILE(filename) xstrdup("") + # define SECONTEXT_PID(pid) xstrdup("") + +Index: strace-5.18/tests-m32/sockname.c +=================================================================== +--- strace-5.18.orig/tests-m32/sockname.c 2022-07-12 18:17:36.748379448 +0200 ++++ strace-5.18/tests-m32/sockname.c 2022-07-12 18:20:18.496470519 +0200 +@@ -18,6 +18,8 @@ + #include + #include + ++#include "secontext.h" ++ + #ifndef TEST_SYSCALL_NAME + # error TEST_SYSCALL_NAME must be defined + #endif +@@ -59,14 +61,19 @@ + *plen = sizeof(struct sockaddr_un); + struct sockaddr_un *addr = tail_alloc(*plen); + ++ char *my_secontext = SECONTEXT_PID_MY(); ++ char *fd_secontext = SECONTEXT_FD(fd); ++ + PREPARE_TEST_SYSCALL_INVOCATION; + int rc = TEST_SYSCALL_NAME(fd PREFIX_S_ARGS, (void *) addr, + plen SUFFIX_ARGS); + if (rc < 0) + perror_msg_and_skip(TEST_SYSCALL_STR); +- printf("%s(%d%s, {sa_family=AF_UNIX, sun_path=\"%s\"}" ++ printf("%s%s(%d%s%s, {sa_family=AF_UNIX, sun_path=\"%s\"%s}" + ", [%d => %d]%s) = %d\n", +- TEST_SYSCALL_STR, fd, PREFIX_S_STR, addr->sun_path, ++ my_secontext, ++ TEST_SYSCALL_STR, fd, fd_secontext, PREFIX_S_STR, ++ addr->sun_path, SECONTEXT_FILE(addr->sun_path), + (int) sizeof(struct sockaddr_un), (int) *plen, SUFFIX_STR, rc); + + memset(addr, 0, sizeof(*addr)); +@@ -75,28 +82,34 @@ + plen SUFFIX_ARGS); + if (rc < 0) + perror_msg_and_skip(TEST_SYSCALL_STR); +- printf("%s(%d%s, {sa_family=AF_UNIX, sun_path=\"%s\"}" ++ printf("%s%s(%d%s%s, {sa_family=AF_UNIX, sun_path=\"%s\"%s}" + ", [%d]%s) = %d\n", +- TEST_SYSCALL_STR, fd, PREFIX_S_STR, addr->sun_path, ++ my_secontext, ++ TEST_SYSCALL_STR, fd, fd_secontext, PREFIX_S_STR, ++ addr->sun_path, SECONTEXT_FILE(addr->sun_path), + (int) *plen, SUFFIX_STR, rc); + + PREPARE_TEST_SYSCALL_INVOCATION; + rc = TEST_SYSCALL_NAME(fd PREFIX_F_ARGS, (void *) addr, 0 SUFFIX_ARGS); +- printf("%s(%d%s, %p, NULL%s) = %s\n", +- TEST_SYSCALL_STR, fd, PREFIX_F_STR, addr, SUFFIX_STR, +- sprintrc(rc)); ++ printf("%s%s(%d%s%s, %p, NULL%s) = %s\n", ++ my_secontext, ++ TEST_SYSCALL_STR, fd, fd_secontext, PREFIX_F_STR, ++ addr, SUFFIX_STR, sprintrc(rc)); + + PREPARE_TEST_SYSCALL_INVOCATION; + rc = TEST_SYSCALL_NAME(fd PREFIX_S_ARGS, 0, 0 SUFFIX_ARGS); +- printf("%s(%d%s, NULL, NULL%s) = %s\n", +- TEST_SYSCALL_STR, fd, rc == -1 ? PREFIX_F_STR : PREFIX_S_STR, ++ printf("%s%s(%d%s%s, NULL, NULL%s) = %s\n", ++ my_secontext, ++ TEST_SYSCALL_STR, fd, fd_secontext, ++ rc == -1 ? PREFIX_F_STR : PREFIX_S_STR, + SUFFIX_STR, sprintrc(rc)); + + PREPARE_TEST_SYSCALL_INVOCATION; + rc = TEST_SYSCALL_NAME(fd PREFIX_F_ARGS, (void *) addr, + plen + 1 SUFFIX_ARGS); +- printf("%s(%d%s, %p, %p%s) = %s\n", +- TEST_SYSCALL_STR, fd, PREFIX_F_STR, addr, ++ printf("%s%s(%d%s%s, %p, %p%s) = %s\n", ++ my_secontext, ++ TEST_SYSCALL_STR, fd, fd_secontext, PREFIX_F_STR, addr, + plen + 1, SUFFIX_STR, sprintrc(rc)); + + const size_t offsetof_sun_path = offsetof(struct sockaddr_un, sun_path); +@@ -108,8 +121,9 @@ + plen SUFFIX_ARGS); + if (rc < 0) + perror_msg_and_skip(TEST_SYSCALL_STR); +- printf("%s(%d%s, {sa_family=AF_UNIX}, [%d => %d]%s) = %d\n", +- TEST_SYSCALL_STR, fd, PREFIX_S_STR, ++ printf("%s%s(%d%s%s, {sa_family=AF_UNIX}, [%d => %d]%s) = %d\n", ++ my_secontext, ++ TEST_SYSCALL_STR, fd, fd_secontext, PREFIX_S_STR, + (int) offsetof_sun_path, (int) *plen, SUFFIX_STR, rc); + + ++addr; +@@ -121,17 +135,19 @@ + plen SUFFIX_ARGS); + if (rc < 0) + perror_msg_and_skip(TEST_SYSCALL_STR); +- printf("%s(%d%s, {sa_family=AF_UNIX, sun_path=\"%.*s\"}" ++ printf("%s%s(%d%s%s, {sa_family=AF_UNIX, sun_path=\"%.*s\"%s}" + ", [%d => %d]%s) = %d\n", +- TEST_SYSCALL_STR, fd, PREFIX_S_STR, ++ my_secontext, ++ TEST_SYSCALL_STR, fd, fd_secontext, PREFIX_S_STR, + (int) (sizeof(struct sockaddr) - offsetof_sun_path), +- addr->sun_path, (int) sizeof(struct sockaddr), +- (int) *plen, SUFFIX_STR, rc); ++ addr->sun_path, SECONTEXT_FILE(addr->sun_path), ++ (int) sizeof(struct sockaddr), (int) *plen, SUFFIX_STR, rc); + + PREPARE_TEST_SYSCALL_INVOCATION; + rc = TEST_SYSCALL_NAME(fd PREFIX_F_ARGS, (void *) addr, + plen SUFFIX_ARGS); +- printf("%s(%d%s, %p, [%d]%s) = %s\n", +- TEST_SYSCALL_STR, fd, PREFIX_F_STR, addr, ++ printf("%s%s(%d%s%s, %p, [%d]%s) = %s\n", ++ my_secontext, ++ TEST_SYSCALL_STR, fd, fd_secontext, PREFIX_F_STR, addr, + *plen, SUFFIX_STR, sprintrc(rc)); + } +Index: strace-5.18/tests-mx32/secontext.c +=================================================================== +--- strace-5.18.orig/tests-mx32/secontext.c 2022-07-12 18:17:36.747379459 +0200 ++++ strace-5.18/tests-mx32/secontext.c 2022-07-12 18:20:18.496470519 +0200 +@@ -141,6 +141,21 @@ + return full_secontext; + } + ++static char * ++raw_secontext_full_fd(int fd) ++{ ++ int saved_errno = errno; ++ char *full_secontext = NULL; ++ char *secontext; ++ ++ if (fgetfilecon(fd, &secontext) >= 0) { ++ full_secontext = strip_trailing_newlines(xstrdup(secontext)); ++ freecon(secontext); ++ } ++ errno = saved_errno; ++ return full_secontext; ++} ++ + char * + get_secontext_field_file(const char *file, enum secontext_field field) + { +@@ -151,6 +166,16 @@ + return type; + } + ++char * ++get_secontext_field_fd(int fd, enum secontext_field field) ++{ ++ char *ctx = raw_secontext_full_fd(fd); ++ char *type = get_secontext_field(ctx, field); ++ free(ctx); ++ ++ return type; ++} ++ + static char * + raw_secontext_short_file(const char *filename) + { +@@ -158,6 +183,12 @@ + } + + static char * ++raw_secontext_short_fd(int fd) ++{ ++ return get_secontext_field_fd(fd, SECONTEXT_TYPE); ++} ++ ++static char * + raw_secontext_full_pid(pid_t pid) + { + int saved_errno = errno; +@@ -205,6 +236,15 @@ + } + + char * ++secontext_full_fd(int fd) ++{ ++ int saved_errno = errno; ++ char *context = raw_secontext_full_fd(fd); ++ errno = saved_errno; ++ return FORMAT_SPACE_BEFORE(context); ++} ++ ++char * + secontext_full_pid(pid_t pid) + { + return FORMAT_SPACE_AFTER(raw_secontext_full_pid(pid)); +@@ -228,6 +268,15 @@ + errno = saved_errno; + return FORMAT_SPACE_BEFORE(context); + } ++ ++char * ++secontext_short_fd(int fd) ++{ ++ int saved_errno = errno; ++ char *context = raw_secontext_short_fd(fd); ++ errno = saved_errno; ++ return FORMAT_SPACE_BEFORE(context); ++} + + char * + secontext_short_pid(pid_t pid) +Index: strace-5.18/tests-mx32/secontext.h +=================================================================== +--- strace-5.18.orig/tests-mx32/secontext.h 2022-07-12 18:17:36.747379459 +0200 ++++ strace-5.18/tests-mx32/secontext.h 2022-07-12 18:20:18.496470519 +0200 +@@ -9,9 +9,11 @@ + #include "xmalloc.h" + #include + ++char *secontext_full_fd(int) ATTRIBUTE_MALLOC; + char *secontext_full_file(const char *, bool) ATTRIBUTE_MALLOC; + char *secontext_full_pid(pid_t) ATTRIBUTE_MALLOC; + ++char *secontext_short_fd(int) ATTRIBUTE_MALLOC; + char *secontext_short_file(const char *, bool) ATTRIBUTE_MALLOC; + char *secontext_short_pid(pid_t) ATTRIBUTE_MALLOC; + +@@ -30,6 +32,7 @@ + */ + 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); +@@ -44,6 +47,7 @@ + # else + # define SECONTEXT_FILE(filename) secontext_full_file(filename, false) + # endif ++# define SECONTEXT_FD(fd) secontext_full_fd(fd) + # define SECONTEXT_PID(pid) secontext_full_pid(pid) + + # else +@@ -53,6 +57,7 @@ + # else + # define SECONTEXT_FILE(filename) secontext_short_file(filename, false) + # endif ++# define SECONTEXT_FD(fd) secontext_short_fd(fd) + # define SECONTEXT_PID(pid) secontext_short_pid(pid) + + # endif +@@ -65,6 +70,12 @@ + return NULL; + } + static inline char * ++get_secontext_field_fd(int fd, enum secontext_field field) ++{ ++ return NULL; ++} ++ ++static inline char * + get_secontext_field_file(const char *file, enum secontext_field field) + { + return NULL; +@@ -81,6 +92,7 @@ + { + } + ++# define SECONTEXT_FD(fd) xstrdup("") + # define SECONTEXT_FILE(filename) xstrdup("") + # define SECONTEXT_PID(pid) xstrdup("") + +Index: strace-5.18/tests-mx32/sockname.c +=================================================================== +--- strace-5.18.orig/tests-mx32/sockname.c 2022-07-12 18:17:36.748379448 +0200 ++++ strace-5.18/tests-mx32/sockname.c 2022-07-12 18:20:18.496470519 +0200 +@@ -18,6 +18,8 @@ + #include + #include + ++#include "secontext.h" ++ + #ifndef TEST_SYSCALL_NAME + # error TEST_SYSCALL_NAME must be defined + #endif +@@ -59,14 +61,19 @@ + *plen = sizeof(struct sockaddr_un); + struct sockaddr_un *addr = tail_alloc(*plen); + ++ char *my_secontext = SECONTEXT_PID_MY(); ++ char *fd_secontext = SECONTEXT_FD(fd); ++ + PREPARE_TEST_SYSCALL_INVOCATION; + int rc = TEST_SYSCALL_NAME(fd PREFIX_S_ARGS, (void *) addr, + plen SUFFIX_ARGS); + if (rc < 0) + perror_msg_and_skip(TEST_SYSCALL_STR); +- printf("%s(%d%s, {sa_family=AF_UNIX, sun_path=\"%s\"}" ++ printf("%s%s(%d%s%s, {sa_family=AF_UNIX, sun_path=\"%s\"%s}" + ", [%d => %d]%s) = %d\n", +- TEST_SYSCALL_STR, fd, PREFIX_S_STR, addr->sun_path, ++ my_secontext, ++ TEST_SYSCALL_STR, fd, fd_secontext, PREFIX_S_STR, ++ addr->sun_path, SECONTEXT_FILE(addr->sun_path), + (int) sizeof(struct sockaddr_un), (int) *plen, SUFFIX_STR, rc); + + memset(addr, 0, sizeof(*addr)); +@@ -75,28 +82,34 @@ + plen SUFFIX_ARGS); + if (rc < 0) + perror_msg_and_skip(TEST_SYSCALL_STR); +- printf("%s(%d%s, {sa_family=AF_UNIX, sun_path=\"%s\"}" ++ printf("%s%s(%d%s%s, {sa_family=AF_UNIX, sun_path=\"%s\"%s}" + ", [%d]%s) = %d\n", +- TEST_SYSCALL_STR, fd, PREFIX_S_STR, addr->sun_path, ++ my_secontext, ++ TEST_SYSCALL_STR, fd, fd_secontext, PREFIX_S_STR, ++ addr->sun_path, SECONTEXT_FILE(addr->sun_path), + (int) *plen, SUFFIX_STR, rc); + + PREPARE_TEST_SYSCALL_INVOCATION; + rc = TEST_SYSCALL_NAME(fd PREFIX_F_ARGS, (void *) addr, 0 SUFFIX_ARGS); +- printf("%s(%d%s, %p, NULL%s) = %s\n", +- TEST_SYSCALL_STR, fd, PREFIX_F_STR, addr, SUFFIX_STR, +- sprintrc(rc)); ++ printf("%s%s(%d%s%s, %p, NULL%s) = %s\n", ++ my_secontext, ++ TEST_SYSCALL_STR, fd, fd_secontext, PREFIX_F_STR, ++ addr, SUFFIX_STR, sprintrc(rc)); + + PREPARE_TEST_SYSCALL_INVOCATION; + rc = TEST_SYSCALL_NAME(fd PREFIX_S_ARGS, 0, 0 SUFFIX_ARGS); +- printf("%s(%d%s, NULL, NULL%s) = %s\n", +- TEST_SYSCALL_STR, fd, rc == -1 ? PREFIX_F_STR : PREFIX_S_STR, ++ printf("%s%s(%d%s%s, NULL, NULL%s) = %s\n", ++ my_secontext, ++ TEST_SYSCALL_STR, fd, fd_secontext, ++ rc == -1 ? PREFIX_F_STR : PREFIX_S_STR, + SUFFIX_STR, sprintrc(rc)); + + PREPARE_TEST_SYSCALL_INVOCATION; + rc = TEST_SYSCALL_NAME(fd PREFIX_F_ARGS, (void *) addr, + plen + 1 SUFFIX_ARGS); +- printf("%s(%d%s, %p, %p%s) = %s\n", +- TEST_SYSCALL_STR, fd, PREFIX_F_STR, addr, ++ printf("%s%s(%d%s%s, %p, %p%s) = %s\n", ++ my_secontext, ++ TEST_SYSCALL_STR, fd, fd_secontext, PREFIX_F_STR, addr, + plen + 1, SUFFIX_STR, sprintrc(rc)); + + const size_t offsetof_sun_path = offsetof(struct sockaddr_un, sun_path); +@@ -108,8 +121,9 @@ + plen SUFFIX_ARGS); + if (rc < 0) + perror_msg_and_skip(TEST_SYSCALL_STR); +- printf("%s(%d%s, {sa_family=AF_UNIX}, [%d => %d]%s) = %d\n", +- TEST_SYSCALL_STR, fd, PREFIX_S_STR, ++ printf("%s%s(%d%s%s, {sa_family=AF_UNIX}, [%d => %d]%s) = %d\n", ++ my_secontext, ++ TEST_SYSCALL_STR, fd, fd_secontext, PREFIX_S_STR, + (int) offsetof_sun_path, (int) *plen, SUFFIX_STR, rc); + + ++addr; +@@ -121,17 +135,19 @@ + plen SUFFIX_ARGS); + if (rc < 0) + perror_msg_and_skip(TEST_SYSCALL_STR); +- printf("%s(%d%s, {sa_family=AF_UNIX, sun_path=\"%.*s\"}" ++ printf("%s%s(%d%s%s, {sa_family=AF_UNIX, sun_path=\"%.*s\"%s}" + ", [%d => %d]%s) = %d\n", +- TEST_SYSCALL_STR, fd, PREFIX_S_STR, ++ my_secontext, ++ TEST_SYSCALL_STR, fd, fd_secontext, PREFIX_S_STR, + (int) (sizeof(struct sockaddr) - offsetof_sun_path), +- addr->sun_path, (int) sizeof(struct sockaddr), +- (int) *plen, SUFFIX_STR, rc); ++ addr->sun_path, SECONTEXT_FILE(addr->sun_path), ++ (int) sizeof(struct sockaddr), (int) *plen, SUFFIX_STR, rc); + + PREPARE_TEST_SYSCALL_INVOCATION; + rc = TEST_SYSCALL_NAME(fd PREFIX_F_ARGS, (void *) addr, + plen SUFFIX_ARGS); +- printf("%s(%d%s, %p, [%d]%s) = %s\n", +- TEST_SYSCALL_STR, fd, PREFIX_F_STR, addr, ++ printf("%s%s(%d%s%s, %p, [%d]%s) = %s\n", ++ my_secontext, ++ TEST_SYSCALL_STR, fd, fd_secontext, PREFIX_F_STR, addr, + *plen, SUFFIX_STR, sprintrc(rc)); + } diff --git a/SOURCES/0180-pathtrace-util-do-not-print-deleted-as-part-of-the-p.patch b/SOURCES/0180-pathtrace-util-do-not-print-deleted-as-part-of-the-p.patch new file mode 100644 index 0000000..c4c57da --- /dev/null +++ b/SOURCES/0180-pathtrace-util-do-not-print-deleted-as-part-of-the-p.patch @@ -0,0 +1,374 @@ +From 676979fa9cc7920e5e4d547814f9c0edb597fa0d Mon Sep 17 00:00:00 2001 +From: Eugene Syromyatnikov +Date: Thu, 30 Jun 2022 16:01:05 +0200 +Subject: [PATCH] pathtrace, util: do not print " (deleted)" as part of the + path + +In order to allow to discern the unlinked paths from the paths that +do indeed end with " (deleted)". + +* src/defs.h (getfdpath_pid): Add deleted parameter. +(getfdpath): Pass NULL as deleted parameter to getfdpath_pid. +* src/largefile_wrappers.h (lstat_file): New macro. +* src/pathtrace.c: Include , , , +and "largefile_wrappers.h". +(getfdpath_pid): Add deleted parameter, check if path ends with +" (deleted)", and if it is, try to figure out if it is a part +of the path by comparing device/inode numbers of the file procfs +link resolves into and the file pointed by the path read; strip +" (deleted)"; set deleted (if it is non-NULL) to true if the fd +is turned out to be deleted and to false otherwise. +* src/util.c (print_quoted_string_in_angle_brackets): Add deleted +parameter, print "(deleted)" after the closing angle bracket if it is +non-NULL. +(printfd_pid): Add deleted local variable, pass it to getfdpath_pid +and print_quoted_string_in_angle_brackets calls. +* tests/fchmod.c: Add checks for a file with " (deleted)" in the path, +update expected output. +* NEWS: Mention the change. +--- + NEWS | 5 +++++ + src/defs.h | 5 +++-- + src/largefile_wrappers.h | 2 ++ + src/pathtrace.c | 48 +++++++++++++++++++++++++++++++++++++++++++++--- + src/util.c | 10 +++++++--- + tests/fchmod.c | 47 +++++++++++++++++++++++++++++++++++++++++++---- + 6 files changed, 105 insertions(+), 12 deletions(-) + +Index: strace-5.18/NEWS +=================================================================== +--- strace-5.18.orig/NEWS 2022-07-13 12:52:48.219784860 +0200 ++++ strace-5.18/NEWS 2022-07-13 12:52:48.451782122 +0200 +@@ -1,6 +1,11 @@ + Noteworthy changes in release 5.18 (2022-06-18) + =============================================== + ++* Changes in behaviour ++ * The "(deleted)" marker for unlinked paths of file descriptors is now printed ++ outside angle brackets; the matching of unlinked paths of file descriptors ++ no longer includes the " (deleted)" part into consideration. ++ + * Improvements + * Added an interface of raising des Strausses awareness. + * Added --tips option to print strace tips, tricks, and tweaks +Index: strace-5.18/src/defs.h +=================================================================== +--- strace-5.18.orig/src/defs.h 2022-07-13 12:52:29.405006910 +0200 ++++ strace-5.18/src/defs.h 2022-07-13 12:52:54.532710356 +0200 +@@ -785,12 +785,13 @@ + return pathtrace_match_set(tcp, &global_path_set); + } + +-extern int getfdpath_pid(pid_t pid, int fd, char *buf, unsigned bufsize); ++extern int getfdpath_pid(pid_t pid, int fd, char *buf, unsigned bufsize, ++ bool *deleted); + + static inline int + getfdpath(struct tcb *tcp, int fd, char *buf, unsigned bufsize) + { +- return getfdpath_pid(tcp->pid, fd, buf, bufsize); ++ return getfdpath_pid(tcp->pid, fd, buf, bufsize, NULL); + } + + extern unsigned long getfdinode(struct tcb *, int); +Index: strace-5.18/src/largefile_wrappers.h +=================================================================== +--- strace-5.18.orig/src/largefile_wrappers.h 2022-07-13 12:52:29.405006910 +0200 ++++ strace-5.18/src/largefile_wrappers.h 2022-07-13 12:52:48.451782122 +0200 +@@ -31,6 +31,7 @@ + # endif + # define fstat_fd fstat64 + # define strace_stat_t struct stat64 ++# define lstat_file lstat64 + # define stat_file stat64 + # define struct_dirent struct dirent64 + # define read_dir readdir64 +@@ -42,6 +43,7 @@ + # define fcntl_fd fcntl + # define fstat_fd fstat + # define strace_stat_t struct stat ++# define lstat_file lstat + # define stat_file stat + # define struct_dirent struct dirent + # define read_dir readdir +Index: strace-5.18/src/pathtrace.c +=================================================================== +--- strace-5.18.orig/src/pathtrace.c 2022-07-13 12:52:29.405006910 +0200 ++++ strace-5.18/src/pathtrace.c 2022-07-13 12:52:54.532710356 +0200 +@@ -10,7 +10,11 @@ + #include "defs.h" + #include + #include ++#include ++#include ++#include + ++#include "largefile_wrappers.h" + #include "number_set.h" + #include "sen.h" + #include "xstring.h" +@@ -77,7 +81,7 @@ + * Get path associated with fd of a process with pid. + */ + int +-getfdpath_pid(pid_t pid, int fd, char *buf, unsigned bufsize) ++getfdpath_pid(pid_t pid, int fd, char *buf, unsigned bufsize, bool *deleted) + { + char linkpath[sizeof("/proc/%u/fd/%u") + 2 * sizeof(int)*3]; + ssize_t n; +@@ -91,12 +95,50 @@ + + xsprintf(linkpath, "/proc/%u/fd/%u", proc_pid, fd); + n = readlink(linkpath, buf, bufsize - 1); ++ if (n < 0) ++ goto end; ++ + /* + * NB: if buf is too small, readlink doesn't fail, + * it returns truncated result (IOW: n == bufsize - 1). + */ +- if (n >= 0) +- buf[n] = '\0'; ++ buf[n] = '\0'; ++ if (deleted) ++ *deleted = false; ++ ++ /* ++ * Try to figure out if the kernel has appended " (deleted)" ++ * to the end of a potentially unlinked path and set deleted ++ * if it is the case. ++ */ ++ static const char del_sfx[] = " (deleted)"; ++ if ((size_t) n <= sizeof(del_sfx)) ++ goto end; ++ ++ char *del = buf + n + 1 - sizeof(del_sfx); ++ ++ if (memcmp(del, del_sfx, sizeof(del_sfx))) ++ goto end; ++ ++ strace_stat_t st_link; ++ strace_stat_t st_path; ++ int rc = stat_file(linkpath, &st_link); ++ ++ if (rc) ++ goto end; ++ ++ rc = lstat_file(buf, &st_path); ++ ++ if (rc || ++ (st_link.st_ino != st_path.st_ino) || ++ (st_link.st_dev != st_path.st_dev)) { ++ *del = '\0'; ++ n = del - buf + 1; ++ if (deleted) ++ *deleted = true; ++ } ++ ++end: + return n; + } + +Index: strace-5.18/src/util.c +=================================================================== +--- strace-5.18.orig/src/util.c 2022-07-13 12:52:47.989787575 +0200 ++++ strace-5.18/src/util.c 2022-07-13 12:52:48.452782111 +0200 +@@ -735,12 +735,15 @@ + } + + static void +-print_quoted_string_in_angle_brackets(const char *str) ++print_quoted_string_in_angle_brackets(const char *str, const bool deleted) + { + tprints("<"); + print_quoted_string_ex(str, strlen(str), + QUOTE_OMIT_LEADING_TRAILING_QUOTES, "<>"); + tprints(">"); ++ ++ if (deleted) ++ tprints("(deleted)"); + } + + void +@@ -749,8 +752,9 @@ + PRINT_VAL_D(fd); + + char path[PATH_MAX + 1]; ++ bool deleted; + if (pid > 0 && !number_set_array_is_empty(decode_fd_set, 0) +- && getfdpath_pid(pid, fd, path, sizeof(path)) >= 0) { ++ && getfdpath_pid(pid, fd, path, sizeof(path), &deleted) >= 0) { + if (is_number_in_set(DECODE_FD_SOCKET, decode_fd_set) && + printsocket(tcp, fd, path)) + goto printed; +@@ -761,7 +765,7 @@ + printpidfd(pid, fd, path)) + goto printed; + if (is_number_in_set(DECODE_FD_PATH, decode_fd_set)) +- print_quoted_string_in_angle_brackets(path); ++ print_quoted_string_in_angle_brackets(path, deleted); + printed: ; + } + +Index: strace-5.18/tests/fchmod.c +=================================================================== +--- strace-5.18.orig/tests/fchmod.c 2022-07-13 12:52:29.405006910 +0200 ++++ strace-5.18/tests/fchmod.c 2022-07-13 12:52:48.452782111 +0200 +@@ -35,10 +35,17 @@ + (void) unlink(sample); + int fd = open(sample, O_CREAT|O_RDONLY, 0400); + if (fd == -1) +- perror_msg_and_fail("open"); ++ perror_msg_and_fail("open(\"%s\")", sample); ++ ++ static const char sample_del[] = "fchmod_sample_file (deleted)"; ++ (void) unlink(sample_del); ++ int fd_del = open(sample_del, O_CREAT|O_RDONLY, 0400); ++ if (fd_del == -1) ++ perror_msg_and_fail("open(\"%s\")", sample); + + # ifdef YFLAG + char *sample_realpath = get_fd_path(fd); ++ char *sample_del_realpath = get_fd_path(fd_del); + # endif + + const char *sample_secontext = SECONTEXT_FILE(sample); +@@ -56,12 +63,27 @@ + sample_secontext, + sprintrc(rc)); + ++ const char *sample_del_secontext = SECONTEXT_FILE(sample_del); ++ rc = syscall(__NR_fchmod, fd_del, 0600); ++# ifdef YFLAG ++ printf("%s%s(%d<%s>%s, 0600) = %s\n", ++# else ++ printf("%s%s(%d%s, 0600) = %s\n", ++# endif ++ my_secontext, "fchmod", ++ fd_del, ++# ifdef YFLAG ++ sample_del_realpath, ++# endif ++ sample_del_secontext, ++ sprintrc(rc)); ++ + if (unlink(sample)) +- perror_msg_and_fail("unlink"); ++ perror_msg_and_fail("unlink(\"%s\")", sample); + + rc = syscall(__NR_fchmod, fd, 051); + # ifdef YFLAG +- printf("%s%s(%d<%s (deleted)>%s, 051) = %s\n", ++ printf("%s%s(%d<%s>(deleted)%s, 051) = %s\n", + # else + printf("%s%s(%d%s, 051) = %s\n", + # endif +@@ -73,9 +95,26 @@ + sample_secontext, + sprintrc(rc)); + ++ if (unlink(sample_del)) ++ perror_msg_and_fail("unlink(\"%s\")", sample_del); ++ ++ rc = syscall(__NR_fchmod, fd_del, 051); ++# ifdef YFLAG ++ printf("%s%s(%d<%s>(deleted)%s, 051) = %s\n", ++# else ++ printf("%s%s(%d%s, 051) = %s\n", ++# endif ++ my_secontext, "fchmod", ++ fd_del, ++# ifdef YFLAG ++ sample_del_realpath, ++# endif ++ sample_del_secontext, ++ sprintrc(rc)); ++ + rc = syscall(__NR_fchmod, fd, 004); + # ifdef YFLAG +- printf("%s%s(%d<%s (deleted)>%s, 004) = %s\n", ++ printf("%s%s(%d<%s>(deleted)%s, 004) = %s\n", + # else + printf("%s%s(%d%s, 004) = %s\n", + # endif +Index: strace-5.18/tests-m32/fchmod.c +=================================================================== +--- strace-5.18.orig/tests-m32/fchmod.c 2022-07-13 12:52:29.405006910 +0200 ++++ strace-5.18/tests-m32/fchmod.c 2022-07-13 12:52:48.452782111 +0200 +@@ -35,10 +35,17 @@ + (void) unlink(sample); + int fd = open(sample, O_CREAT|O_RDONLY, 0400); + if (fd == -1) +- perror_msg_and_fail("open"); ++ perror_msg_and_fail("open(\"%s\")", sample); ++ ++ static const char sample_del[] = "fchmod_sample_file (deleted)"; ++ (void) unlink(sample_del); ++ int fd_del = open(sample_del, O_CREAT|O_RDONLY, 0400); ++ if (fd_del == -1) ++ perror_msg_and_fail("open(\"%s\")", sample); + + # ifdef YFLAG + char *sample_realpath = get_fd_path(fd); ++ char *sample_del_realpath = get_fd_path(fd_del); + # endif + + const char *sample_secontext = SECONTEXT_FILE(sample); +@@ -56,12 +63,27 @@ + sample_secontext, + sprintrc(rc)); + ++ const char *sample_del_secontext = SECONTEXT_FILE(sample_del); ++ rc = syscall(__NR_fchmod, fd_del, 0600); ++# ifdef YFLAG ++ printf("%s%s(%d<%s>%s, 0600) = %s\n", ++# else ++ printf("%s%s(%d%s, 0600) = %s\n", ++# endif ++ my_secontext, "fchmod", ++ fd_del, ++# ifdef YFLAG ++ sample_del_realpath, ++# endif ++ sample_del_secontext, ++ sprintrc(rc)); ++ + if (unlink(sample)) +- perror_msg_and_fail("unlink"); ++ perror_msg_and_fail("unlink(\"%s\")", sample); + + rc = syscall(__NR_fchmod, fd, 051); + # ifdef YFLAG +- printf("%s%s(%d<%s (deleted)>%s, 051) = %s\n", ++ printf("%s%s(%d<%s>(deleted)%s, 051) = %s\n", + # else + printf("%s%s(%d%s, 051) = %s\n", + # endif +@@ -73,9 +95,26 @@ + sample_secontext, + sprintrc(rc)); + ++ if (unlink(sample_del)) ++ perror_msg_and_fail("unlink(\"%s\")", sample_del); ++ ++ rc = syscall(__NR_fchmod, fd_del, 051); ++# ifdef YFLAG ++ printf("%s%s(%d<%s>(deleted)%s, 051) = %s\n", ++# else ++ printf("%s%s(%d%s, 051) = %s\n", ++# endif ++ my_secontext, "fchmod", ++ fd_del, ++# ifdef YFLAG ++ sample_del_realpath, ++# endif ++ sample_del_secontext, ++ sprintrc(rc)); ++ + rc = syscall(__NR_fchmod, fd, 004); + # ifdef YFLAG +- printf("%s%s(%d<%s (deleted)>%s, 004) = %s\n", ++ printf("%s%s(%d<%s>(deleted)%s, 004) = %s\n", + # else + printf("%s%s(%d%s, 004) = %s\n", + # endif diff --git a/SOURCES/0181-secontext-fix-expected-SELinux-context-check-for-unl.patch b/SOURCES/0181-secontext-fix-expected-SELinux-context-check-for-unl.patch new file mode 100644 index 0000000..f0f74d8 --- /dev/null +++ b/SOURCES/0181-secontext-fix-expected-SELinux-context-check-for-unl.patch @@ -0,0 +1,209 @@ +From 3f0e5340b651da98251a58cc7923525d69f96032 Mon Sep 17 00:00:00 2001 +From: Eugene Syromyatnikov +Date: Fri, 1 Jul 2022 10:45:48 +0200 +Subject: [PATCH] secontext: fix expected SELinux context check for unlinked + FDs +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +selinux_getfdcon open-coded a part of getfdpath_pid since it tries +to do the same job, figure out a path associated with an FD, for slightly +different purpose: to get the expected SELinux context for it. As the previous +commit shows, it's a bit more complicated in cases when the path ends +with the " (deleted)" string, which is also used for designated unlinked paths +in procfs. Otherwise, it may manifest in test failures such as this: + + [unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023] fchmod(4 [unconfined_u:object_r:admin_home_t:s0!!system_u:object_r:admin_home_t:s0], 0600) = 0 + -[unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023] fchmod(4 [unconfined_u:object_r:admin_home_t:s0!!system_u:object_r:admin_home_t:s0], 051) = 0 + -[unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023] fchmod(4 [unconfined_u:object_r:admin_home_t:s0!!system_u:object_r:admin_home_t:s0], 004) = 0 + +[unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023] fchmod(4 [unconfined_u:object_r:admin_home_t:s0], 051) = 0 + +[unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023] fchmod(4 [unconfined_u:object_r:admin_home_t:s0], 004) = 0 + +++ exited with 0 +++ + + fail_ '../../src/strace -a15 -y --secontext=full,mismatch -e trace=fchmod ../fchmod-y--secontext_full_mismatch output mismatch' + + warn_ 'fchmod-y--secontext_full_mismatch.gen.test: failed test: ../../src/strace -a15 -y --secontext=full,mismatch -e trace=fchmod ../fchmod-y--secontext_full_mismatch output mismatch' + + printf '%s\n' 'fchmod-y--secontext_full_mismatch.gen.test: failed test: ../../src/strace -a15 -y --secontext=full,mismatch -e trace=fchmod ../fchmod-y--secontext_full_mismatch output mismatch' + fchmod-y--secontext_full_mismatch.gen.test: failed test: ../../src/strace -a15 -y --secontext=full,mismatch -e trace=fchmod ../fchmod-y--secontext_full_mismatch output mismatch + + exit 1 + FAIL fchmod-y--secontext_full_mismatch.gen.test (exit status: 1) + +that happens due to the fact that the get_expected_filecontext() call +is made against the path with the " (deleted)" part, which is wrong (it +is more wrong than shown above when a file with the path that ends with +" (deleted)" exists). Moreover, it would be incorrect to call stat() +on that path. + +Let's factor out the common part of the code and simply call it +from selinux_getfdcon, then use the st_mode from the procfs link. + +* src/defs.h (get_proc_pid_fd_path): New declaration. +* src/pathtrace.c (get)proc_pid_fd_path): New function, part +of getfdpath_pid that performs link resolution and processing +of the result. +(getfdpath_pid): Call get_proc_pid_fd_path after PID resolution. +* src/secontext.c (get_expected_filecontext): Add mode parameter, use +it in selabel_lookup call instead of retrieveing file mode using stat() +if it is not -1. +(selinux_getfdcon): Call get_proc_pid_fd_path instead +of open-coding path resolution code, call stat() on the procfs link +and pass the retrieved st_mode to the get_expected_filecontext call. +(selinux_getfilecon): Pass -1 as mode in the get_expected_filecontext +call. + +Reported-by: Václav Kadlčík +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2087693 +--- + src/defs.h | 15 +++++++++++++++ + src/pathtrace.c | 26 ++++++++++++++++++-------- + src/secontext.c | 35 +++++++++++++++++++++-------------- + 3 files changed, 54 insertions(+), 22 deletions(-) + +Index: strace-5.18/src/defs.h +=================================================================== +--- strace-5.18.orig/src/defs.h 2022-07-12 18:22:01.563254140 +0200 ++++ strace-5.18/src/defs.h 2022-07-12 18:22:06.202199392 +0200 +@@ -785,6 +785,21 @@ + return pathtrace_match_set(tcp, &global_path_set); + } + ++/** ++ * Resolves a path for a fd procfs PID proc_pid (the one got from ++ * get_proc_pid()). ++ * ++ * @param proc_pid PID number in /proc, obtained with get_proc_pid(). ++ * @param fd FD to resolve path for. ++ * @param buf Buffer to store the resolved path in. ++ * @param bufsize The size of buf. ++ * @param deleted If non-NULL, set to true if the path associated with the FD ++ * seems to have been unlinked and to false otherwise. ++ * @return Number of bytes written including terminating '\0'. ++ */ ++extern int get_proc_pid_fd_path(int proc_pid, int fd, char *buf, ++ unsigned bufsize, bool *deleted); ++ + extern int getfdpath_pid(pid_t pid, int fd, char *buf, unsigned bufsize, + bool *deleted); + +Index: strace-5.18/src/pathtrace.c +=================================================================== +--- strace-5.18.orig/src/pathtrace.c 2022-07-12 18:22:01.532254506 +0200 ++++ strace-5.18/src/pathtrace.c 2022-07-12 18:22:06.202199392 +0200 +@@ -77,11 +77,9 @@ + set->paths_selected[set->num_selected++] = path; + } + +-/* +- * Get path associated with fd of a process with pid. +- */ + int +-getfdpath_pid(pid_t pid, int fd, char *buf, unsigned bufsize, bool *deleted) ++get_proc_pid_fd_path(int proc_pid, int fd, char *buf, unsigned bufsize, ++ bool *deleted) + { + char linkpath[sizeof("/proc/%u/fd/%u") + 2 * sizeof(int)*3]; + ssize_t n; +@@ -89,10 +87,6 @@ + if (fd < 0) + return -1; + +- int proc_pid = get_proc_pid(pid); +- if (!proc_pid) +- return -1; +- + xsprintf(linkpath, "/proc/%u/fd/%u", proc_pid, fd); + n = readlink(linkpath, buf, bufsize - 1); + if (n < 0) +@@ -143,6 +137,22 @@ + } + + /* ++ * Get path associated with fd of a process with pid. ++ */ ++int ++getfdpath_pid(pid_t pid, int fd, char *buf, unsigned bufsize, bool *deleted) ++{ ++ if (fd < 0) ++ return -1; ++ ++ int proc_pid = get_proc_pid(pid); ++ if (!proc_pid) ++ return -1; ++ ++ return get_proc_pid_fd_path(proc_pid, fd, buf, bufsize, deleted); ++} ++ ++/* + * Add a path to the set we're tracing. Also add the canonicalized + * version of the path. Specifying NULL will delete all paths. + */ +Index: strace-5.18/src/secontext.c +=================================================================== +--- strace-5.18.orig/src/secontext.c 2022-07-12 18:22:01.564254128 +0200 ++++ strace-5.18/src/secontext.c 2022-07-12 18:22:06.203199380 +0200 +@@ -62,7 +62,7 @@ + } + + static int +-get_expected_filecontext(const char *path, char **secontext) ++get_expected_filecontext(const char *path, char **secontext, int mode) + { + static struct selabel_handle *hdl; + +@@ -80,12 +80,7 @@ + } + } + +- strace_stat_t stb; +- if (stat_file(path, &stb) < 0) { +- return -1; +- } +- +- return selabel_lookup(hdl, secontext, path, stb.st_mode); ++ return selabel_lookup(hdl, secontext, path, mode); + } + + /* +@@ -130,16 +125,22 @@ + + /* + * We need to resolve the path, because selabel_lookup() doesn't +- * resolve anything. Using readlink() is sufficient here. ++ * resolve anything. + */ ++ char buf[PATH_MAX + 1]; ++ ssize_t n = get_proc_pid_fd_path(proc_pid, fd, buf, sizeof(buf), NULL); ++ if ((size_t) n >= (sizeof(buf) - 1)) ++ return 0; + +- char buf[PATH_MAX]; +- ssize_t n = readlink(linkpath, buf, sizeof(buf)); +- if ((size_t) n >= sizeof(buf)) ++ /* ++ * We retrieve stat() here since the path the procfs link resolves into ++ * may be reused by a different file with different context. ++ */ ++ strace_stat_t st; ++ if (stat_file(linkpath, &st)) + return 0; +- buf[n] = '\0'; + +- get_expected_filecontext(buf, expected); ++ get_expected_filecontext(buf, expected, st.st_mode); + + return 0; + } +@@ -190,7 +191,13 @@ + if (!resolved) + return 0; + +- get_expected_filecontext(resolved, expected); ++ strace_stat_t st; ++ if (stat_file(resolved, &st) < 0) ++ goto out; ++ ++ get_expected_filecontext(resolved, expected, st.st_mode); ++ ++out: + free(resolved); + + return 0; diff --git a/SOURCES/0182-tests-bpf-fix-sloppy-low-FD-number-usage.patch b/SOURCES/0182-tests-bpf-fix-sloppy-low-FD-number-usage.patch new file mode 100644 index 0000000..c10e7a2 --- /dev/null +++ b/SOURCES/0182-tests-bpf-fix-sloppy-low-FD-number-usage.patch @@ -0,0 +1,70 @@ +From 5338636cd9ae7f53ed73f1a7909db03189ea2ff3 Mon Sep 17 00:00:00 2001 +From: Eugene Syromyatnikov +Date: Mon, 4 Jul 2022 12:29:22 +0200 +Subject: [PATCH] tests/bpf: fix sloppy low FD number usage +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +FD 42 can already be opened, so close it. Otherwise, it may lead +to the following test failure: + + -bpf(BPF_LINK_CREATE, {link_create={prog_fd=0, target_fd=0, attach_type=BPF_TRACE_ITER, flags=0, iter_info=[{map={map_fd=0}}, {map={map_fd=42}}, {map={map_fd=314159265}}, {map={map_fd=-1159983635}}, {map={map_fd=-1}}], iter_info_len=5}}, 28) = 841540765612359407 (INJECTED) + +bpf(BPF_LINK_CREATE, {link_create={prog_fd=0, target_fd=0, attach_type=BPF_TRACE_ITER, flags=0, iter_info=[{map={map_fd=0}}, {map={map_fd=42}}, {map={map_fd=314159265}}, {map={map_fd=-1159983635}}, {map={map_fd=-1}}], iter_info_len=5}}, 28) = 841540765612359407 (INJECTED) + bpf(BPF_LINK_CREATE, 0x3ff95574fe5, 28) = 841540765612359407 (INJECTED) + -bpf(BPF_LINK_CREATE, {link_create={prog_fd=0, target_fd=0, attach_type=BPF_TRACE_ITER, flags=0, iter_info=[{map={map_fd=0}}, {map={map_fd=42}}, {map={map_fd=314159265}}, {map={map_fd=-1159983635}}, {map={map_fd=-1}}, ... /* 0x3ff9555d000 */], iter_info_len=6}}, 28) = 841540765612359407 (INJECTED) + +bpf(BPF_LINK_CREATE, {link_create={prog_fd=0, target_fd=0, attach_type=BPF_TRACE_ITER, flags=0, iter_info=[{map={map_fd=0}}, {map={map_fd=42}}, {map={map_fd=314159265}}, {map={map_fd=-1159983635}}, {map={map_fd=-1}}, ... /* 0x3ff9555d000 */], iter_info_len=6}}, 28) = 841540765612359407 (INJECTED) + [...] + FAIL bpf-success-long-y.test (exit status: 1) + +* tests/bpf.c (init_BPF_LINK_CREATE_attr7): Close iter_info_data[1] fd. + +Fixes: v5.18~18 "bpf: improve bpf(BPF_LINK_CREATE) decoding" +Reported-by: Lenka Špačková +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2103137 +--- + tests/bpf.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/tests/bpf.c b/tests/bpf.c +index 82d870e..6c1ffd4 100644 +--- a/tests/bpf.c ++++ b/tests/bpf.c +@@ -1557,6 +1557,8 @@ init_BPF_LINK_CREATE_attr7(struct bpf_attr_check *check, size_t idx) + { + struct BPF_LINK_CREATE_struct *attr = &check->data.BPF_LINK_CREATE_data; + ++ close(iter_info_data[1]); ++ + if (!iter_info_data_p) { + iter_info_data_p = tail_memdup(iter_info_data, + sizeof(iter_info_data)); +diff --git a/tests-m32/bpf.c b/tests-m32/bpf.c +index 82d870e..6c1ffd4 100644 +--- a/tests-m32/bpf.c ++++ b/tests-m32/bpf.c +@@ -1557,6 +1557,8 @@ init_BPF_LINK_CREATE_attr7(struct bpf_attr_check *check, size_t idx) + { + struct BPF_LINK_CREATE_struct *attr = &check->data.BPF_LINK_CREATE_data; + ++ close(iter_info_data[1]); ++ + if (!iter_info_data_p) { + iter_info_data_p = tail_memdup(iter_info_data, + sizeof(iter_info_data)); +diff --git a/tests-mx32/bpf.c b/tests-mx32/bpf.c +index 82d870e..6c1ffd4 100644 +--- a/tests-mx32/bpf.c ++++ b/tests-mx32/bpf.c +@@ -1557,6 +1557,8 @@ init_BPF_LINK_CREATE_attr7(struct bpf_attr_check *check, size_t idx) + { + struct BPF_LINK_CREATE_struct *attr = &check->data.BPF_LINK_CREATE_data; + ++ close(iter_info_data[1]); ++ + if (!iter_info_data_p) { + iter_info_data_p = tail_memdup(iter_info_data, + sizeof(iter_info_data)); +-- +2.1.4 + diff --git a/SOURCES/2000-strace-provide-O_TMPFILE-fallback-definition.patch b/SOURCES/2000-strace-provide-O_TMPFILE-fallback-definition.patch new file mode 100644 index 0000000..f31cf31 --- /dev/null +++ b/SOURCES/2000-strace-provide-O_TMPFILE-fallback-definition.patch @@ -0,0 +1,19 @@ +Some buildroots provide version of kernel-headers package that do not yet +contains O_TMPFILE definition. Since (looks like) there were none discrepancies +in O_TMPFILE definition in RHEL, work that around by providing a fallback +definition of O_TMPFILE. +Index: strace-5.2/src/open.c +=================================================================== +--- strace-5.2.orig/src/open.c 2019-07-11 19:51:22.000000000 +0200 ++++ strace-5.2/src/open.c 2019-07-22 17:49:41.508766666 +0200 +@@ -32,6 +32,10 @@ + #include + #include + ++#ifndef O_TMPFILE ++# define O_TMPFILE (__O_TMPFILE | O_DIRECTORY) ++#endif ++ + #include "xlat/open_access_modes.h" + #include "xlat/open_mode_flags.h" + #include "xlat/open_resolve_flags.h" diff --git a/SOURCES/2001-limit-qual_fault-scope-on-aarch64.patch b/SOURCES/2001-limit-qual_fault-scope-on-aarch64.patch new file mode 100644 index 0000000..f3ece0f --- /dev/null +++ b/SOURCES/2001-limit-qual_fault-scope-on-aarch64.patch @@ -0,0 +1,59 @@ +Index: strace-5.17/tests/qual_fault.test +=================================================================== +--- strace-5.17.orig/tests/qual_fault.test 2022-06-09 15:47:28.871554186 +0200 ++++ strace-5.17/tests/qual_fault.test 2022-06-09 15:50:50.016108370 +0200 +@@ -83,19 +83,36 @@ + done + } + +-for err in '' ENOSYS 22 einval; do ++case "$STRACE_ARCH" in ++ aarch64) ++ ERRS='EnoSys 22' ++ NUMBERS1='2' ++ NUMBERS2='3' ++ NUMBERS3='5' ++ NUMBERS4='7' ++ ;; ++ *) ++ ERRS='ENOSYS 22 einval' ++ NUMBERS1='1 2 3 7' ++ NUMBERS2='1 2 5 11' ++ NUMBERS3='1 2 3 7' ++ NUMBERS4='1 2 7 11' ++ ;; ++esac ++ ++for err in '' $(echo $ERRS); do + for fault in writev desc,51; do + check_fault_injection \ + writev $fault "$err" '' '' '' 1 -efault=chdir + check_fault_injection \ + writev $fault "$err" '' '' '' 1 -efault=chdir -efault=none +- for F in 1 2 3 7; do ++ for F in $(echo $NUMBERS1); do + check_fault_injection \ + writev $fault "$err" $F '' '' 1 + check_fault_injection \ + writev $fault "$err" $F '' + 1 + +- for L in 1 2 5 11; do ++ for L in $(echo $NUMBERS2); do + [ "$L" -ge "$F" ] || + continue + check_fault_injection \ +@@ -104,12 +121,12 @@ + writev $fault "$err" $F $L + 1 + done + +- for S in 1 2 3 7; do ++ for S in $(echo $NUMBERS3); do + check_fault_injection \ + writev $fault "$err" $F '' $S 1 + check_fault_injection \ + writev $fault "$err" $F '' $S 4 +- for L in 1 2 7 11; do ++ for L in $(echo $NUMBERS4); do + [ "$L" -ge "$F" ] || + continue + check_fault_injection \ diff --git a/SOURCES/2005-mark-ipc_shm-ipc_msg-XFAIL-on-ppc64.patch b/SOURCES/2005-mark-ipc_shm-ipc_msg-XFAIL-on-ppc64.patch new file mode 100644 index 0000000..56d8a3b --- /dev/null +++ b/SOURCES/2005-mark-ipc_shm-ipc_msg-XFAIL-on-ppc64.patch @@ -0,0 +1,73 @@ +--- i/tests/Makefile.am ++++ w/tests/Makefile.am +@@ -537,6 +537,10 @@ MISC_TESTS = \ + + TESTS = $(GEN_TESTS) $(DECODER_TESTS) $(MISC_TESTS) $(STACKTRACE_TESTS) + ++## See https://bugzilla.redhat.com/1978412 ++XFAIL_TESTS_powerpc64 = ipc_shm.gen.test ipc_shm-Xabbrev.gen.test ipc_shm-Xraw.gen.test ipc_shm-Xverbose.gen.test ++XFAIL_TESTS_powerpc64le = ipc_msg.gen.test ipc_msg-Xabbrev.gen.test ipc_msg-Xraw.gen.test ipc_msg-Xverbose.gen.test ++ + XFAIL_TESTS_ = + XFAIL_TESTS_m32 = $(STACKTRACE_XFAIL_TESTS) + XFAIL_TESTS_mx32 = $(STACKTRACE_XFAIL_TESTS) +--- i/tests-m32/Makefile.am ++++ w/tests-m32/Makefile.am +@@ -537,6 +537,10 @@ MISC_TESTS = \ + + TESTS = $(GEN_TESTS) $(DECODER_TESTS) $(MISC_TESTS) $(STACKTRACE_TESTS) + ++## See https://bugzilla.redhat.com/1978412 ++XFAIL_TESTS_powerpc64 = ipc_shm.gen.test ipc_shm-Xabbrev.gen.test ipc_shm-Xraw.gen.test ipc_shm-Xverbose.gen.test ++XFAIL_TESTS_powerpc64le = ipc_msg.gen.test ipc_msg-Xabbrev.gen.test ipc_msg-Xraw.gen.test ipc_msg-Xverbose.gen.test ++ + XFAIL_TESTS_ = + XFAIL_TESTS_m32 = $(STACKTRACE_XFAIL_TESTS) + XFAIL_TESTS_mx32 = $(STACKTRACE_XFAIL_TESTS) +--- i/tests-mx32/Makefile.am ++++ w/tests-mx32/Makefile.am +@@ -537,6 +537,10 @@ MISC_TESTS = \ + + TESTS = $(GEN_TESTS) $(DECODER_TESTS) $(MISC_TESTS) $(STACKTRACE_TESTS) + ++## See https://bugzilla.redhat.com/1978412 ++XFAIL_TESTS_powerpc64 = ipc_shm.gen.test ipc_shm-Xabbrev.gen.test ipc_shm-Xraw.gen.test ipc_shm-Xverbose.gen.test ++XFAIL_TESTS_powerpc64le = ipc_msg.gen.test ipc_msg-Xabbrev.gen.test ipc_msg-Xraw.gen.test ipc_msg-Xverbose.gen.test ++ + XFAIL_TESTS_ = + XFAIL_TESTS_m32 = $(STACKTRACE_XFAIL_TESTS) + XFAIL_TESTS_mx32 = $(STACKTRACE_XFAIL_TESTS) +--- i/tests/Makefile.in.old 2021-07-01 21:55:52.509065912 +0200 ++++ w/tests/Makefile.in 2021-07-01 21:56:15.296867604 +0200 +@@ -7497,6 +7497,8 @@ + umovestr_cached.test \ + # end of MISC_TESTS + ++XFAIL_TESTS_powerpc64 = ipc_shm.gen.test ipc_shm-Xabbrev.gen.test ipc_shm-Xraw.gen.test ipc_shm-Xverbose.gen.test ++XFAIL_TESTS_powerpc64le = ipc_msg.gen.test ipc_msg-Xabbrev.gen.test ipc_msg-Xraw.gen.test ipc_msg-Xverbose.gen.test + XFAIL_TESTS_ = + XFAIL_TESTS_m32 = $(STACKTRACE_XFAIL_TESTS) + XFAIL_TESTS_mx32 = $(STACKTRACE_XFAIL_TESTS) +--- i/tests-m32/Makefile.in.old 2021-07-01 21:46:36.524236568 +0200 ++++ w/tests-m32/Makefile.in 2021-07-01 21:49:15.460241800 +0200 +@@ -7497,6 +7497,8 @@ + umovestr_cached.test \ + # end of MISC_TESTS + ++XFAIL_TESTS_powerpc64 = ipc_shm.gen.test ipc_shm-Xabbrev.gen.test ipc_shm-Xraw.gen.test ipc_shm-Xverbose.gen.test ++XFAIL_TESTS_powerpc64le = ipc_msg.gen.test ipc_msg-Xabbrev.gen.test ipc_msg-Xraw.gen.test ipc_msg-Xverbose.gen.test + XFAIL_TESTS_ = + XFAIL_TESTS_m32 = $(STACKTRACE_XFAIL_TESTS) + XFAIL_TESTS_mx32 = $(STACKTRACE_XFAIL_TESTS) +--- i/tests-mx32/Makefile.in.old 2021-07-01 21:46:36.524236568 +0200 ++++ w/tests-mx32/Makefile.in 2021-07-01 21:49:15.460241800 +0200 +@@ -7497,6 +7497,8 @@ + umovestr_cached.test \ + # end of MISC_TESTS + ++XFAIL_TESTS_powerpc64 = ipc_shm.gen.test ipc_shm-Xabbrev.gen.test ipc_shm-Xraw.gen.test ipc_shm-Xverbose.gen.test ++XFAIL_TESTS_powerpc64le = ipc_msg.gen.test ipc_msg-Xabbrev.gen.test ipc_msg-Xraw.gen.test ipc_msg-Xverbose.gen.test + XFAIL_TESTS_ = + XFAIL_TESTS_m32 = $(STACKTRACE_XFAIL_TESTS) + XFAIL_TESTS_mx32 = $(STACKTRACE_XFAIL_TESTS) + diff --git a/SPECS/strace.spec b/SPECS/strace.spec new file mode 100644 index 0000000..4c9a536 --- /dev/null +++ b/SPECS/strace.spec @@ -0,0 +1,787 @@ +%{?scl:%{?scl_package:%scl_package strace}} + +Summary: Tracks and displays system calls associated with a running process +Name: %{?scl_prefix}strace +Version: 5.18 +Release: 2%{?dist} +# The test suite is GPLv2+, all the rest is LGPLv2.1+. +License: LGPL-2.1+ and GPL-2.0+ +Group: Development/Debuggers +URL: https://strace.io +Source: https://strace.io/files/%{version}/strace-%{version}.tar.xz + +%define alternatives_cmd %{!?scl:%{_sbindir}}%{?scl:%{_root_sbindir}}/alternatives +%define alternatives_cmdline %{alternatives_cmd}%{?scl: --altdir %{_sysconfdir}/alternatives --admindir %{_scl_root}/var/lib/alternatives} + +BuildRequires: libacl-devel, time +%{?scl:Requires:%scl_runtime} + +BuildRequires: gcc gzip make + +# Install Bluetooth headers for AF_BLUETOOTH sockets decoding. +%if 0%{?fedora} >= 18 || 0%{?centos} >= 6 || 0%{?rhel} >= 6 || 0%{?suse_version} >= 1200 +BuildRequires: pkgconfig(bluez) +%endif + +BuildRequires: %{?scl_prefix}elfutils-devel, %{?scl_prefix}binutils-devel +BuildRequires: libselinux-devel +%{?!buildroot:BuildRoot: %_tmppath/buildroot-%name-%version-%release} + +# OBS compatibility +%{?!buildroot:BuildRoot: %_tmppath/buildroot-%name-%version-%release} +%define maybe_use_defattr %{?suse_version:%%defattr(-,root,root)} + +## https://bugzilla.redhat.com/2103068 covscan fixes +# v5.18-5-g2bf0696 "src/xlat: remove remnants of unnecessary idx usage in xlookup" +Patch175: 0175-src-xlat-remove-remnants-of-unnecessary-idx-usage-in.patch +# v5.18-7-ge604d7b "strauss: tips whitespace and phrasing cleanups" +Patch176: 0176-strauss-tips-whitespace-and-phrasing-cleanups.patch +# v5.18-8-g968789d "strauss: fix off-by-one error in strauss array access" +Patch177: 0177-strauss-fix-off-by-one-error-in-strauss-array-access.patch +# v5.18-9-g6d3e97e "util: add offs sanity check to print_clock_t" +Patch178: 0178-util-add-offs-sanity-check-to-print_clock_t.patch + +## https://bugzilla.redhat.com/2087693 +# v5.18-13-g960e78f "secontext: print context of Unix socket's sun_path field" +Patch179: 0179-secontext-print-context-of-Unix-socket-s-sun_path-fi.patch +# v5.18-18-g676979f "pathtrace, util: do not print " (deleted)" as part of the path" +Patch180: 0180-pathtrace-util-do-not-print-deleted-as-part-of-the-p.patch +# v5.18-19-g3f0e534 "secontext: fix expected SELinux context check for unlinked FDs" +Patch181: 0181-secontext-fix-expected-SELinux-context-check-for-unl.patch + +## https://bugzilla.redhat.com/2103137 +# v5.18-21-g5338636 "tests/bpf: fix sloppy low FD number usage" +Patch182: 0182-tests-bpf-fix-sloppy-low-FD-number-usage.patch + +### Wire up rseq and kexec_file_load in order to avoid kexec_file_load +### test failure on aarch64. Addresses https://bugzilla.redhat.com/1676045 +### ("strace: FTBFS in Fedora rawhide/f30"). +## v5.0~62 "Wire up rseq syscall on architectures that use generic unistd.h" +#Patch1000: 1000-Wire-up-rseq-syscall-on-architectures-that-use-gener.patch +## v5.0~61 "Wire up kexec_file_load syscall on architectures that use generic unistd.h" +#Patch1001: 1001-Wire-up-kexec_file_load-syscall-on-architectures-tha.patch + +## RHEL7-only: headers on some builders do not provide O_TMPFILE +Patch2000: 2000-strace-provide-O_TMPFILE-fallback-definition.patch +## RHEL-only: aarch64 brew builders are extremely slow on qual_fault.test +Patch2001: 2001-limit-qual_fault-scope-on-aarch64.patch +## RHEL-only: avoid ARRAY_SIZE macro re-definition in libiberty.h +## No longer needed, since upstream commit v5.14~14 +#Patch2003: 2003-undef-ARRAY_SIZE.patch +## RHEL7-only: mark ipc_shm.gen test as XFAIL due to +## https://bugzilla.redhat.com/1978412 +Patch2005: 2005-mark-ipc_shm-ipc_msg-XFAIL-on-ppc64.patch + +# Fallback definitions for make_build/make_install macros +%{?!__make: %global __make %_bindir/make} +%{?!__install: %global __install %_bindir/install} +%{?!make_build: %global make_build %__make %{?_smp_mflags}} +%{?!make_install: %global make_install %__make install DESTDIR="%{?buildroot}" INSTALL="%__install -p"} + +%description +The strace program intercepts and records the system calls called and +received by a running process. Strace can print a record of each +system call, its arguments and its return value. Strace is useful for +diagnosing problems and debugging, as well as for instructional +purposes. + +Install strace if you need a tool to track the system calls made and +received by a process. + +%prep +%setup -q -n strace-%{version} + +%patch175 -p1 +%patch176 -p1 +%patch177 -p1 +%patch178 -p1 +%patch179 -p1 +%patch180 -p1 +%patch181 -p1 +%patch182 -p1 + +%patch2000 -p1 +%patch2001 -p1 +#%patch2003 -p1 +%patch2005 -p1 + +echo -n %version-%release > .tarball-version +echo -n 2022 > .year +echo -n 2022-06-22 > doc/.strace.1.in.date +echo -n 2022-06-22 > doc/.strace-log-merge.1.in.date + +%build +echo 'BEGIN OF BUILD ENVIRONMENT INFORMATION' +uname -a |head -1 +libc="$(ldd /bin/sh |sed -n 's|^[^/]*\(/[^ ]*/libc\.so[^ ]*\).*|\1|p' |head -1)" +$libc |head -1 +file -L /bin/sh +gcc --version |head -1 +ld --version |head -1 +kver="$(printf '%%s\n%%s\n' '#include ' 'LINUX_VERSION_CODE' | gcc -E -P -)" +printf 'kernel-headers %%s.%%s.%%s\n' $(($kver/65536)) $(($kver/256%%256)) $(($kver%%256)) +echo 'END OF BUILD ENVIRONMENT INFORMATION' + +LDFLAGS="$RPM_LD_FLAGS -L%{_libdir} -L%{_libdir}/elfutils" +export LDLFAGS + +# -DHAVE_S390_COMPAT_REGS is needed due to lack of v3.10-rc1~201^2~11 +CFLAGS=" $RPM_OPT_FLAGS $LDFLAGS " +# Removing explicit -m64 as it breaks mpers +[ "x${CFLAGS#* -m64 }" = "x${CFLAGS}" ] || CFLAGS=$(echo "$CFLAGS" | sed 's/ -m64 / /g') +export CFLAGS + +CPPFLAGS=" -isystem %{_includedir} %{optflags} " +# Removing explicit -m64 as it breaks mpers +[ "x${CPPFLAGS#* -m64 }" = "x${CPPFLAGS}" ] || CPPFLAGS=$(echo "$CPPFLAGS" | sed 's/ -m64 / /g') +export CPPFLAGS + +CFLAGS_FOR_BUILD="$RPM_OPT_FLAGS"; export CFLAGS_FOR_BUILD +# ac_cv_member_struct_perf_event_attr_context_switch=no is due to +# https://bugzilla.redhat.com/show_bug.cgi?id=1404539 +%configure --enable-mpers=check --with-libdw ac_cv_member_struct_perf_event_attr_context_switch=no +%make_build + +%install +%make_install + +# some say uncompressed changelog files are too big +for f in ChangeLog ChangeLog-CVS; do + gzip -9n < "$f" > "$f".gz & +done +wait + +%check +# This is needed since patch does not set x bit to the newly created files +chmod u+x tests/*.test tests-m32/*.test tests-mx32/*.test + +%{buildroot}%{_bindir}/strace -V + +# Skip tests on s390x el6 kernel, test failures there are covered +# by the following issues: +# * https://bugzilla.redhat.com/show_bug.cgi?id=1220802#c6 +# * Absence of Linux commit v3.2-rc1~109^2~34 +uname_r="$(uname -r)" +if [ "x${uname_r#2.6.32}" != "x${uname_r}" ] && \ + [ "x${uname_r%s390x}" != "x${uname_r}" ] +then + echo "Skipping tests, kernel (${uname_r}) is too broken" +else + # We have to limit concurrent execution of tests as some time-sensitive + # tests start to fail if the reported time is way too off + # from the expected one. + %make_build -j2 -k check VERBOSE=1 V=1 TIMEOUT_DURATION=5400 + echo 'BEGIN OF TEST SUITE INFORMATION' + tail -n 99999 -- tests*/test-suite.log tests*/ksysent.gen.log + find tests* -type f -name '*.log' -print0 | + xargs -r0 grep -H '^KERNEL BUG:' -- ||: + echo 'END OF TEST SUITE INFORMATION' +fi + + +%files +%maybe_use_defattr +%doc CREDITS ChangeLog.gz ChangeLog-CVS.gz COPYING LGPL-2.1-or-later NEWS README +%{_bindir}/strace +%{_bindir}/strace-log-merge +%{_mandir}/man1/* + +%changelog +* Mon Jul 11 2022 Eugene Syromiatnikov - 5.18-2 +- Fix the issues reported by covscan (#2103068). +- Fix SELinux context matching for the deleted paths (#2087693). +- Fix sloppy FD usage in the bpf test (#2103137). + +* Wed Jun 22 2022 Eugene Syromiatnikov - 5.18-1 +- Rebase to v5.18. + +* Wed Jun 08 2022 Eugene Syromiatnikov - 5.17-1 +- Rebase to v5.17; drop upstream patches on top of 5.12 (#2076528). + +* Mon Aug 23 2021 Eugene Syromiatnikov - 5.13-3 +- Address some issues reported by covscan (#1996690). + +* Tue Jul 20 2021 Eugene Syromiatnikov - 5.13-1 +- Rebase to v5.13. + +* Fri May 14 2021 Eugene Syromiatnikov - 5.12-1 +- Rebase to v5.12; drop upstream patches on top of 5.7 (#1958328). + +* Wed Sep 09 2020 Eugene Syromiatnikov - 5.7-3 +- Add PID namespace translation support (#1804334). + +* Wed Aug 26 2020 Eugene Syromiatnikov - 5.7-2 +- Explicitly add BuildRequires: bzip2-devel as -ldw needs -lbz2 (#1870580). + +* Tue Jul 28 2020 Eugene Syromiatnikov - 5.7-1 +- Rebase to v5.7; drop upstream patches on top of 5.1 (#1861328). + +* Mon Jan 27 2020 Eugene Syromiatnikov - 5.1-7 +- Do not depend on kernel headers for decoding (#1758201). + +* Mon Jan 27 2020 Eugene Syromiatnikov - 5.1-6 +- Fix expected alignment for IPC tests (#1795273): + 4377e3a1 "tests: fix expected output for some ipc tests", and + a75c7c4b "tests: fix -a argument in ipc_msgbuf-Xraw test". + +* Mon Jan 27 2020 Eugene Syromiatnikov - 5.1-5 +- Fix printing stack traces for early syscalls on process attach (#1790057): + 69b2c33a "unwind-libdw: fix initialization of libdwfl cache", + 35e080ae "syscall: do not capture stack trace while the tracee executes + strace code", and + 8e515c74 "tests: add strace-k-p test". +- Add commit v5.4~97 "xlat: use unsgined type for mount_flags fallback values" + +* Fri Aug 30 2019 Eugene Syromiatnikov - 5.1-4 +- Properly decode struct sockaddr_hci without hci_channel field. +- Include upstream patches that fix issues reported by covscan: + 91281fec "v4l2: avoid shifting left a signed number by 31 bit", + 522ad3a0 "syscall.c: avoid infinite loop in subcalls parsing", and + 9446038e "kvm: avoid bogus vcpu_info assignment in vcpu_register". + +* Thu Aug 29 2019 Eugene Syromiatnikov - 5.1-3 +- Build with Bluetooth headers. +- Resolves: #1746885 + +* Thu Aug 29 2019 Eugene Syromiatnikov - 5.1-2 +- Copy over changes in tests/ioctl_evdev-success.c (from cdd8206a + "tests: test evdev bitset decoding more thoroughly") + to tests-m32/ioctl_evdev-success.c and tests-mx32/ioctl_evdev-success.c +- Resolves: #1746478 + +* Mon Jul 22 2019 Eugene Syromiatnikov - 5.1-1 +- Rebase to v5.1; drop upstream patches on top of 4.24. +- Add upstream commits 7ada13f3 ("evdev: avoid bit vector decoding + on non-successful and 0 return codes"), 96194ed7 ("evdev: fix array size + calculation in decode_bitset_"), and cdd8206a ("tests: test evdev bitset + decoding more thoroughly") as separate patches. +- Resolves: #1666405. + +* Tue Jan 15 2019 Eugene Syromiatnikov - 4.24-5 +- Fix off-by-one errors in indexed xlat handling. +- Remove bogus indexed xlat warning. +- Resolves #1666405. + +* Wed Sep 12 2018 Eugene Syromiatnikov - 4.24-4 +- Add current version of the thread handling unfairness fix. +- Resolves #1610774. + +* Thu Aug 23 2018 Eugene Syromiatnikov - 4.24-3 +- Provide a fallback definition for the O_TMPFILE flag. +- Resolves #1609741. + +* Tue Aug 14 2018 Eugene Syromiatnikov - 4.24-2 +- Remove -DHAVE_S390_COMPAT_REGS=1 from CFLAGS. + +* Tue Aug 14 2018 Eugene Syromiatnikov - 4.24-1 +- Rebase to v4.24. + +* Mon Aug 06 2018 Eugene Syromiatnikov - 4.23-5 +- Provide open mode flags fallback definitions. +- Resolves #1609741. + +* Sun Aug 05 2018 Eugene Syromiatnikov - 4.23-4 +- Enable stack unwinding using DTS version of libelfutils. + +* Wed Jul 18 2018 Eugene Syromiatnikov - 4.23-3 +- Add SCL-specific modifications in order to build for DTS 8.0. +- Resolves #1602841. + +* Mon Jun 18 2018 Eugene Syromiatnikov - 4.23-2 +- Increase test timeout duration. + +* Thu Jun 14 2018 Dmitry V. Levin - 4.23-1 +- v4.22 -> v4.23. +- Enabled libdw backend for -k option (#1568647). + +* Thu Apr 05 2018 Dmitry V. Levin - 4.22-1 +- v4.21 -> v4.22. + +* Tue Feb 13 2018 Dmitry V. Levin - 4.21-1 +- v4.20 -> v4.21. + +* Mon Nov 13 2017 Dmitry V. Levin - 4.20-1 +- v4.19 -> v4.20. + +* Tue Sep 05 2017 Dmitry V. Levin - 4.19-1 +- v4.18 -> v4.19. + +* Wed Jul 05 2017 Dmitry V. Levin - 4.18-1 +- v4.17 -> v4.18. + +* Wed May 24 2017 Dmitry V. Levin - 4.17-1 +- v4.16 -> v4.17. + +* Tue Feb 14 2017 Dmitry V. Levin - 4.16-1 +- v4.15 -> v4.16. + +* Wed Dec 14 2016 Dmitry V. Levin - 4.15-1 +- v4.14-100-g622af42 -> v4.15. + +* Wed Nov 16 2016 Dmitry V. Levin - 4.14.0.100.622a-1 +- v4.14 -> v4.14-100-g622af42: + + implemented syscall fault injection. + +* Tue Oct 04 2016 Dmitry V. Levin - 4.14-1 +- v4.13 -> v4.14: + + added printing of the mode argument of open and openat syscalls + when O_TMPFILE flag is set (#1377846). + +* Tue Jul 26 2016 Dmitry V. Levin - 4.13-1 +- v4.12 -> v4.13. + +* Tue May 31 2016 Dmitry V. Levin - 4.12-1 +- v4.11-163-g972018f -> v4.12. + +* Fri Feb 05 2016 Fedora Release Engineering - 4.11.0.163.9720-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Fri Jan 15 2016 Dmitry V. Levin - 4.11.0.163.9720-1 +- New upstream snapshot v4.11-163-g972018f: + + fixed decoding of syscalls unknown to the kernel on s390/s390x (#1298294). + +* Wed Dec 23 2015 Dmitry V. Levin - 4.11-2 +- Enabled experimental -k option on x86_64 (#1170296). + +* Mon Dec 21 2015 Dmitry V. Levin - 4.11-1 +- New upstream release: + + print nanoseconds along with seconds in stat family syscalls (#1251176). + +* Fri Jun 19 2015 Fedora Release Engineering - 4.10-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Mon May 11 2015 Marcin Juszkiewicz - 4.10-2 +- Backport set of upstream patches to get it buildable on AArch64 + +* Fri Mar 06 2015 Dmitry V. Levin - 4.10-1 +- New upstream release: + + enhanced ioctl decoding (#902788). + +* Mon Nov 03 2014 Lubomir Rintel - 4.9-3 +- Regenerate ioctl entries with proper kernel headers + +* Mon Aug 18 2014 Fedora Release Engineering - 4.9-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Fri Aug 15 2014 Dmitry V. Levin - 4.9-1 +- New upstream release: + + fixed build when and conflict (#993384); + + updated CLOCK_* constants (#1088455); + + enabled ppc64le support (#1122323); + + fixed attach to a process on ppc64le (#1129569). + +* Fri Jul 25 2014 Dan Horák - 4.8-5 +- update for ppc64 + +* Sun Jun 08 2014 Fedora Release Engineering - 4.8-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Fri Dec 6 2013 Peter Robinson 4.8-3 +- Fix FTBFS + +* Sun Aug 04 2013 Fedora Release Engineering - 4.8-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Mon Jun 03 2013 Dmitry V. Levin - 4.8-1 +- New upstream release: + + fixed ERESTARTNOINTR leaking to userspace on ancient kernels (#659382); + + fixed decoding of *xattr syscalls (#885233); + + fixed handling of files with 64-bit inode numbers by 32-bit strace (#912790); + + added aarch64 support (#969858). + +* Fri Feb 15 2013 Fedora Release Engineering - 4.7-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Sat Jul 21 2012 Fedora Release Engineering - 4.7-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Wed May 02 2012 Dmitry V. Levin 4.7-1 +- New upstream release. + + implemented proper handling of real SIGTRAPs (#162774). + +* Sat Jan 14 2012 Fedora Release Engineering - 4.6-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild + +* Mon Mar 14 2011 Dmitry V. Levin - 4.6-1 +- New upstream release. + + fixed a corner case in waitpid handling (#663547). + +* Wed Feb 09 2011 Fedora Release Engineering - 4.5.20-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Tue Apr 13 2010 Roland McGrath - 4.5.20-1 +- New upstream release, work mostly by Andreas Schwab and Dmitry V. Levin. + + fixed potential stack buffer overflow in select decoder (#556678); + + fixed FTBFS (#539044). + +* Wed Oct 21 2009 Roland McGrath - 4.5.19-1 +- New upstream release, work mostly by Dmitry V. Levin + + exit/kill strace with traced process exitcode/signal (#105371); + + fixed build on ARM EABI (#507576); + + fixed display of 32-bit argv array on 64-bit architectures (#519480); + + fixed display of 32-bit fcntl(F_SETLK) on 64-bit architectures (#471169); + + fixed several bugs in strings decoder, including potential heap + memory corruption (#470529, #478324, #511035). + +* Thu Aug 28 2008 Roland McGrath - 4.5.18-1 +- build fix for newer kernel headers (#457291) +- fix CLONE_VFORK handling (#455078) +- Support new Linux/PPC system call subpage_prot and PROT_SAO flag. +- In sigaction system call, display sa_flags value along with SIG_DFL/SIG_IGN. + +* Mon Jul 21 2008 Roland McGrath - 4.5.17-1 +- handle O_CLOEXEC, MSG_CMSG_CLOEXEC (#365781) +- fix biarch stat64 decoding (#222275) +- fix spurious "..." in printing of environment strings (#358241) +- improve prctl decoding (#364401) +- fix hang wait on exited child with exited child (#354261) +- fix biarch fork/vfork (-f) tracing (#447475) +- fix biarch printing of negative argument kill (#430585) +- fix biarch decoding of error return values (#447587) +- fix -f tracing of CLONE_VFORK (#455078) +- fix ia64 register clobberation in -f tracing (#453438) +- print SO_NODEFER, SA_RESETHAND instead of SA_NOMASK, SA_ONESHOT (#455821) +- fix futex argument decoding (#448628, #448629) + +* Fri Aug 3 2007 Roland McGrath - 4.5.16-1 +- fix multithread issues (#240962, #240961, #247907) +- fix spurious SIGSTOP on early interrupt (#240986) +- fix utime for biarch (#247185) +- fix -u error message (#247170) +- better futex syscall printing (##241467) +- fix argv/envp printing with small -s settings, and for biarch +- new syscalls: getcpu, eventfd, timerfd, signalfd, epoll_pwait, + move_pages, utimensat + +* Tue Jan 16 2007 Roland McGrath - 4.5.15-1 +- biarch fixes (#179740, #192193, #171626, #173050, #218433, #218043) +- fix -ff -o behavior (#204950, #218435, #193808, #219423) +- better quotactl printing (#118696) +- *at, inotify*, pselect6, ppoll and unshare syscalls (#178633, #191275) +- glibc-2.5 build fixes (#209856) +- memory corruption fixes (#200621 +- fix race in child setup under -f (#180293) +- show ipc key values in hex (#198179, #192182) +- disallow -c with -ff (#187847) +- Resolves: RHBZ #179740, RHBZ #192193, RHBZ #204950, RHBZ #218435 +- Resolves: RHBZ #193808, RHBZ #219423, RHBZ #171626, RHBZ #173050 +- Resolves: RHBZ #218433, RHBZ #218043, RHBZ #118696, RHBZ #178633 +- Resolves: RHBZ #191275, RHBZ #209856, RHBZ #200621, RHBZ #180293 +- Resolves: RHBZ #198179, RHBZ #198182, RHBZ #187847 + +* Mon Nov 20 2006 Jakub Jelinek - 4.5.14-4 +- Fix ia64 syscall decoding (#206768) +- Fix build with glibc-2.4.90-33 and up on all arches but ia64 +- Fix build against 2.6.18+ headers + +* Tue Aug 22 2006 Roland McGrath - 4.5.14-3 +- Fix bogus decoding of syscalls >= 300 (#201462, #202620). + +* Fri Jul 14 2006 Jesse Keating - 4.5.14-2 +- rebuild + +* Fri Feb 10 2006 Jesse Keating - 4.5.14-1.2 +- bump again for long double bug on ppc{,64} + +* Tue Feb 07 2006 Jesse Keating - 4.5.14-1.1 +- rebuilt for new gcc4.1 snapshot and glibc changes + +* Mon Jan 16 2006 Roland McGrath - 4.5.14-1 +- Fix biarch decoding of socket syscalls (#174354). +- Fix biarch -e support (#173986). +- Accept numeric syscalls in -e (#174798). +- Fix ipc syscall decoding (#164755). +- Improve msgrcv printing (#164757). +- Man page updates (#165375). +- Improve mount syscall printing (#165377). +- Correct printing of restarting syscalls (#165469). + +* Wed Aug 3 2005 Roland McGrath - 4.5.13-1 +- Fix setsockopt decoding on 64-bit (#162449). +- Fix typos in socket option name strings (#161578). +- Display more IPV6 socket options by name (#162450). +- Don't display inappropriate syscalls for -e trace=file (#159340). +- New selector type -e trace=desc for file-descriptor using calls (#159400). +- Fix 32-bit old_mmap syscall decoding on x86-64 (#162467, #164215). +- Fix errors detaching from multithreaded process on interrupt (#161919). +- Note 4.5.12 fix for crash handling bad signal numbers (#162739). + +* Wed Jun 8 2005 Roland McGrath - 4.5.12-1 +- Fix known syscall recognition for IA32 processes on x86-64 (#158934). +- Fix bad output for ptrace on x86-64 (#159787). +- Fix potential buffer overruns (#151570, #159196). +- Make some diagnostics more consistent (#159308). +- Update PowerPC system calls. +- Better printing for Linux aio system calls. +- Don't truncate statfs64 fields to 32 bits in output (#158243). +- Cosmetic code cleanups (#159688). + +* Tue Mar 22 2005 Roland McGrath - 4.5.11-1 +- Build tweaks. +- Note 4.5.10 select fix (#151570). + +* Mon Mar 14 2005 Roland McGrath - 4.5.10-1 +- Fix select handling on nonstandard fd_set sizes. +- Don't print errors for null file name pointers. +- Fix initial execve output with -i (#143365). + +* Fri Feb 4 2005 Roland McGrath - 4.5.9-2 +- update ia64 syscall list (#146245) +- fix x86_64 syscall argument extraction for 32-bit processes (#146093) +- fix -e signal=NAME parsing (#143362) +- fix x86_64 exit_group syscall handling +- improve socket ioctl printing (#138223) +- code cleanups (#143369, #143370) +- improve mount flags printing (#141932) +- support symbolic printing of x86_64 arch_prctl parameters (#142667) +- fix potential crash in getxattr printing + +* Tue Oct 19 2004 Roland McGrath - 4.5.8-1 +- fix multithreaded exit handling (#132150, #135254) +- fix ioctl name matching (#129808) +- print RTC_* ioctl structure contents (#58606) +- grok epoll_* syscalls (#134463) +- grok new RLIMIT_* values (#133594) +- print struct cmsghdr contents for sendmsg (#131689) +- fix clock_* and timer_* argument output (#131420) + +* Tue Aug 31 2004 Roland McGrath - 4.5.7-2 +- new upstream version, misc fixes and updates (#128091, #129166, #128391, #129378, #130965, #131177) + +* Mon Jul 12 2004 Roland McGrath 4.5.6-1 +- new upstream version, updates ioctl lists (#127398), fixes quotactl (#127393), more ioctl decoding (#126917) + +* Sun Jun 27 2004 Roland McGrath 4.5.5-1 +- new upstream version, fixes x86-64 biarch support (#126547) + +* Tue Jun 15 2004 Elliot Lee 4.5.4-2 +- rebuilt + +* Thu Jun 3 2004 Roland McGrath 4.5.4-0.FC1 +- rebuilt for FC1 update + +* Thu Jun 3 2004 Roland McGrath 4.5.4-1 +- new upstream version, more ioctls (#122257), minor fixes + +* Fri Apr 16 2004 Roland McGrath 4.5.3-1 +- new upstream version, mq_* calls (#120701), -p vs NPTL (#120462), more fixes (#118694, #120541, #118685) + +* Tue Mar 02 2004 Elliot Lee 4.5.2-1.1 +- rebuilt + +* Mon Mar 1 2004 Roland McGrath 4.5.2-1 +- new upstream version, sched_* calls (#116990), show core flag (#112117) + +* Fri Feb 13 2004 Elliot Lee +- rebuilt + +* Thu Nov 13 2003 Roland McGrath 4.5.1-1 +- new upstream version, more fixes (#108012, #105366, #105359, #105358) + +* Tue Sep 30 2003 Roland McGrath 4.5-3 +- revert bogus s390 fix + +* Thu Sep 25 2003 Roland McGrath 4.5-1.2.1AS +- rebuilt for 2.1AS erratum + +* Wed Sep 24 2003 Roland McGrath 4.5-2 +- rebuilt + +* Wed Sep 24 2003 Roland McGrath 4.5-1 +- new upstream version, more fixes (#101499, #104365) + +* Thu Jul 17 2003 Roland McGrath 4.4.99-2 +- rebuilt + +* Thu Jul 17 2003 Roland McGrath 4.4.99-1 +- new upstream version, groks more new system calls, PF_INET6 sockets + +* Tue Jun 10 2003 Roland McGrath 4.4.98-1 +- new upstream version, more fixes (#90754, #91085) + +* Wed Jun 04 2003 Elliot Lee +- rebuilt + +* Sun Mar 30 2003 Roland McGrath 4.4.96-1 +- new upstream version, handles yet more 2.5 syscalls, x86_64 & ia64 fixes + +* Mon Feb 24 2003 Elliot Lee 4.4.95-2 +- rebuilt + +* Mon Feb 24 2003 Roland McGrath 4.4.95-1 +- new upstream version, fixed getresuid/getresgid (#84959) + +* Wed Feb 19 2003 Roland McGrath 4.4.94-1 +- new upstream version, new option -E to set environment variables (#82392) + +* Wed Jan 22 2003 Tim Powers 4.4.93-2 +- rebuilt + +* Tue Jan 21 2003 Roland McGrath 4.4.93-1 +- new upstream version, fixes ppc and s390 bugs, adds missing ptrace requests + +* Fri Jan 10 2003 Roland McGrath 4.4.91-1 +- new upstream version, fixes -f on x86-64 + +* Fri Jan 10 2003 Roland McGrath 4.4.90-1 +- new upstream version, fixes all known bugs modulo ia64 and s390 issues + +* Fri Jan 03 2003 Florian La Roche 4.4-11 +- add further s390 patch from IBM + +* Wed Nov 27 2002 Tim Powers 4.4-10 +- remove unpackaged files from the buildroot + +* Mon Oct 07 2002 Phil Knirsch 4.4-9.1 +- Added latest s390(x) patch. + +* Fri Sep 06 2002 Karsten Hopp 4.4-9 +- preliminary x86_64 support with an ugly patch to help + debugging. Needs cleanup! + +* Mon Sep 2 2002 Jakub Jelinek 4.4-8 +- newer version of the clone fixing patch (Roland McGrath) +- aio syscalls for i386/ia64/ppc (Ben LaHaise) + +* Wed Aug 28 2002 Jakub Jelinek 4.4-7 +- fix strace -f (Roland McGrath, #68994) +- handle ?et_thread_area, SA_RESTORER (Ulrich Drepper) + +* Fri Jun 21 2002 Jakub Jelinek 4.4-6 +- handle futexes, *xattr, sendfile64, etc. (Ulrich Drepper) +- handle modify_ldt (#66894) + +* Thu May 23 2002 Tim Powers +- automated rebuild + +* Tue Apr 16 2002 Jakub Jelinek 4.4-4 +- fix for the last patch by Jeff Law (#62591) + +* Mon Mar 4 2002 Preston Brown 4.4-3 +- integrate patch from Jeff Law to eliminate hang tracing threads + +* Sat Feb 23 2002 Florian La Roche +- minor update from debian tar-ball + +* Wed Jan 02 2002 Florian La Roche +- update to 4.4 + +* Sun Jul 22 2001 Florian La Roche +- disable s390 patches, they are already included + +* Wed Jul 18 2001 Preston Brown 4.3-1 +- new upstream version. Seems to have integrated most new syscalls +- tracing threaded programs is now functional. + +* Mon Jun 11 2001 Than Ngo +- port s390 patches from IBM + +* Wed May 16 2001 Nalin Dahyabhai +- modify new syscall patch to allocate enough heap space in setgroups32() + +* Wed Feb 14 2001 Jakub Jelinek +- #include in addition to + +* Fri Jan 26 2001 Karsten Hopp +- clean up conflicting patches. This happened only + when building on S390 + +* Fri Jan 19 2001 Bill Nottingham +- update to CVS, reintegrate ia64 support + +* Fri Dec 8 2000 Bernhard Rosenkraenzer +- Get S/390 support into the normal package + +* Sat Nov 18 2000 Florian La Roche +- added S/390 patch from IBM, adapting it to not conflict with + IA64 patch + +* Sat Aug 19 2000 Jakub Jelinek +- doh, actually apply the 2.4 syscalls patch +- make it compile with 2.4.0-test7-pre4+ headers, add + getdents64 and fcntl64 + +* Thu Aug 3 2000 Jakub Jelinek +- add a bunch of new 2.4 syscalls (#14036) + +* Wed Jul 12 2000 Prospector +- automatic rebuild +- excludearch ia64 + +* Fri Jun 2 2000 Matt Wilson +- use buildinstall for FHS + +* Wed May 24 2000 Jakub Jelinek +- make things compile on sparc +- fix sigreturn on sparc + +* Fri Mar 31 2000 Bill Nottingham +- fix stat64 misdef (#10485) + +* Tue Mar 21 2000 Michael K. Johnson +- added ia64 patch + +* Thu Feb 03 2000 Cristian Gafton +- man pages are compressed +- version 4.2 (why are we keeping all these patches around?) + +* Sat Nov 27 1999 Jeff Johnson +- update to 4.1 (with sparc socketcall patch). + +* Fri Nov 12 1999 Jakub Jelinek +- fix socketcall on sparc. + +* Thu Sep 02 1999 Cristian Gafton +- fix KERN_SECURELVL compile problem + +* Tue Aug 31 1999 Cristian Gafton +- added alpha patch from HJLu to fix the osf_sigprocmask interpretation + +* Sat Jun 12 1999 Jeff Johnson +- update to 3.99.1. + +* Wed Jun 2 1999 Jeff Johnson +- add (the other :-) jj's sparc patch. + +* Wed May 26 1999 Jeff Johnson +- upgrade to 3.99 in order to +- add new 2.2.x open flags (#2955). +- add new 2.2.x syscalls (#2866). +- strace 3.1 patches carried along for now. + +* Sun May 16 1999 Jeff Johnson +- don't rely on (broken!) rpm %%patch (#2735) + +* Tue Apr 06 1999 Preston Brown +- strip binary + +* Sun Mar 21 1999 Cristian Gafton +- auto rebuild in the new build environment (release 16) + +* Tue Feb 9 1999 Jeff Johnson +- vfork est arrive! + +* Tue Feb 9 1999 Christopher Blizzard +- Add patch to follow clone() syscalls, too. + +* Sun Jan 17 1999 Jeff Johnson +- patch to build alpha/sparc with glibc 2.1. + +* Thu Dec 03 1998 Cristian Gafton +- patch to build on ARM + +* Wed Sep 30 1998 Jeff Johnson +- fix typo (printf, not tprintf). + +* Sat Sep 19 1998 Jeff Johnson +- fix compile problem on sparc. + +* Tue Aug 18 1998 Cristian Gafton +- buildroot + +* Mon Jul 20 1998 Cristian Gafton +- added the umoven patch from James Youngman +- fixed build problems on newer glibc releases + +* Mon Jun 08 1998 Prospector System +- translations modified for de, fr, tr