stat64
statfs
statfs64
+status-all
+status-failed
+status-none
+status-none-threads
+status-successful
+status-unfinished
+status-unfinished-threads
statx
swap
sxetmask
signal2name.c \
skip_unavailable.c \
sprintrc.c \
+ status.c \
tail_alloc.c \
test_netlink.h \
test_nlattr.h \
sleep \
stack-fcall \
stack-fcall-mangled \
+ status-none-threads \
+ status-unfinished-threads \
threads-execve \
unblock_reset_raise \
unix-pair-send-recv \
pwritev_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
stat64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
statfs_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
+status_none_threads_LDADD = -lpthread $(LDADD)
+status_unfinished_threads_LDADD = -lpthread $(LDADD)
threads_execve_LDADD = -lpthread $(clock_LIBS) $(LDADD)
times_LDADD = $(clock_LIBS) $(LDADD)
truncate64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
restart_syscall.test \
sigblock.test \
sigign.test \
+ status-detached.test \
+ status-none-threads.test \
+ status-unfinished-threads.test \
strace-C.test \
strace-E.test \
strace-S.test \
sockaddr_xlat.c \
sockname.c \
stack-fcall.h \
+ status-detached.expected \
strace-C.expected \
strace-E.expected \
strace-T.expected \
stat64 -a32 -v -P stat.sample -P /dev/full
statfs -a17
statfs64 -a23
+status-all -a10 -e trace=chdir -e status=detached,failed,successful,unavailable,unfinished
+status-failed -a10 -e trace=chdir -Z
+status-none -e trace=all -e status=none
+status-successful -a10 -e trace=chdir -z
+status-unfinished -a10 -e trace=all -e status=unfinished
statx -a32 -v -P stat.sample -P /dev/full
swap -a23 -e trace=swapon,swapoff
sxetmask -a11 -e trace=sgetmask,ssetmask
stat64
statfs
statfs64
+status-all
+status-failed
+status-none
+status-successful
+status-unfinished
statx
swap
sxetmask
--- /dev/null
+/*
+ * Check status=all filtering for failed and successful syscalls.
+ *
+ * Copyright (c) 2019 Intel Corporation
+ * Copyright (c) 2019 Paul Chaignon <paul.chaignon@gmail.com>
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "tests.h"
+#include <stdio.h>
+
+int
+main(void)
+{
+ static const char sample_valid[] = ".";
+ static const char sample_invalid[] = "";
+
+ test_status_chdir(sample_valid, 1, 1);
+ test_status_chdir(sample_invalid, 1, 1);
+ puts("+++ exited with 0 +++");
+ return 0;
+}
--- /dev/null
+nanosleep\({tv_sec=2, tv_nsec=0}, <detached \.\.\.>
--- /dev/null
+#!/bin/sh
+#
+# Check -e status=detached option.
+#
+# Copyright (c) 2019 Paul Chaignon <paul.chaignon@gmail.com>
+# All rights reserved.
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+. "${srcdir=.}/init.sh"
+
+# -I2 avoids blocking all fatal signals, the default when using -o.
+$STRACE -o "$LOG" -I2 -e status=detached ../sleep 2 &
+pid=$!
+../sleep 1
+kill $pid
+wait
+match_grep
--- /dev/null
+/*
+ * Check status=failed filtering for failed and successful syscalls.
+ *
+ * Copyright (c) 2019 Intel Corporation
+ * Copyright (c) 2019 Paul Chaignon <paul.chaignon@gmail.com>
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "tests.h"
+#include <stdio.h>
+
+int
+main(void)
+{
+ static const char sample_valid[] = ".";
+ static const char sample_invalid[] = "";
+
+ test_status_chdir(sample_valid, 0, 1);
+ test_status_chdir(sample_invalid, 0, 1);
+ puts("+++ exited with 0 +++");
+ return 0;
+}
--- /dev/null
+/*
+ * Check status=none filtering when a non-leader thread invokes execve.
+ *
+ * Copyright (c) 2019 Paul Chaignon <paul.chaignon@gmail.com>
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "tests.h"
+#include <errno.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <asm/unistd.h>
+
+static pid_t leader;
+
+static void *
+thread(void *arg)
+{
+ struct timespec ts = { .tv_nsec = 100000000 };
+ (void) nanosleep(&ts, NULL);
+
+ printf("%-5d +++ superseded by execve in pid %u +++\n",
+ leader, (int) syscall(__NR_gettid));
+
+ char *argv[] = {((char **) arg)[0], (char *) "0", NULL};
+ execve(argv[0], argv, NULL);
+ perror_msg_and_fail("execve");
+}
+
+int
+main(int ac, char **av)
+{
+ setvbuf(stdout, NULL, _IONBF, 0);
+ leader = getpid();
+
+ if (ac > 1) {
+ printf("%-5d +++ exited with 0 +++\n", leader);
+ return 0;
+ }
+
+ pthread_t t;
+ errno = pthread_create(&t, NULL, thread, av);
+ if (errno)
+ perror_msg_and_fail("pthread_create");
+
+ struct timespec ts = { .tv_sec = 123 };
+ (void) nanosleep(&ts, 0);
+
+ return 1;
+}
--- /dev/null
+#!/bin/sh
+#
+# Check status=none filtering when a non-leader thread invokes execve.
+#
+# Copyright (c) 2019 The strace developers.
+# All rights reserved.
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+. "${srcdir=.}/init.sh"
+
+# Check that PTRACE_EVENT_EXEC support in kernel is good enough.
+# The kernel before commit v3.1-rc1~308^2~7 reported 0 instead of old pid.
+require_min_kernel_version_or_skip 3.1
+
+check_prog diff
+run_prog_skip_if_failed date +%s > /dev/null
+s0="$(date +%s)"
+
+run_prog > /dev/null
+
+set -- -a14 -f -e status=${status_filter:-none} $args
+
+# Due to probabilistic nature of the test, try it several times.
+while :; do
+ > "$LOG" || fail_ "failed to write $LOG"
+ rc=0
+ $STRACE -o "$LOG" "$@" > "$EXP" || {
+ rc=$?
+ cat < "$LOG" >&2
+ }
+
+ if [ "$rc" = 0 ] && diff -u -- "$EXP" "$LOG"; then
+ exit 0
+ fi
+
+ s1="$(date +%s)"
+ [ "$(($s1-$s0))" -gt "$(($TIMEOUT_DURATION/2))" ] ||
+ continue
+
+ [ "$rc" = 0 ] &&
+ fail_ "$STRACE $* output mismatch" ||
+ fail_ "$STRACE $* failed with code $rc"
+done
--- /dev/null
+/*
+ * Check basic -e status=none syscall filtering.
+ *
+ * Copyright (c) 2019 The strace developers.
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "tests.h"
+#include <stdio.h>
+
+int
+main(void)
+{
+ puts("+++ exited with 0 +++");
+ return 0;
+}
--- /dev/null
+/*
+ * Check status=successful filtering for failed and successful syscalls.
+ *
+ * Copyright (c) 2019 Intel Corporation
+ * Copyright (c) 2019 Paul Chaignon <paul.chaignon@gmail.com>
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "tests.h"
+#include <stdio.h>
+
+int
+main(void)
+{
+ static const char sample_valid[] = ".";
+ static const char sample_invalid[] = "";
+
+ test_status_chdir(sample_valid, 1, 0);
+ test_status_chdir(sample_invalid, 1, 0);
+ puts("+++ exited with 0 +++");
+ return 0;
+}
--- /dev/null
+/*
+ * Check status=unfinished filtering when a non-leader thread invokes execve.
+ *
+ * Copyright (c) 2019 Paul Chaignon <paul.chaignon@gmail.com>
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "tests.h"
+#include <errno.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <asm/unistd.h>
+
+static pid_t leader;
+
+static void *
+thread(void *arg)
+{
+ struct timespec ts = { .tv_nsec = 100000000 };
+ (void) nanosleep(&ts, NULL);
+
+ printf("%-5d nanosleep({tv_sec=123, tv_nsec=0}, <unfinished ...>) = ?\n"
+ "%-5d +++ superseded by execve in pid %u +++\n",
+ leader, leader, (int) syscall(__NR_gettid));
+
+ char *argv[] = {((char **) arg)[0], (char *) "0", NULL};
+ execve(argv[0], argv, NULL);
+ perror_msg_and_fail("execve");
+}
+
+int
+main(int ac, char **av)
+{
+ setvbuf(stdout, NULL, _IONBF, 0);
+ leader = getpid();
+
+ if (ac > 1) {
+ printf("%-5d exit_group(0) = ?\n"
+ "%-5d +++ exited with 0 +++\n", leader, leader);
+ return 0;
+ }
+
+ pthread_t t;
+ errno = pthread_create(&t, NULL, thread, av);
+ if (errno)
+ perror_msg_and_fail("pthread_create");
+
+ struct timespec ts = { .tv_sec = 123 };
+ (void) nanosleep(&ts, 0);
+
+ return 1;
+}
--- /dev/null
+#!/bin/sh
+#
+# Check status=unfinished filtering when a non-leader thread invokes execve.
+#
+# Copyright (c) 2019 The strace developers.
+# All rights reserved.
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+status_filter=unfinished
+
+. "${srcdir=.}"/status-none-threads.test
--- /dev/null
+/*
+ * Check basic -e status=unfinished syscall filtering.
+ *
+ * Copyright (c) 2019 Paul Chaignon <paul.chaignon@gmail.com>
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "tests.h"
+#include <stdio.h>
+
+int
+main(void)
+{
+ puts("exit_group(0) = ?\n"
+ "+++ exited with 0 +++");
+ return 0;
+}
--- /dev/null
+/*
+ * Helper function to check -e status option.
+ *
+ * Copyright (c) 2019 Intel Corporation
+ * Copyright (c) 2019 Paul Chaignon <paul.chaignon@gmail.com>
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "tests.h"
+#include <stdio.h>
+#include <unistd.h>
+
+void
+test_status_chdir(const char *dir, bool print_success, bool print_fail)
+{
+ long rc = chdir(dir);
+ if ((rc == -1 && print_fail) || (rc != -1 && print_success))
+ printf("chdir(\"%s\") = %s\n", dir, sprintrc(rc));
+}
int socketcall(const int nr, const int call,
long a1, long a2, long a3, long a4, long a5);
+/* Call chdir and print strace output depending on flags. */
+void test_status_chdir(const char *dir, bool print_success, bool print_fail);
+
/* Wrappers for recvmmsg and sendmmsg syscalls. */
struct mmsghdr;
struct timespec;