import strace-4.24-9.el8

This commit is contained in:
CentOS Sources 2020-04-23 23:11:50 +00:00 committed by Andrew Lukoshko
commit f19f425938
58 changed files with 40036 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
SOURCES/strace-4.24.tar.xz

1
.strace.metadata Normal file
View File

@ -0,0 +1 @@
09a8c9638fd02622157af9d744ad7c7f991c75df SOURCES/strace-4.24.tar.xz

View File

@ -0,0 +1,37 @@
From ba803931948fe89ddf9e3ec407e5e16c689863ad Mon Sep 17 00:00:00 2001
From: Zhibin Li <08826794brmt@gmail.com>
Date: Wed, 1 Aug 2018 17:53:57 +0800
Subject: [PATCH 01/27] evdev: fix decoding of bit sets
According to drivers/input/evdev.c:bits_to_user(),
the Linux kernel returns the number of bytes, not bits.
* evdev.c (decode_bitset_): Treat syscall return value as the number
of bytes.
Co-Authored-by: Dmitry V. Levin <ldv@altlinux.org>
Fixes: v4.10~89 "Add decoding for evdev ioctls"
---
evdev.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/evdev.c b/evdev.c
index 7ca15c9..3c1aaa8 100644
--- a/evdev.c
+++ b/evdev.c
@@ -171,10 +171,10 @@ decode_bitset_(struct tcb *const tcp, const kernel_ulong_t arg,
tprints(", ");
unsigned int size;
- if ((kernel_ulong_t) tcp->u_rval > max_nr)
+ if ((kernel_ulong_t) tcp->u_rval > max_nr / 8)
size = max_nr;
else
- size = tcp->u_rval;
+ size = tcp->u_rval * 8;
char decoded_arg[size];
if (umove_or_printaddr(tcp, arg, &decoded_arg))
--
2.1.4

View File

@ -0,0 +1,173 @@
From c658eb981bfc302aafe5be6e4118a9c0a3f1735e Mon Sep 17 00:00:00 2001
From: Zhibin Li <08826794brmt@gmail.com>
Date: Wed, 1 Aug 2018 17:53:57 +0800
Subject: [PATCH 02/27] evdev: fix decoding of EVIOCGBIT(0, ...)
There is a comment in drivers/input/evdev.c which says:
/* EV_SYN==0 is EV_CNT, _not_ SYN_CNT, see EVIOCGBIT */
That is, EVIOCGBIT(0, ...) should return a bit mask with supported
event types instead of SYN_* event codes.
* defs.h (evdev_ev): New prototype.
* evdev.c: Include "xlat/evdev_ev.h" and remove "xlat/evdev_sync.h".
(bit_ioctl) <case EV_SYN>: Replace EV_SYN with 0, use evdev_ev
with XT_SORTED in decode_bitset invocation instead.
* ioctl.c: Do not include "xlat/evdev_ev.h".
(evdev_decode_number): Print nr == 0x20 as "0" instead of "EV_SYN".
* tests/ioctl_evdev.c (main): Use 0 instead of EV_SYN in EVIOCGBIT
output.
* xlat/evdev_sync.in: Remove.
Additional changes:
xlat/evdev_ev.h (auto-generated from xlat/evdev_ev.in)
Co-Authored-by: Dmitry V. Levin <ldv@altlinux.org>
Fixes: v4.10~89 "Add decoding for evdev ioctls"
---
defs.h | 1 +
evdev.c | 8 ++++----
ioctl.c | 7 ++++---
tests/ioctl_evdev.c | 2 +-
xlat/evdev_sync.in | 5 -----
5 files changed, 10 insertions(+), 13 deletions(-)
delete mode 100644 xlat/evdev_sync.in
Index: strace-4.24/defs.h
===================================================================
--- strace-4.24.orig/defs.h 2020-01-27 17:13:39.441001784 +0100
+++ strace-4.24/defs.h 2020-01-27 17:14:03.150778494 +0100
@@ -330,6 +330,7 @@
/** Number of elements in evdev_abs array without the terminating record. */
extern const size_t evdev_abs_size;
+extern const struct xlat evdev_ev[];
extern const struct xlat iffflags[];
extern const struct xlat ip_type_of_services[];
extern const struct xlat ipc_private[];
Index: strace-4.24/evdev.c
===================================================================
--- strace-4.24.orig/evdev.c 2020-01-27 17:14:01.715792008 +0100
+++ strace-4.24/evdev.c 2020-01-27 17:14:03.151778485 +0100
@@ -30,6 +30,7 @@
#include "defs.h"
#include "xlat/evdev_abs.h"
+#include "xlat/evdev_ev.h"
#ifdef HAVE_LINUX_INPUT_H
@@ -47,7 +48,6 @@
# include "xlat/evdev_relative_axes.h"
# include "xlat/evdev_snd.h"
# include "xlat/evdev_switch.h"
-# include "xlat/evdev_sync.h"
# ifndef SYN_MAX
# define SYN_MAX 0xf
@@ -258,9 +258,9 @@
const kernel_ulong_t arg)
{
switch (ev_nr) {
- case EV_SYN:
- return decode_bitset(tcp, arg, evdev_sync,
- SYN_MAX, "SYN_???", XT_INDEXED);
+ case 0:
+ return decode_bitset(tcp, arg, evdev_ev,
+ EV_MAX, "EV_???", XT_SORTED);
case EV_KEY:
return decode_bitset(tcp, arg, evdev_keycode,
KEY_MAX, "KEY_???", XT_INDEXED);
Index: strace-4.24/ioctl.c
===================================================================
--- strace-4.24.orig/ioctl.c 2020-01-27 17:13:39.441001784 +0100
+++ strace-4.24/ioctl.c 2020-01-27 17:14:03.152778475 +0100
@@ -33,8 +33,6 @@
#include <linux/ioctl.h>
#include "xlat/ioctl_dirs.h"
-#include "xlat/evdev_ev.h"
-
static int
compare(const void *a, const void *b)
{
@@ -99,7 +97,10 @@
if (nr >= 0x20 && nr <= 0x20 + 0x1f) {
tprints("EVIOCGBIT(");
- printxval(evdev_ev, nr - 0x20, "EV_???");
+ if (nr == 0x20)
+ tprintf("0");
+ else
+ printxval(evdev_ev, nr - 0x20, "EV_???");
tprintf(", %u)", _IOC_SIZE(code));
return 1;
} else if (nr >= 0x40 && nr <= 0x40 + 0x3f) {
Index: strace-4.24/tests/ioctl_evdev.c
===================================================================
--- strace-4.24.orig/tests/ioctl_evdev.c 2020-01-27 17:13:39.441001784 +0100
+++ strace-4.24/tests/ioctl_evdev.c 2020-01-27 17:14:03.153778466 +0100
@@ -138,7 +138,7 @@
TEST_NULL_ARG_EX(EVIOCGABS(0x3f), "EVIOCGABS(0x3f /* ABS_??? */)");
TEST_NULL_ARG_EX(EVIOCSABS(0x3f), "EVIOCSABS(0x3f /* ABS_??? */)");
- TEST_NULL_ARG(EVIOCGBIT(EV_SYN, 0));
+ TEST_NULL_ARG(EVIOCGBIT(0, 0));
TEST_NULL_ARG(EVIOCGBIT(EV_KEY, 1));
TEST_NULL_ARG(EVIOCGBIT(EV_REL, 2));
TEST_NULL_ARG(EVIOCGBIT(EV_ABS, 3));
Index: strace-4.24/xlat/evdev_sync.in
===================================================================
--- strace-4.24.orig/xlat/evdev_sync.in 2020-01-27 17:13:39.441001784 +0100
+++ /dev/null 1970-01-01 00:00:00.000000000 +0000
@@ -1,5 +0,0 @@
-#value_indexed
-SYN_REPORT 0
-SYN_CONFIG 1
-SYN_MT_REPORT 2
-SYN_DROPPED 3
Index: strace-4.24/xlat/evdev_ev.h
===================================================================
--- strace-4.24.orig/xlat/evdev_ev.h 2020-01-27 17:13:39.441001784 +0100
+++ strace-4.24/xlat/evdev_ev.h 2020-01-27 17:14:03.155778447 +0100
@@ -90,13 +90,8 @@
#ifndef XLAT_MACROS_ONLY
-# ifdef IN_MPERS
+# ifndef IN_MPERS
-# error static const struct xlat evdev_ev in mpers mode
-
-# else
-
-static
const struct xlat evdev_ev[] = {
XLAT(EV_SYN),
XLAT(EV_KEY),
Index: strace-4.24/tests-m32/ioctl_evdev.c
===================================================================
--- strace-4.24.orig/tests-m32/ioctl_evdev.c 2018-06-14 13:00:00.000000000 +0200
+++ strace-4.24/tests-m32/ioctl_evdev.c 2020-01-27 17:14:28.812536821 +0100
@@ -138,7 +138,7 @@
TEST_NULL_ARG_EX(EVIOCGABS(0x3f), "EVIOCGABS(0x3f /* ABS_??? */)");
TEST_NULL_ARG_EX(EVIOCSABS(0x3f), "EVIOCSABS(0x3f /* ABS_??? */)");
- TEST_NULL_ARG(EVIOCGBIT(EV_SYN, 0));
+ TEST_NULL_ARG(EVIOCGBIT(0, 0));
TEST_NULL_ARG(EVIOCGBIT(EV_KEY, 1));
TEST_NULL_ARG(EVIOCGBIT(EV_REL, 2));
TEST_NULL_ARG(EVIOCGBIT(EV_ABS, 3));
Index: strace-4.24/tests-mx32/ioctl_evdev.c
===================================================================
--- strace-4.24.orig/tests-mx32/ioctl_evdev.c 2018-06-14 13:00:00.000000000 +0200
+++ strace-4.24/tests-mx32/ioctl_evdev.c 2020-01-27 17:14:31.013516093 +0100
@@ -138,7 +138,7 @@
TEST_NULL_ARG_EX(EVIOCGABS(0x3f), "EVIOCGABS(0x3f /* ABS_??? */)");
TEST_NULL_ARG_EX(EVIOCSABS(0x3f), "EVIOCSABS(0x3f /* ABS_??? */)");
- TEST_NULL_ARG(EVIOCGBIT(EV_SYN, 0));
+ TEST_NULL_ARG(EVIOCGBIT(0, 0));
TEST_NULL_ARG(EVIOCGBIT(EV_KEY, 1));
TEST_NULL_ARG(EVIOCGBIT(EV_REL, 2));
TEST_NULL_ARG(EVIOCGBIT(EV_ABS, 3));

View File

@ -0,0 +1,52 @@
From 1422eda187f936e576b17a3e0036b1c1c3476fc4 Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Sun, 19 Aug 2018 21:51:15 +0200
Subject: [PATCH 03/27] xlat: fix typo in smc_protocols.in
* xlat/smc_protocols.in: s/^MCPROTO_SMC/SMCPROTO_SMC/.
Additional changes:
Updated aut-generated xlat/smc_protocols.h
---
xlat/smc_protocols.in | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Index: strace-4.24/xlat/smc_protocols.in
===================================================================
--- strace-4.24.orig/xlat/smc_protocols.in 2018-05-08 22:59:20.000000000 +0200
+++ strace-4.24/xlat/smc_protocols.in 2019-03-10 05:08:53.367748788 +0100
@@ -1,3 +1,3 @@
#value_indexed
-MCPROTO_SMC 0
+SMCPROTO_SMC 0
SMCPROTO_SMC6 1
Index: strace-4.24/xlat/smc_protocols.h
===================================================================
--- strace-4.24.orig/xlat/smc_protocols.h 2018-08-14 02:44:23.000000000 +0200
+++ strace-4.24/xlat/smc_protocols.h 2019-03-10 05:09:36.010321779 +0100
@@ -3,12 +3,12 @@
#include "gcc_compat.h"
#include "static_assert.h"
-#if defined(MCPROTO_SMC) || (defined(HAVE_DECL_MCPROTO_SMC) && HAVE_DECL_MCPROTO_SMC)
+#if defined(SMCPROTO_SMC) || (defined(HAVE_DECL_SMCPROTO_SMC) && HAVE_DECL_SMCPROTO_SMC)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MCPROTO_SMC) == (0), "MCPROTO_SMC != 0");
+static_assert((SMCPROTO_SMC) == (0), "SMCPROTO_SMC != 0");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MCPROTO_SMC 0
+# define SMCPROTO_SMC 0
#endif
#if defined(SMCPROTO_SMC6) || (defined(HAVE_DECL_SMCPROTO_SMC6) && HAVE_DECL_SMCPROTO_SMC6)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
@@ -28,7 +28,7 @@
static
const struct xlat smc_protocols[] = {
- [MCPROTO_SMC] = XLAT(MCPROTO_SMC),
+ [SMCPROTO_SMC] = XLAT(SMCPROTO_SMC),
[SMCPROTO_SMC6] = XLAT(SMCPROTO_SMC6),
XLAT_END
};

View File

@ -0,0 +1,291 @@
From acdd2e8d3d1551b41170a24951addb80b0b0d423 Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Tue, 14 Aug 2018 13:43:34 +0000
Subject: [PATCH 04/27] strace.c: introduce struct tcb_wait_data
Introduce a new structure to pass information between next_event(),
restart_delayed_tcb(), and dispatch_event().
This is going to be used by a subsequent change of next_event().
* strace.c (struct tcb_wait_data): New type.
(next_event): Remove parameters, return a pointer
to const struct tcb_wait_data. Return NULL instead of TE_BREAK.
(dispatch_event): Replace all parameters with a pointer
to const struct tcb_wait_data, obtain the trace event, siginfo,
and status from its fields.
(restart_delayed_tcb): Add local struct tcb_wait_data variable
with te field set to TE_RESTART, pass it to dispatch_event().
(main): Remove status and si variables, update next_event()
and dispatch_event() invocations.
Co-Authored-by: Eugene Syromyatnikov <evgsyr@gmail.com>
---
strace.c | 107 ++++++++++++++++++++++++++++++++++++++++-----------------------
1 file changed, 69 insertions(+), 38 deletions(-)
diff --git a/strace.c b/strace.c
index cd04b98..6d70d20 100644
--- a/strace.c
+++ b/strace.c
@@ -158,6 +158,12 @@ static bool open_append;
struct tcb *printing_tcp;
static struct tcb *current_tcp;
+struct tcb_wait_data {
+ enum trace_event te; /**< Event passed to dispatch_event() */
+ int status; /**< status, returned by wait4() */
+ siginfo_t si; /**< siginfo, returned by PTRACE_GETSIGINFO */
+};
+
static struct tcb **tcbtab;
static unsigned int nprocs;
static size_t tcbtabsize;
@@ -2226,16 +2232,19 @@ print_event_exit(struct tcb *tcp)
line_ended();
}
-static enum trace_event
-next_event(int *pstatus, siginfo_t *si)
+static const struct tcb_wait_data *
+next_event(void)
{
+ static struct tcb_wait_data wait_data;
+
int pid;
int status;
struct tcb *tcp;
+ struct tcb_wait_data *wd = &wait_data;
struct rusage ru;
if (interrupted)
- return TE_BREAK;
+ return NULL;
/*
* Used to exit simply when nprocs hits zero, but in this testcase:
@@ -2255,7 +2264,7 @@ next_event(int *pstatus, siginfo_t *si)
* on exit. Oh well...
*/
if (nprocs == 0)
- return TE_BREAK;
+ return NULL;
}
const bool unblock_delay_timer = is_delay_timer_armed();
@@ -2278,7 +2287,7 @@ next_event(int *pstatus, siginfo_t *si)
* then the system call will be interrupted and
* the expiration will be handled by the signal handler.
*/
- pid = wait4(-1, pstatus, __WALL, (cflag ? &ru : NULL));
+ pid = wait4(-1, &status, __WALL, (cflag ? &ru : NULL));
const int wait_errno = errno;
/*
@@ -2292,14 +2301,16 @@ next_event(int *pstatus, siginfo_t *si)
sigprocmask(SIG_BLOCK, &timer_set, NULL);
if (restart_failed)
- return TE_BREAK;
+ return NULL;
}
if (pid < 0) {
- if (wait_errno == EINTR)
- return TE_NEXT;
+ if (wait_errno == EINTR) {
+ wd->te = TE_NEXT;
+ return wd;
+ }
if (nprocs == 0 && wait_errno == ECHILD)
- return TE_BREAK;
+ return NULL;
/*
* If nprocs > 0, ECHILD is not expected,
* treat it as any other error here:
@@ -2308,12 +2319,13 @@ next_event(int *pstatus, siginfo_t *si)
perror_msg_and_die("wait4(__WALL)");
}
- status = *pstatus;
+ wd->status = status;
if (pid == popen_pid) {
if (!WIFSTOPPED(status))
popen_pid = 0;
- return TE_NEXT;
+ wd->te = TE_NEXT;
+ return wd;
}
if (debug_flag)
@@ -2324,8 +2336,10 @@ next_event(int *pstatus, siginfo_t *si)
if (!tcp) {
tcp = maybe_allocate_tcb(pid, status);
- if (!tcp)
- return TE_NEXT;
+ if (!tcp) {
+ wd->te = TE_NEXT;
+ return wd;
+ }
}
clear_regs(tcp);
@@ -2342,11 +2356,15 @@ next_event(int *pstatus, siginfo_t *si)
tcp->stime = stime;
}
- if (WIFSIGNALED(status))
- return TE_SIGNALLED;
+ if (WIFSIGNALED(status)) {
+ wd->te = TE_SIGNALLED;
+ return wd;
+ }
- if (WIFEXITED(status))
- return TE_EXITED;
+ if (WIFEXITED(status)) {
+ wd->te = TE_EXITED;
+ return wd;
+ }
/*
* As WCONTINUED flag has not been specified to wait4,
@@ -2373,19 +2391,19 @@ next_event(int *pstatus, siginfo_t *si)
if (sig == SIGSTOP && (tcp->flags & TCB_IGNORE_ONE_SIGSTOP)) {
debug_func_msg("ignored SIGSTOP on pid %d", tcp->pid);
tcp->flags &= ~TCB_IGNORE_ONE_SIGSTOP;
- return TE_RESTART;
+ wd->te = TE_RESTART;
} else if (sig == syscall_trap_sig) {
- return TE_SYSCALL_STOP;
+ wd->te = TE_SYSCALL_STOP;
} else {
- *si = (siginfo_t) {};
+ memset(&wd->si, 0, sizeof(wd->si));
/*
* True if tracee is stopped by signal
* (as opposed to "tracee received signal").
* TODO: shouldn't we check for errno == EINVAL too?
* We can get ESRCH instead, you know...
*/
- bool stopped = ptrace(PTRACE_GETSIGINFO, pid, 0, si) < 0;
- return stopped ? TE_GROUP_STOP : TE_SIGNAL_DELIVERY_STOP;
+ bool stopped = ptrace(PTRACE_GETSIGINFO, pid, 0, &wd->si) < 0;
+ wd->te = stopped ? TE_GROUP_STOP : TE_SIGNAL_DELIVERY_STOP;
}
break;
case PTRACE_EVENT_STOP:
@@ -2398,16 +2416,23 @@ next_event(int *pstatus, siginfo_t *si)
case SIGTSTP:
case SIGTTIN:
case SIGTTOU:
- return TE_GROUP_STOP;
+ wd->te = TE_GROUP_STOP;
+ break;
+ default:
+ wd->te = TE_RESTART;
}
- return TE_RESTART;
+ break;
case PTRACE_EVENT_EXEC:
- return TE_STOP_BEFORE_EXECVE;
+ wd->te = TE_STOP_BEFORE_EXECVE;
+ break;
case PTRACE_EVENT_EXIT:
- return TE_STOP_BEFORE_EXIT;
+ wd->te = TE_STOP_BEFORE_EXIT;
+ break;
default:
- return TE_RESTART;
+ wd->te = TE_RESTART;
}
+
+ return wd;
}
static int
@@ -2436,12 +2461,18 @@ trace_syscall(struct tcb *tcp, unsigned int *sig)
/* Returns true iff the main trace loop has to continue. */
static bool
-dispatch_event(enum trace_event ret, int *pstatus, siginfo_t *si)
+dispatch_event(const struct tcb_wait_data *wd)
{
unsigned int restart_op = PTRACE_SYSCALL;
unsigned int restart_sig = 0;
+ enum trace_event te = wd ? wd->te : TE_BREAK;
+ /*
+ * Copy wd->status to a non-const variable to workaround glibc bugs
+ * around union wait fixed by glibc commit glibc-2.24~391
+ */
+ int status = wd ? wd->status : 0;
- switch (ret) {
+ switch (te) {
case TE_BREAK:
return false;
@@ -2469,17 +2500,17 @@ dispatch_event(enum trace_event ret, int *pstatus, siginfo_t *si)
break;
case TE_SIGNAL_DELIVERY_STOP:
- restart_sig = WSTOPSIG(*pstatus);
- print_stopped(current_tcp, si, restart_sig);
+ restart_sig = WSTOPSIG(status);
+ print_stopped(current_tcp, &wd->si, restart_sig);
break;
case TE_SIGNALLED:
- print_signalled(current_tcp, current_tcp->pid, *pstatus);
+ print_signalled(current_tcp, current_tcp->pid, status);
droptcb(current_tcp);
return true;
case TE_GROUP_STOP:
- restart_sig = WSTOPSIG(*pstatus);
+ restart_sig = WSTOPSIG(status);
print_stopped(current_tcp, NULL, restart_sig);
if (use_seize) {
/*
@@ -2494,7 +2525,7 @@ dispatch_event(enum trace_event ret, int *pstatus, siginfo_t *si)
break;
case TE_EXITED:
- print_exited(current_tcp, current_tcp->pid, *pstatus);
+ print_exited(current_tcp, current_tcp->pid, status);
droptcb(current_tcp);
return true;
@@ -2577,13 +2608,15 @@ dispatch_event(enum trace_event ret, int *pstatus, siginfo_t *si)
static bool
restart_delayed_tcb(struct tcb *const tcp)
{
+ const struct tcb_wait_data wd = { .te = TE_RESTART };
+
debug_func_msg("pid %d", tcp->pid);
tcp->flags &= ~TCB_DELAYED;
struct tcb *const prev_tcp = current_tcp;
current_tcp = tcp;
- bool ret = dispatch_event(TE_RESTART, NULL, NULL);
+ bool ret = dispatch_event(&wd);
current_tcp = prev_tcp;
return ret;
@@ -2694,9 +2727,7 @@ main(int argc, char *argv[])
exit_code = !nprocs;
- int status;
- siginfo_t si;
- while (dispatch_event(next_event(&status, &si), &status, &si))
+ while (dispatch_event(next_event()))
;
terminate();
}
--
2.1.4

View File

@ -0,0 +1,28 @@
From 57aa6acb769e4a78d769e066411661e2aa053b4b Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Wed, 21 Nov 2018 22:51:49 +0000
Subject: [PATCH 05/27] Document -X option in strace -h output
* strace.c (usage): Mention -X option.
Reported-by: Dmitry Vyukov <dvyukov@google.com>
Complements: v4.23~308 "Add user interface for configuring xlat output style"
---
strace.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/strace.c b/strace.c
index 6d70d20..1146339 100644
--- a/strace.c
+++ b/strace.c
@@ -272,6 +272,7 @@ Output format:\n\
-T print time spent in each syscall\n\
-x print non-ascii strings in hex\n\
-xx print all strings in hex\n\
+ -X format set the format for printing of named constants and flags\n\
-y print paths associated with file descriptor arguments\n\
-yy print protocol specific information associated with socket file descriptors\n\
\n\
--
2.1.4

View File

@ -0,0 +1,30 @@
From fdc95e89441ba6f2d39f5f6f3e2ac20933245b8d Mon Sep 17 00:00:00 2001
From: Eugene Syromiatnikov <esyr@redhat.com>
Date: Thu, 20 Dec 2018 16:35:27 +0100
Subject: [PATCH 06/27] evdev: fix off-by-one error in decode_bitset
* evdev.c (decode_bitset): Decrement sorted/indexed xlat's size by one
in order to account for guarding XLAT_END, as other sorted/indexed xlat
wrappers do.
Fixes: v4.23~261 "evdev: support various types of xlats in decode_bitset"
---
evdev.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/evdev.c b/evdev.c
index cae2ef1..957d0e2 100644
--- a/evdev.c
+++ b/evdev.c
@@ -208,7 +208,7 @@ decode_bitset_(struct tcb *const tcp, const kernel_ulong_t arg,
#define decode_bitset(tcp_, arg_, decode_nr_, max_nr_, dflt_, xt_) \
decode_bitset_((tcp_), (arg_), (decode_nr_), (max_nr_), \
- (dflt_), ARRAY_SIZE(decode_nr_), (xt_))
+ (dflt_), ARRAY_SIZE(decode_nr_) - 1, (xt_))
# ifdef EVIOCGMTSLOTS
static int
--
2.1.4

View File

@ -0,0 +1,29 @@
From def46773e2540b4898b26c470d8d658b4b39075f Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Sun, 23 Dec 2018 22:12:36 +0000
Subject: [PATCH 07/27] nlattr: fix off-by-one error in indexed xlat lookup
* nlattr.c (decode_nla_meminfo): Decrement xlat size by one
to account for XLAT_END as other users of indexed xlats do.
Fixes: v4.23~89 "nlattr: print index names in netlink meminfo array"
---
nlattr.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/nlattr.c b/nlattr.c
index af7cc16..db37452 100644
--- a/nlattr.c
+++ b/nlattr.c
@@ -217,7 +217,7 @@ decode_nla_meminfo(struct tcb *const tcp,
tfetch_mem, print_uint32_array_member, &count,
PAF_PRINT_INDICES | PAF_INDEX_XLAT_VALUE_INDEXED
| XLAT_STYLE_FMT_U,
- ARRSZ_PAIR(netlink_sk_meminfo_indices),
+ ARRSZ_PAIR(netlink_sk_meminfo_indices) - 1,
"SK_MEMINFO_???");
return true;
--
2.1.4

View File

@ -0,0 +1,29 @@
From d0035c3031b0d5a1cbb300d698328d118af33d3e Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Sun, 23 Dec 2018 22:12:36 +0000
Subject: [PATCH 08/27] aio: fix off-by-one error in indexed xlat lookup
* aio.c (tprint_lio_opcode): Decrement xlat size by one to account
for XLAT_END as other users of indexed xlats do.
Fixes: v4.24~71 "aio: print IOCB_CMD_* using xlat"
---
aio.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/aio.c b/aio.c
index a07d8eb..24ad69f 100644
--- a/aio.c
+++ b/aio.c
@@ -70,7 +70,7 @@ tprint_lio_opcode(unsigned int cmd)
[IOCB_CMD_PWRITEV] = SUB_VECTOR,
};
- printxval_indexn_ex(ARRSZ_PAIR(aio_cmds), cmd, "IOCB_CMD_???",
+ printxval_indexn_ex(ARRSZ_PAIR(aio_cmds) - 1, cmd, "IOCB_CMD_???",
XLAT_STYLE_FMT_U);
return cmd < ARRAY_SIZE(subs) ? subs[cmd] : SUB_NONE;
--
2.1.4

View File

@ -0,0 +1,94 @@
From ee037ea1bbe3e9134eab3586bbd54613f39a1693 Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Sun, 23 Dec 2018 22:12:36 +0000
Subject: [PATCH 09/27] rtnl_link: fix off-by-one errors in indexed and sorted
xlat lookups
* rtnl_link.c (decode_nla_tun_type, decode_ifla_xdp_attached,
decode_ifla_inet_conf, decode_ifla_inet6_flags, decode_ifla_inet6_conf,
decode_ifla_inet6_stats, decode_ifla_inet6_icmp6_stats,
decode_ifla_inet6_agm): Decrement xlat size by one to account
for XLAT_END as other users of indexed and sorted xlats do.
Fixes: v4.25~71 "rtnl_link: decode named constants for IFLA_XDP_ATTACHED attribute value"
Fixes: v4.23~41 "rtnl_link: decode IFLA_AF_SPEC"
Fixes: v4.23~37 "rtnl_link: implement IFLA_INFO_DATA for tun devices"
Conflicts:
rtnl_link.c
---
rtnl_link.c | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/rtnl_link.c b/rtnl_link.c
index 1fbfd26..8e02bc7 100644
--- a/rtnl_link.c
+++ b/rtnl_link.c
@@ -356,7 +356,7 @@ decode_nla_tun_type(struct tcb *const tcp,
{
const struct decode_nla_xlat_opts opts = {
.xlat = tun_device_types,
- .xlat_size = ARRAY_SIZE(tun_device_types),
+ .xlat_size = ARRAY_SIZE(tun_device_types) - 1,
.xt = XT_INDEXED,
.dflt = "IFF_???",
.size = 1,
@@ -626,7 +626,8 @@ decode_ifla_inet_conf(struct tcb *const tcp,
print_array_ex(tcp, addr, cnt, &elem, sizeof(elem),
tfetch_mem, print_int32_array_member, NULL,
PAF_PRINT_INDICES | PAF_INDEX_XLAT_VALUE_INDEXED
- | XLAT_STYLE_FMT_D, ARRSZ_PAIR(inet_devconf_indices),
+ | XLAT_STYLE_FMT_D,
+ ARRSZ_PAIR(inet_devconf_indices) - 1,
"IPV4_DEVCONF_???");
return true;
@@ -643,7 +644,7 @@ decode_ifla_inet6_flags(struct tcb *const tcp,
const void *const opaque_data)
{
const struct decode_nla_xlat_opts opts = {
- ARRSZ_PAIR(inet6_if_flags), "IF_???",
+ ARRSZ_PAIR(inet6_if_flags) - 1, "IF_???",
.size = 4,
};
@@ -665,7 +666,8 @@ decode_ifla_inet6_conf(struct tcb *const tcp,
print_array_ex(tcp, addr, cnt, &elem, sizeof(elem),
tfetch_mem, print_int32_array_member, NULL,
PAF_PRINT_INDICES | PAF_INDEX_XLAT_VALUE_INDEXED
- | XLAT_STYLE_FMT_D, ARRSZ_PAIR(inet6_devconf_indices),
+ | XLAT_STYLE_FMT_D,
+ ARRSZ_PAIR(inet6_devconf_indices) - 1,
"DEVCONF_???");
return true;
@@ -686,7 +688,7 @@ decode_ifla_inet6_stats(struct tcb *const tcp,
print_array_ex(tcp, addr, cnt, &elem, sizeof(elem),
tfetch_mem, print_uint64_array_member, NULL,
PAF_PRINT_INDICES | PAF_INDEX_XLAT_VALUE_INDEXED
- | XLAT_STYLE_FMT_U, ARRSZ_PAIR(snmp_ip_stats),
+ | XLAT_STYLE_FMT_U, ARRSZ_PAIR(snmp_ip_stats) - 1,
"IPSTATS_MIB_???");
return true;
@@ -733,7 +735,7 @@ decode_ifla_inet6_icmp6_stats(struct tcb *const tcp,
print_array_ex(tcp, addr, cnt, &elem, sizeof(elem),
tfetch_mem, print_uint64_array_member, NULL,
PAF_PRINT_INDICES | PAF_INDEX_XLAT_VALUE_INDEXED
- | XLAT_STYLE_FMT_U, ARRSZ_PAIR(snmp_icmp6_stats),
+ | XLAT_STYLE_FMT_U, ARRSZ_PAIR(snmp_icmp6_stats) - 1,
"ICMP6_MIB_???");
return true;
@@ -762,7 +764,7 @@ decode_ifla_inet6_agm(struct tcb *const tcp,
const void *const opaque_data)
{
const struct decode_nla_xlat_opts opts = {
- ARRSZ_PAIR(in6_addr_gen_mode), "IN6_ADDR_GEN_MODE_???",
+ ARRSZ_PAIR(in6_addr_gen_mode) - 1, "IN6_ADDR_GEN_MODE_???",
.xt = XT_INDEXED,
.size = 1,
};
--
2.1.4

View File

@ -0,0 +1,30 @@
From 1fb452d1a836c69fc9cf7fea59a80a50fabd6385 Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Mon, 24 Dec 2018 10:19:24 +0000
Subject: [PATCH 10/27] xlat_idx: do not issue warnings for holes in indices
Some xlat indices like evdev_abs have holes, avoid issuing warnings
about them.
* xlat.c (xlat_idx): Do not issue warnings for holes in the index.
---
xlat.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/xlat.c b/xlat.c
index 4614cef..7de51da 100644
--- a/xlat.c
+++ b/xlat.c
@@ -269,6 +269,9 @@ xlat_idx(const struct xlat *xlat, size_t nmemb, uint64_t val)
return NULL;
if (val != pos[val].val) {
+ if (pos[val].val == 0)
+ return NULL; /* a hole in the index */
+
error_func_msg("Unexpected xlat value %" PRIu64
" at index %" PRIu64,
pos[val].val, val);
--
2.1.4

View File

@ -0,0 +1,403 @@
From ffc3e46d6ea23ba71eb49c8bc36eb3068968b691 Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Tue, 4 Sep 2018 16:45:04 +0200
Subject: [PATCH 11/27] strace.1.in: print names of entities in bold, provide
man page sections
* strace.1.in (.SH DESCRIPTION, .SH OPTIONS): Add man page section
numbers. Make mentions of strace and other entities bold.
Additional changes:
Update auto-generated strace.1
---
strace.1.in | 89 ++++++++++++++++++++++++++++++++++++++++++-------------------
1 file changed, 61 insertions(+), 28 deletions(-)
Index: strace-4.24/strace.1.in
===================================================================
--- strace-4.24.orig/strace.1.in 2018-07-07 12:29:02.000000000 +0200
+++ strace-4.24/strace.1.in 2019-03-10 05:12:00.665873244 +0100
@@ -177,7 +177,7 @@
open("xyzzy", O_WRONLY|O_APPEND|O_CREAT, 0666) = 3
.CE
Here, the third argument of
-.B open
+.BR open (2)
is decoded by breaking down the
flag argument into its three bitwise-OR constituents and printing the
mode value in octal by tradition. Where the traditional or native
@@ -198,7 +198,7 @@
.B st_mode
member is carefully decoded into a bitwise-OR of symbolic and numeric values.
Also notice in this example that the first argument to
-.B lstat
+.BR lstat (2)
is an input to the system call and the second argument is an output.
Since output arguments are not modified if the system call fails, arguments may
not always be dereferenced. For example, retrying the "ls \-l" example
@@ -224,15 +224,16 @@
(32 by default) bytes of strings are printed;
longer strings have an ellipsis appended following the closing quote.
Here is a line from "ls \-l" where the
-.B getpwuid
+.BR getpwuid (3)
library routine is reading the password file:
.CW
read(3, "root::0:0:System Administrator:/"..., 1024) = 422
.CE
While structures are annotated using curly braces, simple pointers
and arrays are printed using square brackets with commas separating
-elements. Here is an example from the command "id" on a system with
-supplementary group ids:
+elements. Here is an example from the command
+.BR id (1)
+on a system with supplementary group ids:
.CW
getgroups(32, [100, 0]) = 2
.CE
@@ -489,7 +490,7 @@
which is useful to seeing what files the process is referencing.
Furthermore, using the abbreviation will ensure that you don't
accidentally forget to include a call like
-.B lstat
+.BR lstat (2)
in the list. Betchya woulda forgot that one.
.TP
.BR "\-e\ trace" = %process
@@ -769,8 +770,7 @@
\fB\-e\ inject\fR= expression with default value of
.I errno
option set to
-.IR ENOSYS .
-
+.BR ENOSYS .
.TP
.BR "\-e\ kvm" = vcpu
Print the exit reason of kvm vcpu. Requires Linux kernel version 4.16.0
@@ -794,10 +794,11 @@
.BI "\-b " syscall
If specified syscall is reached, detach from traced process.
Currently, only
-.I execve
+.BR execve (2)
syscall is supported. This option is useful if you want to trace
-multi-threaded process and therefore require -f, but don't want
-to trace its (potentially very complex) children.
+multi-threaded process and therefore require
+.BR \-f ,
+but don't want to trace its (potentially very complex) children.
.TP
.B \-D
Run tracer process as a detached grandchild, not as parent of the
@@ -816,16 +817,20 @@
.B \-p
.I PID
.B \-f
-will attach all threads of process PID if it is multi-threaded,
-not only thread with thread_id = PID.
+will attach all threads of process
+.I PID
+if it is multi-threaded, not only thread with
+.IR thread_id " = " PID .
.TP
.B \-ff
If the
.B \-o
.I filename
option is in effect, each processes trace is written to
-.I filename.pid
-where pid is the numeric process id of each process.
+.IR filename . pid
+where
+.I pid
+is the numeric process id of each process.
This is incompatible with
.BR \-c ,
since no per-process counts are kept.
@@ -835,11 +840,30 @@
to obtain a combined strace log view.
.TP
.BI "\-I " interruptible
-When strace can be interrupted by signals (such as pressing ^C).
-1: no signals are blocked; 2: fatal signals are blocked while decoding syscall
-(default); 3: fatal signals are always blocked (default if '-o FILE PROG');
-4: fatal signals and SIGTSTP (^Z) are always blocked (useful to make
-strace -o FILE PROG not stop on ^Z).
+When
+.B strace
+can be interrupted by signals (such as pressing
+.BR ^C ).
+.RS
+.TP 4
+.B 1
+no signals are blocked;
+.TQ
+.B 2
+fatal signals are blocked while decoding syscall (default);
+.TQ
+.B 3
+fatal signals are always blocked (default if
+.BR -o " " \fIFILE\fR " " \fIPROG\fR );
+.TQ
+.B 4
+fatal signals and
+.BR SIGTSTP " (" ^Z )
+are always blocked (useful to make
+.BI "strace -o " "FILE PROG"
+not stop on
+.BR ^Z ).
+.RE
.SS Startup
.TP 12
\fB\-E\ \fIvar\fR=\,\fIval\fR
@@ -920,7 +944,8 @@
.B strace
can be used as a wrapper process transparent to the invoking parent process.
Note that parent-child relationship (signal stop notifications,
-getppid() value, etc) between traced process and its parent are not preserved
+.BR getppid (2)
+value, etc) between traced process and its parent are not preserved
unless
.B \-D
is used.
@@ -987,8 +1012,11 @@
definitions during the build time.
Please refer to the output of the
.B strace \-V
-command in order to figure out what support is available in your strace build
-("non-native" refers to an ABI that differs from the ABI strace has):
+command in order to figure out what support is available in your
+.B strace
+build ("non-native" refers to an ABI that differs from the ABI
+.B strace
+has):
.TP 15
.B m32-mpers
.B strace
@@ -1057,17 +1085,22 @@
.LP
On x32, syscalls that are intended to be used by 64-bit processes and not x32
ones (for example,
-.BR readv ,
+.BR readv (2),
that has syscall number 19 on x86_64, with its x32 counterpart has syscall
number 515), but called with
.B __X32_SYSCALL_BIT
-flag being set, are designated with "#64" suffix.
+flag being set, are designated with
+.B "#64"
+suffix.
.LP
On some platforms a process that is attached to with the
.B \-p
-option may observe a spurious EINTR return from the current
-system call that is not restartable. (Ideally, all system calls
-should be restarted on strace attach, making the attach invisible
+option may observe a spurious
+.B EINTR
+return from the current system call that is not restartable.
+(Ideally, all system calls should be restarted on
+.B strace
+attach, making the attach invisible
to the traced process, but a few system calls aren't.
Arguably, every instance of such behavior is a kernel bug.)
This may have an unpredictable effect on the process
Index: strace-4.24/strace.1
===================================================================
--- strace-4.24.orig/strace.1 2018-08-14 02:44:59.000000000 +0200
+++ strace-4.24/strace.1 2019-03-10 05:15:15.101926224 +0100
@@ -53,7 +53,7 @@
. el \
. BR "\\$1"
..
-.TH STRACE 1 "2018-07-07" "strace 4.24"
+.TH STRACE 1 "2019-03-08" "strace 4.24"
.SH NAME
strace \- trace system calls and signals
.SH SYNOPSIS
@@ -177,7 +177,7 @@
open("xyzzy", O_WRONLY|O_APPEND|O_CREAT, 0666) = 3
.CE
Here, the third argument of
-.B open
+.BR open (2)
is decoded by breaking down the
flag argument into its three bitwise-OR constituents and printing the
mode value in octal by tradition. Where the traditional or native
@@ -198,7 +198,7 @@
.B st_mode
member is carefully decoded into a bitwise-OR of symbolic and numeric values.
Also notice in this example that the first argument to
-.B lstat
+.BR lstat (2)
is an input to the system call and the second argument is an output.
Since output arguments are not modified if the system call fails, arguments may
not always be dereferenced. For example, retrying the "ls \-l" example
@@ -224,15 +224,16 @@
(32 by default) bytes of strings are printed;
longer strings have an ellipsis appended following the closing quote.
Here is a line from "ls \-l" where the
-.B getpwuid
+.BR getpwuid (3)
library routine is reading the password file:
.CW
read(3, "root::0:0:System Administrator:/"..., 1024) = 422
.CE
While structures are annotated using curly braces, simple pointers
and arrays are printed using square brackets with commas separating
-elements. Here is an example from the command "id" on a system with
-supplementary group ids:
+elements. Here is an example from the command
+.BR id (1)
+on a system with supplementary group ids:
.CW
getgroups(32, [100, 0]) = 2
.CE
@@ -489,7 +490,7 @@
which is useful to seeing what files the process is referencing.
Furthermore, using the abbreviation will ensure that you don't
accidentally forget to include a call like
-.B lstat
+.BR lstat (2)
in the list. Betchya woulda forgot that one.
.TP
.BR "\-e\ trace" = %process
@@ -769,8 +770,7 @@
\fB\-e\ inject\fR= expression with default value of
.I errno
option set to
-.IR ENOSYS .
-
+.BR ENOSYS .
.TP
.BR "\-e\ kvm" = vcpu
Print the exit reason of kvm vcpu. Requires Linux kernel version 4.16.0
@@ -794,10 +794,11 @@
.BI "\-b " syscall
If specified syscall is reached, detach from traced process.
Currently, only
-.I execve
+.BR execve (2)
syscall is supported. This option is useful if you want to trace
-multi-threaded process and therefore require -f, but don't want
-to trace its (potentially very complex) children.
+multi-threaded process and therefore require
+.BR \-f ,
+but don't want to trace its (potentially very complex) children.
.TP
.B \-D
Run tracer process as a detached grandchild, not as parent of the
@@ -816,16 +817,20 @@
.B \-p
.I PID
.B \-f
-will attach all threads of process PID if it is multi-threaded,
-not only thread with thread_id = PID.
+will attach all threads of process
+.I PID
+if it is multi-threaded, not only thread with
+.IR thread_id " = " PID .
.TP
.B \-ff
If the
.B \-o
.I filename
option is in effect, each processes trace is written to
-.I filename.pid
-where pid is the numeric process id of each process.
+.IR filename . pid
+where
+.I pid
+is the numeric process id of each process.
This is incompatible with
.BR \-c ,
since no per-process counts are kept.
@@ -835,11 +840,30 @@
to obtain a combined strace log view.
.TP
.BI "\-I " interruptible
-When strace can be interrupted by signals (such as pressing ^C).
-1: no signals are blocked; 2: fatal signals are blocked while decoding syscall
-(default); 3: fatal signals are always blocked (default if '-o FILE PROG');
-4: fatal signals and SIGTSTP (^Z) are always blocked (useful to make
-strace -o FILE PROG not stop on ^Z).
+When
+.B strace
+can be interrupted by signals (such as pressing
+.BR ^C ).
+.RS
+.TP 4
+.B 1
+no signals are blocked;
+.TQ
+.B 2
+fatal signals are blocked while decoding syscall (default);
+.TQ
+.B 3
+fatal signals are always blocked (default if
+.BR -o " " \fIFILE\fR " " \fIPROG\fR );
+.TQ
+.B 4
+fatal signals and
+.BR SIGTSTP " (" ^Z )
+are always blocked (useful to make
+.BI "strace -o " "FILE PROG"
+not stop on
+.BR ^Z ).
+.RE
.SS Startup
.TP 12
\fB\-E\ \fIvar\fR=\,\fIval\fR
@@ -920,7 +944,8 @@
.B strace
can be used as a wrapper process transparent to the invoking parent process.
Note that parent-child relationship (signal stop notifications,
-getppid() value, etc) between traced process and its parent are not preserved
+.BR getppid (2)
+value, etc) between traced process and its parent are not preserved
unless
.B \-D
is used.
@@ -987,8 +1012,11 @@
definitions during the build time.
Please refer to the output of the
.B strace \-V
-command in order to figure out what support is available in your strace build
-("non-native" refers to an ABI that differs from the ABI strace has):
+command in order to figure out what support is available in your
+.B strace
+build ("non-native" refers to an ABI that differs from the ABI
+.B strace
+has):
.TP 15
.B m32-mpers
.B strace
@@ -1057,17 +1085,22 @@
.LP
On x32, syscalls that are intended to be used by 64-bit processes and not x32
ones (for example,
-.BR readv ,
+.BR readv (2),
that has syscall number 19 on x86_64, with its x32 counterpart has syscall
number 515), but called with
.B __X32_SYSCALL_BIT
-flag being set, are designated with "#64" suffix.
+flag being set, are designated with
+.B "#64"
+suffix.
.LP
On some platforms a process that is attached to with the
.B \-p
-option may observe a spurious EINTR return from the current
-system call that is not restartable. (Ideally, all system calls
-should be restarted on strace attach, making the attach invisible
+option may observe a spurious
+.B EINTR
+return from the current system call that is not restartable.
+(Ideally, all system calls should be restarted on
+.B strace
+attach, making the attach invisible
to the traced process, but a few system calls aren't.
Arguably, every instance of such behavior is a kernel bug.)
This may have an unpredictable effect on the process

View File

@ -0,0 +1,110 @@
From be720dc56adad1ecac99476cc302fec1d1ba8ee8 Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Tue, 4 Sep 2018 20:30:30 +0200
Subject: [PATCH 12/27] strace.1.in: consistently use CTRL-combinations
Additional changes:
Updated auto-generated strace.1
---
strace.1.in | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
Index: strace-4.24/strace.1.in
===================================================================
--- strace-4.24.orig/strace.1.in 2019-03-10 05:12:00.665873244 +0100
+++ strace-4.24/strace.1.in 2019-03-10 05:17:19.205683488 +0100
@@ -843,7 +843,7 @@
When
.B strace
can be interrupted by signals (such as pressing
-.BR ^C ).
+.BR CTRL\-C ).
.RS
.TP 4
.B 1
@@ -858,11 +858,11 @@
.TQ
.B 4
fatal signals and
-.BR SIGTSTP " (" ^Z )
+.BR SIGTSTP " (" CTRL\-Z )
are always blocked (useful to make
.BI "strace -o " "FILE PROG"
not stop on
-.BR ^Z ).
+.BR CTRL\-Z ).
.RE
.SS Startup
.TP 12
@@ -883,8 +883,8 @@
.I pid
and begin tracing.
The trace may be terminated
-at any time by a keyboard interrupt signal (\c
-.SM CTRL\s0-C).
+at any time by a keyboard interrupt signal
+.RB ( CTRL\-C ).
.B strace
will respond by detaching itself from the traced process(es)
leaving it (them) to continue running.
@@ -1129,8 +1129,8 @@
.LP
Traced processes which are descended from
.I command
-may be left running after an interrupt signal (\c
-.SM CTRL\s0-C).
+may be left running after an interrupt signal
+.RB ( CTRL\-C ).
.SH HISTORY
The original
.B strace
Index: strace-4.24/strace.1
===================================================================
--- strace-4.24.orig/strace.1 2019-03-10 05:18:07.824196638 +0100
+++ strace-4.24/strace.1 2019-03-10 05:18:36.534909138 +0100
@@ -843,7 +843,7 @@
When
.B strace
can be interrupted by signals (such as pressing
-.BR ^C ).
+.BR CTRL\-C ).
.RS
.TP 4
.B 1
@@ -858,11 +858,11 @@
.TQ
.B 4
fatal signals and
-.BR SIGTSTP " (" ^Z )
+.BR SIGTSTP " (" CTRL\-Z )
are always blocked (useful to make
.BI "strace -o " "FILE PROG"
not stop on
-.BR ^Z ).
+.BR CTRL\-Z ).
.RE
.SS Startup
.TP 12
@@ -883,8 +883,8 @@
.I pid
and begin tracing.
The trace may be terminated
-at any time by a keyboard interrupt signal (\c
-.SM CTRL\s0-C).
+at any time by a keyboard interrupt signal
+.RB ( CTRL\-C ).
.B strace
will respond by detaching itself from the traced process(es)
leaving it (them) to continue running.
@@ -1129,8 +1129,8 @@
.LP
Traced processes which are descended from
.I command
-may be left running after an interrupt signal (\c
-.SM CTRL\s0-C).
+may be left running after an interrupt signal
+.RB ( CTRL\-C ).
.SH HISTORY
The original
.B strace

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,216 @@
From 14e5342e996ff122875a2306ba8d84dac096a48a Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Thu, 3 Jan 2019 23:36:22 +0000
Subject: [PATCH 15/27] tests: use tail_alloc instead of calloc in
bpf-obj_get_info_by_fd-prog*
This guarantees that map_info and prog_info objects are not accessed
out of bounds.
* tests/bpf-obj_get_info_by_fd.c: Include <string.h>.
(main): Use tail_alloc instead of calloc for map_info and prog_info.
Conflicts:
tests/bpf-obj_get_info_by_fd.c
Additional changes:
tests-m32/bpf-obj_get_info_by_fd.c (copy of tests/bpf-obj_get_info_by_fd.c)
tests-mx32/bpf-obj_get_info_by_fd.c (copy of tests/bpf-obj_get_info_by_fd.c)
---
tests/bpf-obj_get_info_by_fd.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
Index: strace-4.24/tests/bpf-obj_get_info_by_fd.c
===================================================================
--- strace-4.24.orig/tests/bpf-obj_get_info_by_fd.c 2019-03-10 05:19:26.164412164 +0100
+++ strace-4.24/tests/bpf-obj_get_info_by_fd.c 2019-03-10 05:35:03.618024803 +0100
@@ -18,6 +18,7 @@
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
+#include <string.h>
#include <unistd.h>
#include <sys/sysmacros.h>
#include <asm/unistd.h>
@@ -274,13 +275,14 @@
* initializer element is not constant.
*/
#define MAP_INFO_SZ (sizeof(*map_info) + 64)
- struct bpf_map_info_struct *map_info = calloc(1, MAP_INFO_SZ);
+ struct bpf_map_info_struct *map_info = tail_alloc(MAP_INFO_SZ);
struct BPF_OBJ_GET_INFO_BY_FD_struct bpf_map_get_info_attr = {
.bpf_fd = map_fd,
.info_len = MAP_INFO_SZ,
.info = (uintptr_t) map_info,
};
+ memset(map_info, 0, MAP_INFO_SZ);
int ret = sys_bpf(BPF_OBJ_GET_INFO_BY_FD, &bpf_map_get_info_attr,
sizeof(bpf_map_get_info_attr));
if (ret < 0)
@@ -330,7 +332,7 @@
* initializer element is not constant.
*/
#define PROG_INFO_SZ (sizeof(*prog_info) + 64)
- struct bpf_prog_info_struct *prog_info = calloc(1, PROG_INFO_SZ);
+ struct bpf_prog_info_struct *prog_info = tail_alloc(PROG_INFO_SZ);
struct bpf_insn *xlated_prog = tail_alloc(sizeof(*xlated_prog) * 42);
uint32_t *map_ids = tail_alloc(sizeof(*map_ids) * 2);
struct BPF_OBJ_GET_INFO_BY_FD_struct bpf_prog_get_info_attr = {
@@ -340,6 +342,7 @@
};
size_t old_prog_info_len = PROG_INFO_SZ;
+ memset(prog_info, 0, PROG_INFO_SZ);
for (unsigned int i = 0; i < 4; i++) {
prog_info->jited_prog_len = 0;
switch (i) {
Index: strace-4.24/tests-m32/bpf-obj_get_info_by_fd.c
===================================================================
--- strace-4.24.orig/tests-m32/bpf-obj_get_info_by_fd.c 2018-06-04 03:11:05.000000000 +0200
+++ strace-4.24/tests-m32/bpf-obj_get_info_by_fd.c 2019-03-10 05:35:43.934621086 +0100
@@ -4,27 +4,7 @@
* Copyright (c) 2018 The strace developers.
* All rights reserved.
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "tests.h"
@@ -38,6 +18,7 @@
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
+#include <string.h>
#include <unistd.h>
#include <sys/sysmacros.h>
#include <asm/unistd.h>
@@ -294,13 +275,14 @@
* initializer element is not constant.
*/
#define MAP_INFO_SZ (sizeof(*map_info) + 64)
- struct bpf_map_info_struct *map_info = calloc(1, MAP_INFO_SZ);
+ struct bpf_map_info_struct *map_info = tail_alloc(MAP_INFO_SZ);
struct BPF_OBJ_GET_INFO_BY_FD_struct bpf_map_get_info_attr = {
.bpf_fd = map_fd,
.info_len = MAP_INFO_SZ,
.info = (uintptr_t) map_info,
};
+ memset(map_info, 0, MAP_INFO_SZ);
int ret = sys_bpf(BPF_OBJ_GET_INFO_BY_FD, &bpf_map_get_info_attr,
sizeof(bpf_map_get_info_attr));
if (ret < 0)
@@ -350,7 +332,7 @@
* initializer element is not constant.
*/
#define PROG_INFO_SZ (sizeof(*prog_info) + 64)
- struct bpf_prog_info_struct *prog_info = calloc(1, PROG_INFO_SZ);
+ struct bpf_prog_info_struct *prog_info = tail_alloc(PROG_INFO_SZ);
struct bpf_insn *xlated_prog = tail_alloc(sizeof(*xlated_prog) * 42);
uint32_t *map_ids = tail_alloc(sizeof(*map_ids) * 2);
struct BPF_OBJ_GET_INFO_BY_FD_struct bpf_prog_get_info_attr = {
@@ -360,6 +342,7 @@
};
size_t old_prog_info_len = PROG_INFO_SZ;
+ memset(prog_info, 0, PROG_INFO_SZ);
for (unsigned int i = 0; i < 4; i++) {
prog_info->jited_prog_len = 0;
switch (i) {
Index: strace-4.24/tests-mx32/bpf-obj_get_info_by_fd.c
===================================================================
--- strace-4.24.orig/tests-mx32/bpf-obj_get_info_by_fd.c 2018-06-04 03:11:05.000000000 +0200
+++ strace-4.24/tests-mx32/bpf-obj_get_info_by_fd.c 2019-03-10 05:35:48.837571989 +0100
@@ -4,27 +4,7 @@
* Copyright (c) 2018 The strace developers.
* All rights reserved.
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "tests.h"
@@ -38,6 +18,7 @@
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
+#include <string.h>
#include <unistd.h>
#include <sys/sysmacros.h>
#include <asm/unistd.h>
@@ -294,13 +275,14 @@
* initializer element is not constant.
*/
#define MAP_INFO_SZ (sizeof(*map_info) + 64)
- struct bpf_map_info_struct *map_info = calloc(1, MAP_INFO_SZ);
+ struct bpf_map_info_struct *map_info = tail_alloc(MAP_INFO_SZ);
struct BPF_OBJ_GET_INFO_BY_FD_struct bpf_map_get_info_attr = {
.bpf_fd = map_fd,
.info_len = MAP_INFO_SZ,
.info = (uintptr_t) map_info,
};
+ memset(map_info, 0, MAP_INFO_SZ);
int ret = sys_bpf(BPF_OBJ_GET_INFO_BY_FD, &bpf_map_get_info_attr,
sizeof(bpf_map_get_info_attr));
if (ret < 0)
@@ -350,7 +332,7 @@
* initializer element is not constant.
*/
#define PROG_INFO_SZ (sizeof(*prog_info) + 64)
- struct bpf_prog_info_struct *prog_info = calloc(1, PROG_INFO_SZ);
+ struct bpf_prog_info_struct *prog_info = tail_alloc(PROG_INFO_SZ);
struct bpf_insn *xlated_prog = tail_alloc(sizeof(*xlated_prog) * 42);
uint32_t *map_ids = tail_alloc(sizeof(*map_ids) * 2);
struct BPF_OBJ_GET_INFO_BY_FD_struct bpf_prog_get_info_attr = {
@@ -360,6 +342,7 @@
};
size_t old_prog_info_len = PROG_INFO_SZ;
+ memset(prog_info, 0, PROG_INFO_SZ);
for (unsigned int i = 0; i < 4; i++) {
prog_info->jited_prog_len = 0;
switch (i) {

View File

@ -0,0 +1,61 @@
From 755e4a0da3035c128d18c9a8f7d2f61f29715323 Mon Sep 17 00:00:00 2001
From: Martin Lau <kafai@fb.com>
Date: Thu, 3 Jan 2019 23:36:22 +0000
Subject: [PATCH 16/27] tests: fix prog_info initialization in
bpf-obj_get_info_by_fd-prog*
The sys_bpf(BPF_OBJ_GET_INFO_BY_FD, &bpf_prog_get_info_attr, ...) is
called in a loop. The bpf_prog_get_info_attr.info object is in size 104
but bpf_prog_get_info_attr.info_len is in size 168. Hence, if the prog
is jited, the second iteration onwards will have nr_jited_ksyms == 1
which is asking the kernel to fill the
bpf_prog_get_info_attr.info.jited_ksyms and it is NULL.
* tests/bpf-obj_get_info_by_fd.c (main): Clear memory beyond prog_info
at the start of every iteration.
Additional changes:
tests-m32/bpf-obj_get_info_by_fd.c (copy of tests/bpf-obj_get_info_by_fd.c)
tests-mx32/bpf-obj_get_info_by_fd.c (copy of tests/bpf-obj_get_info_by_fd.c)
Co-Authored-by: Dmitry V. Levin <ldv@altlinux.org>
---
tests/bpf-obj_get_info_by_fd.c | 1 +
1 file changed, 1 insertion(+)
Index: strace-4.24/tests/bpf-obj_get_info_by_fd.c
===================================================================
--- strace-4.24.orig/tests/bpf-obj_get_info_by_fd.c 2019-03-10 05:38:07.889179571 +0100
+++ strace-4.24/tests/bpf-obj_get_info_by_fd.c 2019-03-10 05:38:16.038097970 +0100
@@ -345,6 +345,7 @@
memset(prog_info, 0, PROG_INFO_SZ);
for (unsigned int i = 0; i < 4; i++) {
prog_info->jited_prog_len = 0;
+ memset(prog_info + 1, 0, PROG_INFO_SZ - sizeof(*prog_info));
switch (i) {
case 1:
prog_info->xlated_prog_insns =
Index: strace-4.24/tests-m32/bpf-obj_get_info_by_fd.c
===================================================================
--- strace-4.24.orig/tests-m32/bpf-obj_get_info_by_fd.c 2019-03-10 05:35:43.934621086 +0100
+++ strace-4.24/tests-m32/bpf-obj_get_info_by_fd.c 2019-03-10 05:38:32.161936511 +0100
@@ -345,6 +345,7 @@
memset(prog_info, 0, PROG_INFO_SZ);
for (unsigned int i = 0; i < 4; i++) {
prog_info->jited_prog_len = 0;
+ memset(prog_info + 1, 0, PROG_INFO_SZ - sizeof(*prog_info));
switch (i) {
case 1:
prog_info->xlated_prog_insns =
Index: strace-4.24/tests-mx32/bpf-obj_get_info_by_fd.c
===================================================================
--- strace-4.24.orig/tests-mx32/bpf-obj_get_info_by_fd.c 2019-03-10 05:38:12.854129853 +0100
+++ strace-4.24/tests-mx32/bpf-obj_get_info_by_fd.c 2019-03-10 05:38:29.561962546 +0100
@@ -345,6 +345,7 @@
memset(prog_info, 0, PROG_INFO_SZ);
for (unsigned int i = 0; i < 4; i++) {
prog_info->jited_prog_len = 0;
+ memset(prog_info + 1, 0, PROG_INFO_SZ - sizeof(*prog_info));
switch (i) {
case 1:
prog_info->xlated_prog_insns =

View File

@ -0,0 +1,211 @@
From 8967985c6fedf1b0545f81d48c5c232718eb47d2 Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Tue, 29 Jan 2019 13:54:23 +0100
Subject: [PATCH 17/27] Merge "<... resumed>" printing
Apparently, it was slightly different with no apparent reason.
Use a single routine to print this message now.
* defs.h (print_syscall_resume): New function declaration.
* strace.c (print_event_exit): Replace open-coding of "<... resumed>"
message printing with a print_syscall_resume() call.
* syscall.c (syscall_exiting_trace): Likewise.
(print_syscall_resume): New function.
* tests/threads-execve.c: Update expected output.
Additional changes:
tests-m32/threads-execve.c (copy of tests/threads-execve.c)
tests-mx32/threads-execve.c (copy of tests/threads-execve.c)
---
defs.h | 2 ++
strace.c | 7 +------
syscall.c | 35 +++++++++++++++++++++--------------
tests/threads-execve.c | 2 +-
4 files changed, 25 insertions(+), 21 deletions(-)
Index: strace-4.24/defs.h
===================================================================
--- strace-4.24.orig/defs.h 2019-03-10 05:34:58.570075352 +0100
+++ strace-4.24/defs.h 2019-03-10 05:39:18.611471380 +0100
@@ -408,6 +408,8 @@
extern void set_overhead(int);
extern void print_pc(struct tcb *);
+extern void print_syscall_resume(struct tcb *tcp);
+
extern int syscall_entering_decode(struct tcb *);
extern int syscall_entering_trace(struct tcb *, unsigned int *);
extern void syscall_entering_finish(struct tcb *, int);
Index: strace-4.24/strace.c
===================================================================
--- strace-4.24.orig/strace.c 2019-03-10 05:34:58.570075352 +0100
+++ strace-4.24/strace.c 2019-03-10 05:39:18.612471370 +0100
@@ -2191,12 +2191,7 @@
set_current_tcp(tcp);
}
- if ((followfork < 2 && printing_tcp != tcp)
- || (tcp->flags & TCB_REPRINT)) {
- tcp->flags &= ~TCB_REPRINT;
- printleader(tcp);
- tprintf("<... %s resumed>", tcp->s_ent->sys_name);
- }
+ print_syscall_resume(tcp);
if (!(tcp->sys_func_rval & RVAL_DECODED)) {
/*
Index: strace-4.24/syscall.c
===================================================================
--- strace-4.24.orig/syscall.c 2019-03-10 05:34:58.570075352 +0100
+++ strace-4.24/syscall.c 2019-03-10 05:39:18.613471360 +0100
@@ -722,19 +722,9 @@
return get_syscall_result(tcp);
}
-int
-syscall_exiting_trace(struct tcb *tcp, struct timespec *ts, int res)
+void
+print_syscall_resume(struct tcb *tcp)
{
- if (syscall_tampered(tcp) || inject_delay_exit(tcp))
- tamper_with_syscall_exiting(tcp);
-
- if (cflag) {
- count_syscall(tcp, ts);
- if (cflag == CFLAG_ONLY_STATS) {
- return 0;
- }
- }
-
/* If not in -ff mode, and printing_tcp != tcp,
* then the log currently does not end with output
* of _our syscall entry_, but with something else.
@@ -744,11 +734,28 @@
* "strace -ff -oLOG test/threaded_execve" corner case.
* It's the only case when -ff mode needs reprinting.
*/
- if ((followfork < 2 && printing_tcp != tcp) || (tcp->flags & TCB_REPRINT)) {
+ if ((followfork < 2 && printing_tcp != tcp)
+ || (tcp->flags & TCB_REPRINT)) {
tcp->flags &= ~TCB_REPRINT;
printleader(tcp);
- tprintf("<... %s resumed> ", tcp->s_ent->sys_name);
+ tprintf("<... %s resumed>", tcp->s_ent->sys_name);
}
+}
+
+int
+syscall_exiting_trace(struct tcb *tcp, struct timespec *ts, int res)
+{
+ if (syscall_tampered(tcp) || inject_delay_exit(tcp))
+ tamper_with_syscall_exiting(tcp);
+
+ if (cflag) {
+ count_syscall(tcp, ts);
+ if (cflag == CFLAG_ONLY_STATS) {
+ return 0;
+ }
+ }
+
+ print_syscall_resume(tcp);
printing_tcp = tcp;
tcp->s_prev_ent = NULL;
Index: strace-4.24/tests/threads-execve.c
===================================================================
--- strace-4.24.orig/tests/threads-execve.c 2019-03-10 05:34:58.570075352 +0100
+++ strace-4.24/tests/threads-execve.c 2019-03-10 05:39:18.613471360 +0100
@@ -141,7 +141,7 @@
}
printf("%-5d +++ superseded by execve in pid %u +++\n"
- "%-5d <... execve resumed> ) = 0\n",
+ "%-5d <... execve resumed>) = 0\n",
leader, tid,
leader);
Index: strace-4.24/tests-m32/threads-execve.c
===================================================================
--- strace-4.24.orig/tests-m32/threads-execve.c 2017-05-22 19:33:51.000000000 +0200
+++ strace-4.24/tests-m32/threads-execve.c 2019-03-10 05:39:41.348243702 +0100
@@ -5,27 +5,7 @@
* Copyright (c) 2016-2017 The strace developers.
* All rights reserved.
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "tests.h"
@@ -161,7 +141,7 @@
}
printf("%-5d +++ superseded by execve in pid %u +++\n"
- "%-5d <... execve resumed> ) = 0\n",
+ "%-5d <... execve resumed>) = 0\n",
leader, tid,
leader);
Index: strace-4.24/tests-mx32/threads-execve.c
===================================================================
--- strace-4.24.orig/tests-mx32/threads-execve.c 2017-05-22 19:33:51.000000000 +0200
+++ strace-4.24/tests-mx32/threads-execve.c 2019-03-10 05:39:43.817218978 +0100
@@ -5,27 +5,7 @@
* Copyright (c) 2016-2017 The strace developers.
* All rights reserved.
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "tests.h"
@@ -161,7 +141,7 @@
}
printf("%-5d +++ superseded by execve in pid %u +++\n"
- "%-5d <... execve resumed> ) = 0\n",
+ "%-5d <... execve resumed>) = 0\n",
leader, tid,
leader);

View File

@ -0,0 +1,513 @@
From 25e40facc12017de2c4df5792f6a0a3f7db39896 Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Tue, 29 Jan 2019 14:40:11 +0100
Subject: [PATCH 18/27] Use accessors for tcp->s_ent, return a stub struct if
it is NULL
Since code paths are non-trivial, it's an attempt to future-proof
and prevent improper access of tcp->s_ent fields.
* defs.h (struct tcb): Update the description of s_ent field.
(stub_sysent): New declaration.
(tcp_sysent, n_args): New macro functions.
(indirect_ipccall): Use tcp_sysent() instead of tcp->s_ent.
* ipc.c (SYS_FUNC(ipc)): Use n_args() instead of tcp->s_ent->nargs.
* linux/alpha/get_syscall_args.c (get_syscall_args): Likewise.
* linux/bfin/get_syscall_args.c (get_syscall_args): Likewise.
* linux/hppa/get_syscall_args.c (get_syscall_args): Likewise.
* linux/ia64/get_syscall_args.c (get_syscall_args): Likewise.
* linux/microblaze/get_syscall_args.c (get_syscall_args): Likewise.
* linux/mips/get_syscall_args.c (get_syscall_args): Likewise.
* linux/sh/get_syscall_args.c (get_syscall_args): Likewise.
* linux/sh64/get_syscall_args.c (get_syscall_args): Likewise.
* linux/x86_64/get_syscall_args.c (get_syscall_args): Likewise.
* linux/xtensa/get_syscall_args.c (get_syscall_args): Likewise.
* prctl.c (print_prctl_args): Likewise.
* signal.c (SYS_FUNC(sgetmask)): Likewise.
* util.c (printargs, printargs_u, printargs_d): Likewise.
* syscall.c (decode_ipc_subcall, decode_syscall_subcall: Likewise.
(dumpio, tamper_with_syscall_exiting, syscall_entering_decode,
syscall_entering_decode, syscall_entering_trace, syscall_entering_trace,
syscall_exiting_decode, print_syscall_resume, syscall_exiting_trace,
get_syscall_result): Use tcp_sysent() instead of tcp->s_ent.
(stub_sysent): New stub sysent.
(get_scno): Reset scno, s_ent, qual_flg; initialise s->ent from
stub_sysent.
* pathtrace.c (pathtrace_match_set): Use tcp_sysent() instead of
tcp->s_ent.
Co-Authored-by: Dmitry V. Levin <ldv@altlinux.org>
Conflicts:
defs.h
linux/mips/get_syscall_args.c
syscall.c
---
defs.h | 10 ++++++--
ipc.c | 2 +-
linux/alpha/get_syscall_args.c | 2 +-
linux/bfin/get_syscall_args.c | 2 +-
linux/hppa/get_syscall_args.c | 2 +-
linux/ia64/get_syscall_args.c | 2 +-
linux/microblaze/get_syscall_args.c | 2 +-
linux/mips/get_syscall_args.c | 6 ++---
linux/sh/get_syscall_args.c | 2 +-
linux/sh64/get_syscall_args.c | 2 +-
linux/x86_64/get_syscall_args.c | 2 +-
linux/xtensa/get_syscall_args.c | 2 +-
pathtrace.c | 2 +-
prctl.c | 2 +-
signal.c | 4 +--
syscall.c | 49 +++++++++++++++++++++----------------
util.c | 6 ++---
17 files changed, 56 insertions(+), 43 deletions(-)
diff --git a/defs.h b/defs.h
index c7274c8..811bb0d 100644
--- a/defs.h
+++ b/defs.h
@@ -206,7 +206,9 @@ struct tcb {
const char *auxstr; /* Auxiliary info from syscall (see RVAL_STR) */
void *_priv_data; /* Private data for syscall decoding functions */
void (*_free_priv_data)(void *); /* Callback for freeing priv_data */
- const struct_sysent *s_ent; /* sysent[scno] or dummy struct for bad scno */
+ const struct_sysent *s_ent; /* sysent[scno] or a stub struct for bad
+ * scno. Use tcp_sysent() macro for access.
+ */
const struct_sysent *s_prev_ent; /* for "resuming interrupted SYSCALL" msg */
struct inject_opts *inject_vec[SUPPORTED_PERSONALITIES];
struct timespec stime; /* System time usage as of last process wait */
@@ -283,6 +285,10 @@ struct tcb {
#define syscall_delayed(tcp) ((tcp)->flags & TCB_DELAYED)
#define syscall_tampered_nofail(tcp) ((tcp)->flags & TCB_TAMPERED_NO_FAIL)
+extern const struct_sysent stub_sysent;
+#define tcp_sysent(tcp) (tcp->s_ent ?: &stub_sysent)
+#define n_args(tcp) (tcp_sysent(tcp)->nargs)
+
#include "xlat.h"
extern const struct xlat addrfams[];
@@ -352,7 +358,7 @@ extern const struct xlat whence_codes[];
#define IOCTL_NUMBER_HANDLED 1
#define IOCTL_NUMBER_STOP_LOOKUP 010
-#define indirect_ipccall(tcp) (tcp->s_ent->sys_flags & TRACE_INDIRECT_SUBCALL)
+#define indirect_ipccall(tcp) (tcp_sysent(tcp)->sys_flags & TRACE_INDIRECT_SUBCALL)
enum sock_proto {
SOCK_PROTO_UNKNOWN,
diff --git a/ipc.c b/ipc.c
index c35509b..b2b3aa4 100644
--- a/ipc.c
+++ b/ipc.c
@@ -21,7 +21,7 @@ SYS_FUNC(ipc)
printxval_u(ipccalls, call, NULL);
unsigned int i;
- for (i = 1; i < tcp->s_ent->nargs; ++i)
+ for (i = 1; i < n_args(tcp); ++i)
tprintf(", %#" PRI_klx, tcp->u_arg[i]);
return RVAL_DECODED;
diff --git a/linux/alpha/get_syscall_args.c b/linux/alpha/get_syscall_args.c
index be61abf..c28eb62 100644
--- a/linux/alpha/get_syscall_args.c
+++ b/linux/alpha/get_syscall_args.c
@@ -4,7 +4,7 @@ get_syscall_args(struct tcb *tcp)
{
unsigned int i;
- for (i = 0; i < tcp->s_ent->nargs; ++i)
+ for (i = 0; i < n_args(tcp); ++i)
if (upeek(tcp, REG_A0+i, &tcp->u_arg[i]) < 0)
return -1;
return 1;
diff --git a/linux/bfin/get_syscall_args.c b/linux/bfin/get_syscall_args.c
index 506d3a9..bebaf03 100644
--- a/linux/bfin/get_syscall_args.c
+++ b/linux/bfin/get_syscall_args.c
@@ -7,7 +7,7 @@ get_syscall_args(struct tcb *tcp)
};
unsigned int i;
- for (i = 0; i < tcp->s_ent->nargs; ++i)
+ for (i = 0; i < n_args(tcp); ++i)
if (upeek(tcp, argreg[i], &tcp->u_arg[i]) < 0)
return -1;
return 1;
diff --git a/linux/hppa/get_syscall_args.c b/linux/hppa/get_syscall_args.c
index aa938f5..70f2a24 100644
--- a/linux/hppa/get_syscall_args.c
+++ b/linux/hppa/get_syscall_args.c
@@ -4,7 +4,7 @@ get_syscall_args(struct tcb *tcp)
{
unsigned int i;
- for (i = 0; i < tcp->s_ent->nargs; ++i)
+ for (i = 0; i < n_args(tcp); ++i)
if (upeek(tcp, PT_GR26-4*i, &tcp->u_arg[i]) < 0)
return -1;
return 1;
diff --git a/linux/ia64/get_syscall_args.c b/linux/ia64/get_syscall_args.c
index ad73c54..eeeb59c 100644
--- a/linux/ia64/get_syscall_args.c
+++ b/linux/ia64/get_syscall_args.c
@@ -11,7 +11,7 @@ get_syscall_args(struct tcb *tcp)
unsigned long *out0 = ia64_rse_skip_regs(rbs_end, -sof + sol);
unsigned int i;
- for (i = 0; i < tcp->s_ent->nargs; ++i) {
+ for (i = 0; i < n_args(tcp); ++i) {
if (umove(tcp,
(unsigned long) ia64_rse_skip_regs(out0, i),
&tcp->u_arg[i]) < 0) {
diff --git a/linux/microblaze/get_syscall_args.c b/linux/microblaze/get_syscall_args.c
index 1a3a48f..0e249e3 100644
--- a/linux/microblaze/get_syscall_args.c
+++ b/linux/microblaze/get_syscall_args.c
@@ -4,7 +4,7 @@ get_syscall_args(struct tcb *tcp)
{
unsigned int i;
- for (i = 0; i < tcp->s_ent->nargs; ++i)
+ for (i = 0; i < n_args(tcp); ++i)
if (upeek(tcp, (5 + i) * 4, &tcp->u_arg[i]) < 0)
return -1;
return 1;
diff --git a/linux/mips/get_syscall_args.c b/linux/mips/get_syscall_args.c
index 3c9160e..0ff5136 100644
--- a/linux/mips/get_syscall_args.c
+++ b/linux/mips/get_syscall_args.c
@@ -14,16 +14,16 @@ get_syscall_args(struct tcb *tcp)
tcp->u_arg[1] = mips_REG_A1;
tcp->u_arg[2] = mips_REG_A2;
tcp->u_arg[3] = mips_REG_A3;
- if (tcp->s_ent->nargs > 4
+ if (n_args(tcp) > 4
&& umoven(tcp, mips_REG_SP + 4 * sizeof(tcp->u_arg[0]),
- (tcp->s_ent->nargs - 4) * sizeof(tcp->u_arg[0]),
+ (n_args(tcp) - 4) * sizeof(tcp->u_arg[0]),
&tcp->u_arg[4]) < 0) {
/*
* Let's proceed with the first 4 arguments
* instead of reporting the failure.
*/
memset(&tcp->u_arg[4], 0,
- (tcp->s_ent->nargs - 4) * sizeof(tcp->u_arg[0]));
+ (n_args(tcp) - 4) * sizeof(tcp->u_arg[0]));
}
#else
# error unsupported mips abi
diff --git a/linux/sh/get_syscall_args.c b/linux/sh/get_syscall_args.c
index b4ee1dd..02593b0 100644
--- a/linux/sh/get_syscall_args.c
+++ b/linux/sh/get_syscall_args.c
@@ -12,7 +12,7 @@ get_syscall_args(struct tcb *tcp)
};
unsigned int i;
- for (i = 0; i < tcp->s_ent->nargs; ++i)
+ for (i = 0; i < n_args(tcp); ++i)
if (upeek(tcp, syscall_regs[i], &tcp->u_arg[i]) < 0)
return -1;
return 1;
diff --git a/linux/sh64/get_syscall_args.c b/linux/sh64/get_syscall_args.c
index e35c350..241ff09 100644
--- a/linux/sh64/get_syscall_args.c
+++ b/linux/sh64/get_syscall_args.c
@@ -6,7 +6,7 @@ get_syscall_args(struct tcb *tcp)
static const int syscall_regs[MAX_ARGS] = { 2, 3, 4, 5, 6, 7 };
unsigned int i;
- for (i = 0; i < tcp->s_ent->nargs; ++i)
+ for (i = 0; i < n_args(tcp); ++i)
if (upeek(tcp, REG_GENERAL(syscall_regs[i]),
&tcp->u_arg[i]) < 0)
return -1;
diff --git a/linux/x86_64/get_syscall_args.c b/linux/x86_64/get_syscall_args.c
index f285ac3..8ee8ebd 100644
--- a/linux/x86_64/get_syscall_args.c
+++ b/linux/x86_64/get_syscall_args.c
@@ -4,7 +4,7 @@ get_syscall_args(struct tcb *tcp)
{
if (x86_io.iov_len != sizeof(i386_regs)) {
/* x86-64 or x32 ABI */
- if (tcp->s_ent->sys_flags & COMPAT_SYSCALL_TYPES) {
+ if (tcp_sysent(tcp)->sys_flags & COMPAT_SYSCALL_TYPES) {
/*
* X32 compat syscall: zero-extend from 32 bits.
* Use truncate_klong_to_current_wordsize(tcp->u_arg[N])
diff --git a/linux/xtensa/get_syscall_args.c b/linux/xtensa/get_syscall_args.c
index 2a20cdb..6903221 100644
--- a/linux/xtensa/get_syscall_args.c
+++ b/linux/xtensa/get_syscall_args.c
@@ -13,7 +13,7 @@ get_syscall_args(struct tcb *tcp)
};
unsigned int i;
- for (i = 0; i < tcp->s_ent->nargs; ++i)
+ for (i = 0; i < n_args(tcp); ++i)
if (upeek(tcp, xtensaregs[i], &tcp->u_arg[i]) < 0)
return -1;
return 1;
diff --git a/pathtrace.c b/pathtrace.c
index 2cd12e6..5493028 100644
--- a/pathtrace.c
+++ b/pathtrace.c
@@ -167,7 +167,7 @@ pathtrace_match_set(struct tcb *tcp, struct path_set *set)
{
const struct_sysent *s;
- s = tcp->s_ent;
+ s = tcp_sysent(tcp);
if (!(s->sys_flags & (TRACE_FILE | TRACE_DESC | TRACE_NETWORK)))
return false;
diff --git a/prctl.c b/prctl.c
index 5830f11..c31ea60 100644
--- a/prctl.c
+++ b/prctl.c
@@ -61,7 +61,7 @@ print_prctl_args(struct tcb *tcp, const unsigned int first)
{
unsigned int i;
- for (i = first; i < tcp->s_ent->nargs; ++i)
+ for (i = first; i < n_args(tcp); ++i)
tprintf(", %#" PRI_klx, tcp->u_arg[i]);
}
diff --git a/signal.c b/signal.c
index 17a3f79..e59a76d 100644
--- a/signal.c
+++ b/signal.c
@@ -383,10 +383,10 @@ SYS_FUNC(sgetmask)
SYS_FUNC(sigsuspend)
{
#ifdef MIPS
- print_sigset_addr_len(tcp, tcp->u_arg[tcp->s_ent->nargs - 1],
+ print_sigset_addr_len(tcp, tcp->u_arg[n_args(tcp) - 1],
current_wordsize);
#else
- tprint_old_sigmask_val("", tcp->u_arg[tcp->s_ent->nargs - 1]);
+ tprint_old_sigmask_val("", tcp->u_arg[n_args(tcp) - 1]);
#endif
return RVAL_DECODED;
diff --git a/syscall.c b/syscall.c
index 33f6dcd..40fcedb 100644
--- a/syscall.c
+++ b/syscall.c
@@ -339,7 +339,7 @@ decode_ipc_subcall(struct tcb *tcp)
tcp->qual_flg = qual_flags(tcp->scno);
tcp->s_ent = &sysent[tcp->scno];
- const unsigned int n = tcp->s_ent->nargs;
+ const unsigned int n = n_args(tcp);
unsigned int i;
for (i = 0; i < n; i++)
tcp->u_arg[i] = tcp->u_arg[i + 1];
@@ -363,7 +363,7 @@ decode_syscall_subcall(struct tcb *tcp)
* and sync_file_range) requires additional code,
* see linux/mips/get_syscall_args.c
*/
- if (tcp->s_ent->nargs == MAX_ARGS) {
+ if (n_args(tcp) == MAX_ARGS) {
if (umoven(tcp,
mips_REG_SP + MAX_ARGS * sizeof(tcp->u_arg[0]),
sizeof(tcp->u_arg[0]),
@@ -382,7 +382,7 @@ dumpio(struct tcb *tcp)
return;
if (is_number_in_set(fd, write_set)) {
- switch (tcp->s_ent->sen) {
+ switch (tcp_sysent(tcp)->sen) {
case SEN_write:
case SEN_pwrite:
case SEN_send:
@@ -409,7 +409,7 @@ dumpio(struct tcb *tcp)
return;
if (is_number_in_set(fd, read_set)) {
- switch (tcp->s_ent->sen) {
+ switch (tcp_sysent(tcp)->sen) {
case SEN_read:
case SEN_pread:
case SEN_recv:
@@ -573,7 +573,7 @@ tamper_with_syscall_exiting(struct tcb *tcp)
if (update_tcb) {
tcp->u_error = 0;
- get_error(tcp, !(tcp->s_ent->sys_flags & SYSCALL_NEVER_FAILS));
+ get_error(tcp, !(tcp_sysent(tcp)->sys_flags & SYSCALL_NEVER_FAILS));
}
return 0;
@@ -593,10 +593,9 @@ syscall_entering_decode(struct tcb *tcp)
int res = get_scno(tcp);
if (res == 0)
return res;
- int scno_good = res;
if (res != 1 || (res = get_syscall_args(tcp)) != 1) {
printleader(tcp);
- tprintf("%s(", scno_good == 1 ? tcp->s_ent->sys_name : "????");
+ tprintf("%s(", tcp_sysent(tcp)->sys_name);
/*
* " <unavailable>" will be added later by the code which
* detects ptrace errors.
@@ -608,7 +607,7 @@ syscall_entering_decode(struct tcb *tcp)
|| defined SYS_socket_subcall \
|| defined SYS_syscall_subcall
for (;;) {
- switch (tcp->s_ent->sen) {
+ switch (tcp_sysent(tcp)->sen) {
# ifdef SYS_ipc_subcall
case SEN_ipc:
decode_ipc_subcall(tcp);
@@ -622,7 +621,7 @@ syscall_entering_decode(struct tcb *tcp)
# ifdef SYS_syscall_subcall
case SEN_syscall:
decode_syscall_subcall(tcp);
- if (tcp->s_ent->sen != SEN_syscall)
+ if (tcp_sysent(tcp)->sen != SEN_syscall)
continue;
break;
# endif
@@ -642,7 +641,7 @@ syscall_entering_trace(struct tcb *tcp, unsigned int *sig)
tcp->qual_flg &= ~QUAL_INJECT;
}
- switch (tcp->s_ent->sen) {
+ switch (tcp_sysent(tcp)->sen) {
case SEN_execve:
case SEN_execveat:
#if defined SPARC || defined SPARC64
@@ -672,14 +671,14 @@ syscall_entering_trace(struct tcb *tcp, unsigned int *sig)
#ifdef ENABLE_STACKTRACE
if (stack_trace_enabled) {
- if (tcp->s_ent->sys_flags & STACKTRACE_CAPTURE_ON_ENTER)
+ if (tcp_sysent(tcp)->sys_flags & STACKTRACE_CAPTURE_ON_ENTER)
unwind_tcb_capture(tcp);
}
#endif
printleader(tcp);
- tprintf("%s(", tcp->s_ent->sys_name);
- int res = raw(tcp) ? printargs(tcp) : tcp->s_ent->sys_func(tcp);
+ tprintf("%s(", tcp_sysent(tcp)->sys_name);
+ int res = raw(tcp) ? printargs(tcp) : tcp_sysent(tcp)->sys_func(tcp);
fflush(tcp->outf);
return res;
}
@@ -709,7 +708,7 @@ syscall_exiting_decode(struct tcb *tcp, struct timespec *pts)
if ((Tflag || cflag) && !(filtered(tcp) || hide_log(tcp)))
clock_gettime(CLOCK_MONOTONIC, pts);
- if (tcp->s_ent->sys_flags & MEMORY_MAPPING_CHANGE)
+ if (tcp_sysent(tcp)->sys_flags & MEMORY_MAPPING_CHANGE)
mmap_notify_report(tcp);
if (filtered(tcp) || hide_log(tcp))
@@ -738,7 +737,7 @@ print_syscall_resume(struct tcb *tcp)
|| (tcp->flags & TCB_REPRINT)) {
tcp->flags &= ~TCB_REPRINT;
printleader(tcp);
- tprintf("<... %s resumed>", tcp->s_ent->sys_name);
+ tprintf("<... %s resumed>", tcp_sysent(tcp)->sys_name);
}
}
@@ -786,7 +785,7 @@ syscall_exiting_trace(struct tcb *tcp, struct timespec *ts, int res)
if (tcp->sys_func_rval & RVAL_DECODED)
sys_res = tcp->sys_func_rval;
else
- sys_res = tcp->s_ent->sys_func(tcp);
+ sys_res = tcp_sysent(tcp)->sys_func(tcp);
}
tprints(") ");
@@ -1175,6 +1174,13 @@ free_sysent_buf(void *ptr)
free(ptr);
}
+const struct_sysent stub_sysent = {
+ .nargs = MAX_ARGS,
+ .sen = SEN_printargs,
+ .sys_func = printargs,
+ .sys_name = "????",
+};
+
/*
* Returns:
* 0: "ignore this ptrace stop", syscall_entering_decode() should return a "bail
@@ -1186,6 +1192,10 @@ free_sysent_buf(void *ptr)
int
get_scno(struct tcb *tcp)
{
+ tcp->scno = -1;
+ tcp->s_ent = NULL;
+ tcp->qual_flg = QUAL_RAW | DEFAULT_QUAL_FLAGS;
+
if (get_regs(tcp) < 0)
return -1;
@@ -1202,14 +1212,11 @@ get_scno(struct tcb *tcp)
struct sysent_buf *s = xcalloc(1, sizeof(*s));
s->tcp = tcp;
- s->ent.nargs = MAX_ARGS;
- s->ent.sen = SEN_printargs;
- s->ent.sys_func = printargs;
+ s->ent = stub_sysent;
s->ent.sys_name = s->buf;
xsprintf(s->buf, "syscall_%#" PRI_klx, shuffle_scno(tcp->scno));
tcp->s_ent = &s->ent;
- tcp->qual_flg = QUAL_RAW | DEFAULT_QUAL_FLAGS;
set_tcb_priv_data(tcp, s, free_sysent_buf);
@@ -1246,7 +1253,7 @@ get_syscall_result(struct tcb *tcp)
return -1;
tcp->u_error = 0;
get_error(tcp,
- (!(tcp->s_ent->sys_flags & SYSCALL_NEVER_FAILS)
+ (!(tcp_sysent(tcp)->sys_flags & SYSCALL_NEVER_FAILS)
|| syscall_tampered(tcp))
&& !syscall_tampered_nofail(tcp));
diff --git a/util.c b/util.c
index aefedee..b841c0f 100644
--- a/util.c
+++ b/util.c
@@ -1161,7 +1161,7 @@ print_array_ex(struct tcb *const tcp,
int
printargs(struct tcb *tcp)
{
- const int n = tcp->s_ent->nargs;
+ const int n = n_args(tcp);
int i;
for (i = 0; i < n; ++i)
tprintf("%s%#" PRI_klx, i ? ", " : "", tcp->u_arg[i]);
@@ -1171,7 +1171,7 @@ printargs(struct tcb *tcp)
int
printargs_u(struct tcb *tcp)
{
- const int n = tcp->s_ent->nargs;
+ const int n = n_args(tcp);
int i;
for (i = 0; i < n; ++i)
tprintf("%s%u", i ? ", " : "",
@@ -1182,7 +1182,7 @@ printargs_u(struct tcb *tcp)
int
printargs_d(struct tcb *tcp)
{
- const int n = tcp->s_ent->nargs;
+ const int n = n_args(tcp);
int i;
for (i = 0; i < n; ++i)
tprintf("%s%d", i ? ", " : "",
--
2.1.4

View File

@ -0,0 +1,27 @@
From 6f9c98e28df7cbc1e3417908604550956ca76f21 Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Tue, 29 Jan 2019 15:35:00 +0100
Subject: [PATCH 19/27] syscall.c: set MEMORY_MAPPING_CHANGE in stub sysent
As unknown syscalls may incur unknown side effects.
* syscall.c (stub_sysent): Set sys_flags to MEMORY_MAPPING_CHANGE.
---
syscall.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/syscall.c b/syscall.c
index 40fcedb..b836cd6 100644
--- a/syscall.c
+++ b/syscall.c
@@ -1176,6 +1176,7 @@ free_sysent_buf(void *ptr)
const struct_sysent stub_sysent = {
.nargs = MAX_ARGS,
+ .sys_flags = MEMORY_MAPPING_CHANGE,
.sen = SEN_printargs,
.sys_func = printargs,
.sys_name = "????",
--
2.1.4

View File

@ -0,0 +1,33 @@
From 38a060e855568e2990affd5cd37aeda372f79c33 Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Sun, 10 Feb 2019 19:49:46 +0100
Subject: [PATCH 20/27] Make inline message on failed restart attempt more
verbose
Hopefully, now it is less confusing.
* strace.c (ptrace_restart): Provide intent and pid in the inline error
message.
References: https://bugzilla.redhat.com/show_bug.cgi?id=1662936
---
strace.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/strace.c b/strace.c
index 7fe6548..f2aa846 100644
--- a/strace.c
+++ b/strace.c
@@ -380,7 +380,8 @@ ptrace_restart(const unsigned int op, struct tcb *const tcp, unsigned int sig)
* but before we tried to restart it. Log looks ugly.
*/
if (current_tcp && current_tcp->curcol != 0) {
- tprintf(" <ptrace(%s):%s>\n", msg, strerror(err));
+ tprintf(" <Cannot restart pid %d with ptrace(%s): %s>\n",
+ tcp->pid, msg, strerror(err));
line_ended();
}
if (err == ESRCH)
--
2.1.4

View File

@ -0,0 +1,41 @@
From 179063d63c4e1f49dd863db7ec5d70a3fa2a3713 Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Mon, 11 Feb 2019 00:57:38 +0100
Subject: [PATCH 21/27] ptrace_restart: do not print diagnostics when ptrace
returns ESRCH
After some discussion, it was decided that the situation
when the tracee is gone does not worth reporting.
* strace.c (ptrace_restart): Return early if ptrace returned ESRCH.
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1662936
---
strace.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/strace.c b/strace.c
index f2aa846..0745838 100644
--- a/strace.c
+++ b/strace.c
@@ -353,7 +353,7 @@ ptrace_restart(const unsigned int op, struct tcb *const tcp, unsigned int sig)
errno = 0;
ptrace(op, tcp->pid, 0L, (unsigned long) sig);
err = errno;
- if (!err)
+ if (!err || err == ESRCH)
return 0;
switch (op) {
@@ -384,8 +384,6 @@ ptrace_restart(const unsigned int op, struct tcb *const tcp, unsigned int sig)
tcp->pid, msg, strerror(err));
line_ended();
}
- if (err == ESRCH)
- return 0;
errno = err;
perror_msg("ptrace(PTRACE_%s,pid:%d,sig:%u)", msg, tcp->pid, sig);
return -1;
--
2.1.4

View File

@ -0,0 +1,636 @@
From f5888ee34b2cca8562d2878dbc6b2db9b8256672 Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Fri, 1 Feb 2019 11:04:51 +0100
Subject: [PATCH 22/27] tests: add kill_child test
This tests repeatedly creates and kills children, so some corner
cases in handling of not-quite-existing processes can be observed.
Previously, strace was crashing in the following situation:
13994 ????( <unfinished ...>
...
13994 <... ???? resumed>) = ?
as tcp->s_ent wasn't initialised on syscall entering and
strace.c:print_event_exit segfaulted when tried to access
tcp->s_ent->sys_name.
* tests/kill_child.c: New file.
* tests/kill_child.test: New test.
* tests/.gitignore: Add kill_child.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(MISC_TESTS): Add kill_child.test.
Skipped files (not present in dist tarball):
tests/.gitignore
Additional changes:
tests/Makefile.in (auto-generated from tests/Makefile.am)
tests-m32/Makefile.in (auto-generated from tests-m32/Makefile.am)
tests-m32/kill_child.c (copy of tests/kill_child.c)
tests-m32/kill_child.test (copy of tests/kill_child.test)
tests-m32/Makefile.in (auto-generted from tests-mx32/Makefile.am)
tests-mx32/kill_child.c (copy of tests/kill_child.c)
tests-mx32/kill_child.test (copy of tests/kill_child.test)
Co-Authored-by: Dmitry V. Levin <ldv@altlinux.org>
---
tests/.gitignore | 1 +
tests/Makefile.am | 2 ++
tests/kill_child.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++
tests/kill_child.test | 31 +++++++++++++++++++++++
4 files changed, 103 insertions(+)
create mode 100644 tests/kill_child.c
create mode 100755 tests/kill_child.test
Index: strace-4.24/tests/Makefile.am
===================================================================
--- strace-4.24.orig/tests/Makefile.am 2019-03-10 05:34:51.995141191 +0100
+++ strace-4.24/tests/Makefile.am 2019-03-10 05:40:37.969676713 +0100
@@ -104,6 +104,7 @@
ioctl_perf-success \
ioctl_rtc-v \
is_linux_mips_n64 \
+ kill_child \
ksysent \
list_sigaction_signum \
localtime \
@@ -299,6 +300,7 @@
get_regs.test \
inject-nf.test \
interactive_block.test \
+ kill_child.test \
ksysent.test \
localtime.test \
opipe.test \
Index: strace-4.24/tests/kill_child.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests/kill_child.c 2019-03-10 05:40:37.970676703 +0100
@@ -0,0 +1,69 @@
+/*
+ * Check for the corner case that previously lead to segfault
+ * due to an attempt to access unitialised tcp->s_ent.
+ *
+ * 13994 ????( <unfinished ...>
+ * ...
+ * 13994 <... ???? resumed>) = ?
+ *
+ * Copyright (c) 2019 The strace developers.
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "tests.h"
+
+#include <sched.h>
+#include <signal.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <sys/wait.h>
+
+#define ITERS 10000
+#define SC_ITERS 10000
+
+int
+main(void)
+{
+ volatile sig_atomic_t *const mem =
+ mmap(NULL, get_page_size(), PROT_READ | PROT_WRITE,
+ MAP_SHARED | MAP_ANONYMOUS, -1, 0);
+ if (mem == MAP_FAILED)
+ perror_msg_and_fail("mmap");
+
+ for (unsigned int i = 0; i < ITERS; ++i) {
+ mem[0] = mem[1] = 0;
+
+ const pid_t pid = fork();
+ if (pid < 0)
+ perror_msg_and_fail("fork");
+
+ if (!pid) {
+ /* wait for the parent */
+ while (!mem[0])
+ ;
+ /* let the parent know we are running */
+ mem[1] = 1;
+
+ for (unsigned int j = 0; j < SC_ITERS; j++)
+ sched_yield();
+
+ pause();
+ return 0;
+ }
+
+ /* let the child know we are running */
+ mem[0] = 1;
+ /* wait for the child */
+ while (!mem[1])
+ ;
+
+ if (kill(pid, SIGKILL))
+ perror_msg_and_fail("kill");
+ if (wait(NULL) != pid)
+ perror_msg_and_fail("wait");
+ }
+
+ return 0;
+}
Index: strace-4.24/tests/kill_child.test
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests/kill_child.test 2019-03-10 05:40:37.970676703 +0100
@@ -0,0 +1,31 @@
+#!/bin/sh
+#
+# Check whether repeated killing of just forked processes crashes strace.
+#
+# Copyright (c) 2019 The strace developers.
+# All rights reserved.
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+. "${srcdir=.}/init.sh"
+
+run_prog_skip_if_failed date +%s > /dev/null
+s0="$(date +%s)"
+
+run_prog
+args="-f -qq -e signal=none -e trace=sched_yield,/kill $args"
+
+# Run strace until the known corner case is observed.
+while :; do
+ run_strace $args
+
+ # Printing of "<... SYSCALL resumed>" in strace.c:print_event_exit
+ # used to segfault when the syscall number had not been obtained
+ # on syscall entering.
+ grep -q '^[1-9][0-9]* <\.\.\. ???? resumed>) \+= ?$' "$LOG" && exit 0
+
+ s1="$(date +%s)"
+ if [ "$(($s1-$s0))" -gt "$(($TIMEOUT_DURATION/2))" ]; then
+ skip_ 'Unable to reproduce <... ???? resumed>'
+ fi
+done
Index: strace-4.24/tests/Makefile.in
===================================================================
--- strace-4.24.orig/tests/Makefile.in 2019-03-10 05:34:51.995141191 +0100
+++ strace-4.24/tests/Makefile.in 2019-03-10 05:40:37.973676673 +0100
@@ -153,8 +153,9 @@
ioctl_evdev-v$(EXEEXT) ioctl_loop-nv$(EXEEXT) \
ioctl_loop-v$(EXEEXT) ioctl_nsfs$(EXEEXT) \
ioctl_perf-success$(EXEEXT) ioctl_rtc-v$(EXEEXT) \
- is_linux_mips_n64$(EXEEXT) ksysent$(EXEEXT) \
- list_sigaction_signum$(EXEEXT) localtime$(EXEEXT) \
+ is_linux_mips_n64$(EXEEXT) kill_child$(EXEEXT) \
+ ksysent$(EXEEXT) list_sigaction_signum$(EXEEXT) \
+ localtime$(EXEEXT) \
mmsg-silent$(EXEEXT) mmsg_name-v$(EXEEXT) \
msg_control-v$(EXEEXT) net-accept-connect$(EXEEXT) \
net-tpacket_stats-success$(EXEEXT) netlink_inet_diag$(EXEEXT) \
@@ -1186,6 +1187,10 @@
kill_OBJECTS = kill.$(OBJEXT)
kill_LDADD = $(LDADD)
kill_DEPENDENCIES = libtests.a
+kill_child_SOURCES = kill_child.c
+kill_child_OBJECTS = kill_child.$(OBJEXT)
+kill_child_LDADD = $(LDADD)
+kill_child_DEPENDENCIES = libtests.a
ksysent_SOURCES = ksysent.c
ksysent_OBJECTS = ksysent.$(OBJEXT)
ksysent_LDADD = $(LDADD)
@@ -2741,9 +2746,9 @@
ipc_shm.c ipc_shm-Xabbrev.c ipc_shm-Xraw.c ipc_shm-Xverbose.c \
is_linux_mips_n64.c kcmp.c kcmp-y.c kern_features.c \
kexec_file_load.c kexec_load.c keyctl.c keyctl-Xabbrev.c \
- keyctl-Xraw.c keyctl-Xverbose.c kill.c ksysent.c lchown.c \
- lchown32.c link.c linkat.c list_sigaction_signum.c llseek.c \
- localtime.c lookup_dcookie.c lseek.c lstat.c lstat64.c \
+ keyctl-Xraw.c keyctl-Xverbose.c kill.c kill_child.c ksysent.c \
+ lchown.c lchown32.c link.c linkat.c list_sigaction_signum.c \
+ llseek.c localtime.c lookup_dcookie.c lseek.c lstat.c lstat64.c \
madvise.c mbind.c membarrier.c memfd_create.c migrate_pages.c \
mincore.c mkdir.c mkdirat.c mknod.c mknodat.c mlock.c mlock2.c \
mlockall.c mmap.c mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c \
@@ -2886,9 +2891,9 @@
ipc_shm.c ipc_shm-Xabbrev.c ipc_shm-Xraw.c ipc_shm-Xverbose.c \
is_linux_mips_n64.c kcmp.c kcmp-y.c kern_features.c \
kexec_file_load.c kexec_load.c keyctl.c keyctl-Xabbrev.c \
- keyctl-Xraw.c keyctl-Xverbose.c kill.c ksysent.c lchown.c \
- lchown32.c link.c linkat.c list_sigaction_signum.c llseek.c \
- localtime.c lookup_dcookie.c lseek.c lstat.c lstat64.c \
+ keyctl-Xraw.c keyctl-Xverbose.c kill.c kill_child.c ksysent.c \
+ lchown.c lchown32.c link.c linkat.c list_sigaction_signum.c \
+ llseek.c localtime.c lookup_dcookie.c lseek.c lstat.c lstat64.c \
madvise.c mbind.c membarrier.c memfd_create.c migrate_pages.c \
mincore.c mkdir.c mkdirat.c mknod.c mknodat.c mlock.c mlock2.c \
mlockall.c mmap.c mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c \
@@ -4227,6 +4232,7 @@
get_regs.test \
inject-nf.test \
interactive_block.test \
+ kill_child.test \
ksysent.test \
localtime.test \
opipe.test \
@@ -5190,6 +5196,10 @@
@rm -f kill$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(kill_OBJECTS) $(kill_LDADD) $(LIBS)
+kill_child$(EXEEXT): $(kill_child_OBJECTS) $(kill_child_DEPENDENCIES) $(EXTRA_kill_child_DEPENDENCIES)
+ @rm -f kill_child$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(kill_child_OBJECTS) $(kill_child_LDADD) $(LIBS)
+
ksysent$(EXEEXT): $(ksysent_OBJECTS) $(ksysent_DEPENDENCIES) $(EXTRA_ksysent_DEPENDENCIES)
@rm -f ksysent$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(ksysent_OBJECTS) $(ksysent_LDADD) $(LIBS)
@@ -6855,6 +6865,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keyctl-Xverbose.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keyctl.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kill.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kill_child.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ksysent.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lchown.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lchown32.Po@am__quote@
Index: strace-4.24/tests-m32/Makefile.in
===================================================================
--- strace-4.24.orig/tests-m32/Makefile.in 2018-08-14 02:44:38.000000000 +0200
+++ strace-4.24/tests-m32/Makefile.in 2019-03-10 05:44:56.112091757 +0100
@@ -153,8 +153,9 @@
ioctl_evdev-v$(EXEEXT) ioctl_loop-nv$(EXEEXT) \
ioctl_loop-v$(EXEEXT) ioctl_nsfs$(EXEEXT) \
ioctl_perf-success$(EXEEXT) ioctl_rtc-v$(EXEEXT) \
- is_linux_mips_n64$(EXEEXT) ksysent$(EXEEXT) \
- list_sigaction_signum$(EXEEXT) localtime$(EXEEXT) \
+ is_linux_mips_n64$(EXEEXT) kill_child$(EXEEXT) \
+ ksysent$(EXEEXT) list_sigaction_signum$(EXEEXT) \
+ localtime$(EXEEXT) \
mmsg-silent$(EXEEXT) mmsg_name-v$(EXEEXT) \
msg_control-v$(EXEEXT) net-accept-connect$(EXEEXT) \
net-tpacket_stats-success$(EXEEXT) netlink_inet_diag$(EXEEXT) \
@@ -1186,6 +1187,10 @@
kill_OBJECTS = kill.$(OBJEXT)
kill_LDADD = $(LDADD)
kill_DEPENDENCIES = libtests.a
+kill_child_SOURCES = kill_child.c
+kill_child_OBJECTS = kill_child.$(OBJEXT)
+kill_child_LDADD = $(LDADD)
+kill_child_DEPENDENCIES = libtests.a
ksysent_SOURCES = ksysent.c
ksysent_OBJECTS = ksysent.$(OBJEXT)
ksysent_LDADD = $(LDADD)
@@ -2741,9 +2746,9 @@
ipc_shm.c ipc_shm-Xabbrev.c ipc_shm-Xraw.c ipc_shm-Xverbose.c \
is_linux_mips_n64.c kcmp.c kcmp-y.c kern_features.c \
kexec_file_load.c kexec_load.c keyctl.c keyctl-Xabbrev.c \
- keyctl-Xraw.c keyctl-Xverbose.c kill.c ksysent.c lchown.c \
- lchown32.c link.c linkat.c list_sigaction_signum.c llseek.c \
- localtime.c lookup_dcookie.c lseek.c lstat.c lstat64.c \
+ keyctl-Xraw.c keyctl-Xverbose.c kill.c kill_child.c ksysent.c \
+ lchown.c lchown32.c link.c linkat.c list_sigaction_signum.c \
+ llseek.c localtime.c lookup_dcookie.c lseek.c lstat.c lstat64.c \
madvise.c mbind.c membarrier.c memfd_create.c migrate_pages.c \
mincore.c mkdir.c mkdirat.c mknod.c mknodat.c mlock.c mlock2.c \
mlockall.c mmap.c mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c \
@@ -2886,9 +2891,9 @@
ipc_shm.c ipc_shm-Xabbrev.c ipc_shm-Xraw.c ipc_shm-Xverbose.c \
is_linux_mips_n64.c kcmp.c kcmp-y.c kern_features.c \
kexec_file_load.c kexec_load.c keyctl.c keyctl-Xabbrev.c \
- keyctl-Xraw.c keyctl-Xverbose.c kill.c ksysent.c lchown.c \
- lchown32.c link.c linkat.c list_sigaction_signum.c llseek.c \
- localtime.c lookup_dcookie.c lseek.c lstat.c lstat64.c \
+ keyctl-Xraw.c keyctl-Xverbose.c kill.c kill_child.c ksysent.c \
+ lchown.c lchown32.c link.c linkat.c list_sigaction_signum.c \
+ llseek.c localtime.c lookup_dcookie.c lseek.c lstat.c lstat64.c \
madvise.c mbind.c membarrier.c memfd_create.c migrate_pages.c \
mincore.c mkdir.c mkdirat.c mknod.c mknodat.c mlock.c mlock2.c \
mlockall.c mmap.c mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c \
@@ -4227,6 +4232,7 @@
get_regs.test \
inject-nf.test \
interactive_block.test \
+ kill_child.test \
ksysent.test \
localtime.test \
opipe.test \
@@ -5190,6 +5196,10 @@
@rm -f kill$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(kill_OBJECTS) $(kill_LDADD) $(LIBS)
+kill_child$(EXEEXT): $(kill_child_OBJECTS) $(kill_child_DEPENDENCIES) $(EXTRA_kill_child_DEPENDENCIES)
+ @rm -f kill_child$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(kill_child_OBJECTS) $(kill_child_LDADD) $(LIBS)
+
ksysent$(EXEEXT): $(ksysent_OBJECTS) $(ksysent_DEPENDENCIES) $(EXTRA_ksysent_DEPENDENCIES)
@rm -f ksysent$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(ksysent_OBJECTS) $(ksysent_LDADD) $(LIBS)
@@ -6855,6 +6865,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keyctl-Xverbose.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keyctl.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kill.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kill_child.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ksysent.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lchown.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lchown32.Po@am__quote@
Index: strace-4.24/tests-m32/kill_child.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests-m32/kill_child.c 2019-03-10 05:41:09.454361435 +0100
@@ -0,0 +1,69 @@
+/*
+ * Check for the corner case that previously lead to segfault
+ * due to an attempt to access unitialised tcp->s_ent.
+ *
+ * 13994 ????( <unfinished ...>
+ * ...
+ * 13994 <... ???? resumed>) = ?
+ *
+ * Copyright (c) 2019 The strace developers.
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "tests.h"
+
+#include <sched.h>
+#include <signal.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <sys/wait.h>
+
+#define ITERS 10000
+#define SC_ITERS 10000
+
+int
+main(void)
+{
+ volatile sig_atomic_t *const mem =
+ mmap(NULL, get_page_size(), PROT_READ | PROT_WRITE,
+ MAP_SHARED | MAP_ANONYMOUS, -1, 0);
+ if (mem == MAP_FAILED)
+ perror_msg_and_fail("mmap");
+
+ for (unsigned int i = 0; i < ITERS; ++i) {
+ mem[0] = mem[1] = 0;
+
+ const pid_t pid = fork();
+ if (pid < 0)
+ perror_msg_and_fail("fork");
+
+ if (!pid) {
+ /* wait for the parent */
+ while (!mem[0])
+ ;
+ /* let the parent know we are running */
+ mem[1] = 1;
+
+ for (unsigned int j = 0; j < SC_ITERS; j++)
+ sched_yield();
+
+ pause();
+ return 0;
+ }
+
+ /* let the child know we are running */
+ mem[0] = 1;
+ /* wait for the child */
+ while (!mem[1])
+ ;
+
+ if (kill(pid, SIGKILL))
+ perror_msg_and_fail("kill");
+ if (wait(NULL) != pid)
+ perror_msg_and_fail("wait");
+ }
+
+ return 0;
+}
Index: strace-4.24/tests-m32/kill_child.test
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests-m32/kill_child.test 2019-03-10 05:41:25.066205103 +0100
@@ -0,0 +1,31 @@
+#!/bin/sh
+#
+# Check whether repeated killing of just forked processes crashes strace.
+#
+# Copyright (c) 2019 The strace developers.
+# All rights reserved.
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+. "${srcdir=.}/init.sh"
+
+run_prog_skip_if_failed date +%s > /dev/null
+s0="$(date +%s)"
+
+run_prog
+args="-f -qq -e signal=none -e trace=sched_yield,/kill $args"
+
+# Run strace until the known corner case is observed.
+while :; do
+ run_strace $args
+
+ # Printing of "<... SYSCALL resumed>" in strace.c:print_event_exit
+ # used to segfault when the syscall number had not been obtained
+ # on syscall entering.
+ grep -q '^[1-9][0-9]* <\.\.\. ???? resumed>) \+= ?$' "$LOG" && exit 0
+
+ s1="$(date +%s)"
+ if [ "$(($s1-$s0))" -gt "$(($TIMEOUT_DURATION/2))" ]; then
+ skip_ 'Unable to reproduce <... ???? resumed>'
+ fi
+done
Index: strace-4.24/tests-mx32/kill_child.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests-mx32/kill_child.c 2019-03-10 05:41:12.566330273 +0100
@@ -0,0 +1,69 @@
+/*
+ * Check for the corner case that previously lead to segfault
+ * due to an attempt to access unitialised tcp->s_ent.
+ *
+ * 13994 ????( <unfinished ...>
+ * ...
+ * 13994 <... ???? resumed>) = ?
+ *
+ * Copyright (c) 2019 The strace developers.
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "tests.h"
+
+#include <sched.h>
+#include <signal.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <sys/wait.h>
+
+#define ITERS 10000
+#define SC_ITERS 10000
+
+int
+main(void)
+{
+ volatile sig_atomic_t *const mem =
+ mmap(NULL, get_page_size(), PROT_READ | PROT_WRITE,
+ MAP_SHARED | MAP_ANONYMOUS, -1, 0);
+ if (mem == MAP_FAILED)
+ perror_msg_and_fail("mmap");
+
+ for (unsigned int i = 0; i < ITERS; ++i) {
+ mem[0] = mem[1] = 0;
+
+ const pid_t pid = fork();
+ if (pid < 0)
+ perror_msg_and_fail("fork");
+
+ if (!pid) {
+ /* wait for the parent */
+ while (!mem[0])
+ ;
+ /* let the parent know we are running */
+ mem[1] = 1;
+
+ for (unsigned int j = 0; j < SC_ITERS; j++)
+ sched_yield();
+
+ pause();
+ return 0;
+ }
+
+ /* let the child know we are running */
+ mem[0] = 1;
+ /* wait for the child */
+ while (!mem[1])
+ ;
+
+ if (kill(pid, SIGKILL))
+ perror_msg_and_fail("kill");
+ if (wait(NULL) != pid)
+ perror_msg_and_fail("wait");
+ }
+
+ return 0;
+}
Index: strace-4.24/tests-mx32/kill_child.test
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests-mx32/kill_child.test 2019-03-10 05:41:27.802177706 +0100
@@ -0,0 +1,31 @@
+#!/bin/sh
+#
+# Check whether repeated killing of just forked processes crashes strace.
+#
+# Copyright (c) 2019 The strace developers.
+# All rights reserved.
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+. "${srcdir=.}/init.sh"
+
+run_prog_skip_if_failed date +%s > /dev/null
+s0="$(date +%s)"
+
+run_prog
+args="-f -qq -e signal=none -e trace=sched_yield,/kill $args"
+
+# Run strace until the known corner case is observed.
+while :; do
+ run_strace $args
+
+ # Printing of "<... SYSCALL resumed>" in strace.c:print_event_exit
+ # used to segfault when the syscall number had not been obtained
+ # on syscall entering.
+ grep -q '^[1-9][0-9]* <\.\.\. ???? resumed>) \+= ?$' "$LOG" && exit 0
+
+ s1="$(date +%s)"
+ if [ "$(($s1-$s0))" -gt "$(($TIMEOUT_DURATION/2))" ]; then
+ skip_ 'Unable to reproduce <... ???? resumed>'
+ fi
+done
Index: strace-4.24/tests-mx32/Makefile.in
===================================================================
--- strace-4.24.orig/tests-mx32/Makefile.in 2018-08-14 02:44:38.000000000 +0200
+++ strace-4.24/tests-mx32/Makefile.in 2019-03-10 05:45:49.892553217 +0100
@@ -153,8 +153,9 @@
ioctl_evdev-v$(EXEEXT) ioctl_loop-nv$(EXEEXT) \
ioctl_loop-v$(EXEEXT) ioctl_nsfs$(EXEEXT) \
ioctl_perf-success$(EXEEXT) ioctl_rtc-v$(EXEEXT) \
- is_linux_mips_n64$(EXEEXT) ksysent$(EXEEXT) \
- list_sigaction_signum$(EXEEXT) localtime$(EXEEXT) \
+ is_linux_mips_n64$(EXEEXT) kill_child$(EXEEXT) \
+ ksysent$(EXEEXT) list_sigaction_signum$(EXEEXT) \
+ localtime$(EXEEXT) \
mmsg-silent$(EXEEXT) mmsg_name-v$(EXEEXT) \
msg_control-v$(EXEEXT) net-accept-connect$(EXEEXT) \
net-tpacket_stats-success$(EXEEXT) netlink_inet_diag$(EXEEXT) \
@@ -1186,6 +1187,10 @@
kill_OBJECTS = kill.$(OBJEXT)
kill_LDADD = $(LDADD)
kill_DEPENDENCIES = libtests.a
+kill_child_SOURCES = kill_child.c
+kill_child_OBJECTS = kill_child.$(OBJEXT)
+kill_child_LDADD = $(LDADD)
+kill_child_DEPENDENCIES = libtests.a
ksysent_SOURCES = ksysent.c
ksysent_OBJECTS = ksysent.$(OBJEXT)
ksysent_LDADD = $(LDADD)
@@ -2741,9 +2746,9 @@
ipc_shm.c ipc_shm-Xabbrev.c ipc_shm-Xraw.c ipc_shm-Xverbose.c \
is_linux_mips_n64.c kcmp.c kcmp-y.c kern_features.c \
kexec_file_load.c kexec_load.c keyctl.c keyctl-Xabbrev.c \
- keyctl-Xraw.c keyctl-Xverbose.c kill.c ksysent.c lchown.c \
- lchown32.c link.c linkat.c list_sigaction_signum.c llseek.c \
- localtime.c lookup_dcookie.c lseek.c lstat.c lstat64.c \
+ keyctl-Xraw.c keyctl-Xverbose.c kill.c kill_child.c ksysent.c \
+ lchown.c lchown32.c link.c linkat.c list_sigaction_signum.c \
+ llseek.c localtime.c lookup_dcookie.c lseek.c lstat.c lstat64.c \
madvise.c mbind.c membarrier.c memfd_create.c migrate_pages.c \
mincore.c mkdir.c mkdirat.c mknod.c mknodat.c mlock.c mlock2.c \
mlockall.c mmap.c mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c \
@@ -2886,9 +2891,9 @@
ipc_shm.c ipc_shm-Xabbrev.c ipc_shm-Xraw.c ipc_shm-Xverbose.c \
is_linux_mips_n64.c kcmp.c kcmp-y.c kern_features.c \
kexec_file_load.c kexec_load.c keyctl.c keyctl-Xabbrev.c \
- keyctl-Xraw.c keyctl-Xverbose.c kill.c ksysent.c lchown.c \
- lchown32.c link.c linkat.c list_sigaction_signum.c llseek.c \
- localtime.c lookup_dcookie.c lseek.c lstat.c lstat64.c \
+ keyctl-Xraw.c keyctl-Xverbose.c kill.c kill_child.c ksysent.c \
+ lchown.c lchown32.c link.c linkat.c list_sigaction_signum.c \
+ llseek.c localtime.c lookup_dcookie.c lseek.c lstat.c lstat64.c \
madvise.c mbind.c membarrier.c memfd_create.c migrate_pages.c \
mincore.c mkdir.c mkdirat.c mknod.c mknodat.c mlock.c mlock2.c \
mlockall.c mmap.c mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c \
@@ -4227,6 +4232,7 @@
get_regs.test \
inject-nf.test \
interactive_block.test \
+ kill_child.test \
ksysent.test \
localtime.test \
opipe.test \
@@ -5190,6 +5196,10 @@
@rm -f kill$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(kill_OBJECTS) $(kill_LDADD) $(LIBS)
+kill_child$(EXEEXT): $(kill_child_OBJECTS) $(kill_child_DEPENDENCIES) $(EXTRA_kill_child_DEPENDENCIES)
+ @rm -f kill_child$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(kill_child_OBJECTS) $(kill_child_LDADD) $(LIBS)
+
ksysent$(EXEEXT): $(ksysent_OBJECTS) $(ksysent_DEPENDENCIES) $(EXTRA_ksysent_DEPENDENCIES)
@rm -f ksysent$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(ksysent_OBJECTS) $(ksysent_LDADD) $(LIBS)
@@ -6855,6 +6865,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keyctl-Xverbose.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keyctl.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kill.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kill_child.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ksysent.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lchown.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lchown32.Po@am__quote@

View File

@ -0,0 +1,193 @@
From ca7fc3695b061c48af1975d14a3e50a87329031a Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Wed, 6 Mar 2019 16:02:38 +0000
Subject: [PATCH 23/27] tests: move PTRACE_SEIZE check to a separate file
The check is going to be used by another test soon.
* tests/PTRACE_SEIZE.sh: New file.
* tests/detach-stopped.test: Use it.
* tests/Makefile.am (EXTRA_DIST): Add PTRACE_SEIZE.sh.
Conflicts:
tests/Makefile.am
tests/detach-stopped.test
Additional changes:
tests-m32/PTRACE_SEIZE.sh (copy of tests/PTRACE_SEIZE.sh)
tests-m32/detach-stopped.test (copy of tests/detach-stopped.test)
tests-mx32/PTRACE_SEIZE.sh (copy of tests/PTRACE_SEIZE.sh)
tests-mx32/detach-stopped.test (copy of tests/detach-stopped.test)
---
tests/Makefile.am | 1 +
tests/PTRACE_SEIZE.sh | 13 +++++++++++++
tests/detach-stopped.test | 6 +-----
3 files changed, 15 insertions(+), 5 deletions(-)
create mode 100755 tests/PTRACE_SEIZE.sh
Index: strace-4.24/tests/Makefile.am
===================================================================
--- strace-4.24.orig/tests/Makefile.am 2019-03-10 05:40:37.969676713 +0100
+++ strace-4.24/tests/Makefile.am 2019-03-10 05:47:36.446486219 +0100
@@ -361,6 +361,7 @@
EXTRA_DIST = \
COPYING \
GPL-2.0-or-later \
+ PTRACE_SEIZE.sh \
accept_compat.h \
attach-p-cmd.h \
caps-abbrev.awk \
Index: strace-4.24/tests/PTRACE_SEIZE.sh
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests/PTRACE_SEIZE.sh 2019-03-10 05:47:36.447486209 +0100
@@ -0,0 +1,13 @@
+#!/bin/sh
+#
+# Skip the test if PTRACE_SEIZE is not supported.
+#
+# Copyright (c) 2014-2019 The strace developers.
+# All rights reserved.
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+$STRACE -d -enone / > /dev/null 2> "$LOG" ||:
+if grep -x "[^:]*strace: PTRACE_SEIZE doesn't work" "$LOG" > /dev/null; then
+ skip_ "PTRACE_SEIZE doesn't work"
+fi
Index: strace-4.24/tests/detach-stopped.test
===================================================================
--- strace-4.24.orig/tests/detach-stopped.test 2019-03-10 05:34:50.982151335 +0100
+++ strace-4.24/tests/detach-stopped.test 2019-03-10 05:47:36.447486209 +0100
@@ -9,17 +9,13 @@
# SPDX-License-Identifier: GPL-2.0-or-later
. "${srcdir=.}/init.sh"
+. "${srcdir=.}/PTRACE_SEIZE.sh"
run_prog_skip_if_failed \
kill -0 $$
check_prog sleep
-$STRACE -d -enone / > /dev/null 2> "$LOG"
-if grep -x "[^:]*strace: PTRACE_SEIZE doesn't work" "$LOG" > /dev/null; then
- skip_ "PTRACE_SEIZE doesn't work"
-fi
-
set -e
> "$LOG"
Index: strace-4.24/tests-m32/PTRACE_SEIZE.sh
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests-m32/PTRACE_SEIZE.sh 2019-03-10 05:48:20.038049708 +0100
@@ -0,0 +1,13 @@
+#!/bin/sh
+#
+# Skip the test if PTRACE_SEIZE is not supported.
+#
+# Copyright (c) 2014-2019 The strace developers.
+# All rights reserved.
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+$STRACE -d -enone / > /dev/null 2> "$LOG" ||:
+if grep -x "[^:]*strace: PTRACE_SEIZE doesn't work" "$LOG" > /dev/null; then
+ skip_ "PTRACE_SEIZE doesn't work"
+fi
Index: strace-4.24/tests-m32/detach-stopped.test
===================================================================
--- strace-4.24.orig/tests-m32/detach-stopped.test 2017-05-22 19:33:51.000000000 +0200
+++ strace-4.24/tests-m32/detach-stopped.test 2019-03-10 05:48:30.588944054 +0100
@@ -6,40 +6,16 @@
# Copyright (c) 2014-2017 The strace developers.
# All rights reserved.
#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. The name of the author may not be used to endorse or promote products
-# derived from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# SPDX-License-Identifier: GPL-2.0-or-later
. "${srcdir=.}/init.sh"
+. "${srcdir=.}/PTRACE_SEIZE.sh"
run_prog_skip_if_failed \
kill -0 $$
check_prog sleep
-$STRACE -d -enone / > /dev/null 2> "$LOG"
-if grep -x "[^:]*strace: PTRACE_SEIZE doesn't work" "$LOG" > /dev/null; then
- skip_ "PTRACE_SEIZE doesn't work"
-fi
-
set -e
> "$LOG"
Index: strace-4.24/tests-mx32/detach-stopped.test
===================================================================
--- strace-4.24.orig/tests-mx32/detach-stopped.test 2017-05-22 19:33:51.000000000 +0200
+++ strace-4.24/tests-mx32/detach-stopped.test 2019-03-10 05:48:33.040919501 +0100
@@ -6,40 +6,16 @@
# Copyright (c) 2014-2017 The strace developers.
# All rights reserved.
#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. The name of the author may not be used to endorse or promote products
-# derived from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# SPDX-License-Identifier: GPL-2.0-or-later
. "${srcdir=.}/init.sh"
+. "${srcdir=.}/PTRACE_SEIZE.sh"
run_prog_skip_if_failed \
kill -0 $$
check_prog sleep
-$STRACE -d -enone / > /dev/null 2> "$LOG"
-if grep -x "[^:]*strace: PTRACE_SEIZE doesn't work" "$LOG" > /dev/null; then
- skip_ "PTRACE_SEIZE doesn't work"
-fi
-
set -e
> "$LOG"

View File

@ -0,0 +1,901 @@
From 96dc1aa20237b80087f6c9ee29147bb85a5594d9 Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Wed, 6 Mar 2019 16:02:38 +0000
Subject: [PATCH 24/27] tests: check tracing of orphaned process group
* tests/orphaned_process_group.c: New file.
* tests/.gitignore: Add orphaned_process_group.
* tests/Makefile.am (check_PROGRAMS): Likewise.
* tests/gen_tests.in (orphaned_process_group): New test.
Skipped files (not present in the tarball):
tests/.gitignore
Additional changes:
tests/Makefile.in (generated from tests/Makefile.am)
tests/tests/orphaned_process_group.gen.test (generated from tests/gen_tests.in)
tests-m32/Makefile.in (generated from tests-m32/Makefile.am)
tests-m32/gen_tests.in (copy of tests/gen_tests.in)
tests-m32/orphaned_process_group.c (copy of tests/orphaned_process_group.c)
tests-m32/tests/orphaned_process_group.gen.test (generated from tests-m32/gen_tests.in)
tests-mx32/Makefile.in (generated from tests-mx32/Makefile.am)
tests-mx32/gen_tests.in (copy of tests/gen_tests.in)
tests-mx32/orphaned_process_group.c (copy of tests/orphaned_process_group.c)
tests-mx32/tests/orphaned_process_group.gen.test (generated from tests-mx32/gen_tests.in)
---
tests/.gitignore | 1 +
tests/Makefile.am | 1 +
tests/gen_tests.in | 1 +
tests/orphaned_process_group.c | 155 +++++++++++++++++++++++++++++++++++++++++
4 files changed, 158 insertions(+)
create mode 100644 tests/orphaned_process_group.c
Index: strace-4.24/tests/Makefile.am
===================================================================
--- strace-4.24.orig/tests/Makefile.am 2019-03-10 05:47:36.446486219 +0100
+++ strace-4.24/tests/Makefile.am 2019-03-10 05:50:05.488993755 +0100
@@ -120,6 +120,7 @@
nsyscalls-d \
oldselect-P \
oldselect-efault-P \
+ orphaned_process_group \
pc \
perf_event_open_nonverbose \
perf_event_open_unabbrev \
Index: strace-4.24/tests/gen_tests.in
===================================================================
--- strace-4.24.orig/tests/gen_tests.in 2019-03-10 05:19:26.185411954 +0100
+++ strace-4.24/tests/gen_tests.in 2019-03-10 05:50:05.488993755 +0100
@@ -287,6 +287,7 @@
oldstat -a32 -v -P stat.sample -P /dev/full
open -a30 -P $NAME.sample
openat -a36 -P $NAME.sample
+orphaned_process_group . "${srcdir=.}/PTRACE_SEIZE.sh"; run_strace_match_diff -f -e trace=none -e signal='!chld'
osf_utimes -a21
pause -a8 -esignal=none
perf_event_open -a1
Index: strace-4.24/tests/orphaned_process_group.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests/orphaned_process_group.c 2019-03-10 05:50:05.488993755 +0100
@@ -0,0 +1,155 @@
+/*
+ * Check tracing of orphaned process group.
+ *
+ * Copyright (c) 2019 The strace developers.
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "tests.h"
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/wait.h>
+
+#define TIMEOUT 5
+
+static void
+alarm_handler(const int no)
+{
+ error_msg_and_skip("Orphaned process group semantics"
+ " is not supported by the kernel");
+}
+
+int
+main(void)
+{
+ int status;
+
+ /*
+ * Unblock all signals.
+ */
+ static sigset_t mask;
+ if (sigprocmask(SIG_SETMASK, &mask, NULL))
+ perror_msg_and_fail("sigprocmask");
+
+ /*
+ * Create a pipe to track termination of processes.
+ */
+ int pipe_fds[2];
+ if (pipe(pipe_fds))
+ perror_msg_and_fail("pipe");
+
+ /*
+ * Create a leader for its own new process group.
+ */
+ pid_t leader = fork();
+ if (leader < 0)
+ perror_msg_and_fail("fork");
+
+ if (leader) {
+ /*
+ * Close the writing end of the pipe.
+ */
+ close(pipe_fds[1]);
+
+ /*
+ * Install the SIGALRM signal handler.
+ */
+ static const struct sigaction sa = {
+ .sa_handler = alarm_handler
+ };
+ if (sigaction(SIGALRM, &sa, NULL))
+ perror_msg_and_fail("sigaction");
+
+ /*
+ * Set an alarm clock.
+ */
+ alarm(TIMEOUT);
+
+ /*
+ * Wait for termination of the child process.
+ */
+ if (waitpid(leader, &status, 0) != leader)
+ perror_msg_and_fail("waitpid leader");
+ if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
+ error_msg_and_fail("waitpid leader: "
+ "unexpected wait status %d",
+ status);
+
+ /*
+ * Wait for termination of all processes
+ * in the process group of the child process.
+ */
+ if (read(pipe_fds[0], &status, sizeof(status)) != 0)
+ perror_msg_and_fail("read");
+
+ /*
+ * At this point all processes are gone.
+ * Let the tracer time to catch up.
+ */
+ alarm(0);
+ sleep(1);
+ return 0;
+ }
+
+ /*
+ * Close the reading end of the pipe.
+ */
+ close(pipe_fds[0]);
+
+ /*
+ * Create a new process group.
+ */
+ if (setpgid(0, 0))
+ perror_msg_and_fail("setpgid");
+
+ /*
+ * When the leader process terminates, the process group becomes orphaned.
+ * If any member of the orphaned process group is stopped, then
+ * a SIGHUP signal followed by a SIGCONT signal is sent to each process
+ * in the orphaned process group.
+ * Create a process in a stopped state to activate this behaviour.
+ */
+ const pid_t stopped = fork();
+ if (stopped < 0)
+ perror_msg_and_fail("fork");
+ if (!stopped) {
+ static const struct sigaction sa = { .sa_handler = SIG_DFL };
+ if (sigaction(SIGHUP, &sa, NULL))
+ perror_msg_and_fail("sigaction");
+
+ raise(SIGSTOP);
+ _exit(0);
+ }
+
+ /*
+ * Wait for the process to stop.
+ */
+ if (waitpid(stopped, &status, WUNTRACED) != stopped)
+ perror_msg_and_fail("waitpid WUNTRACED");
+ if (!WIFSTOPPED(status) || WSTOPSIG(status) != SIGSTOP)
+ error_msg_and_fail("unexpected wait status %d", status);
+
+ /*
+ * Print the expected output.
+ */
+ leader = getpid();
+ printf("%-5d --- %s {si_signo=%s, si_code=SI_TKILL"
+ ", si_pid=%d, si_uid=%u} ---\n",
+ stopped, "SIGSTOP", "SIGSTOP", stopped, geteuid());
+ printf("%-5d --- stopped by SIGSTOP ---\n", stopped);
+ printf("%-5d +++ exited with 0 +++\n", leader);
+ printf("%-5d --- %s {si_signo=%s, si_code=SI_KERNEL} ---\n",
+ stopped, "SIGHUP", "SIGHUP");
+ printf("%-5d +++ killed by %s +++\n", stopped, "SIGHUP");
+ printf("%-5d +++ exited with 0 +++\n", getppid());
+
+ /*
+ * Make the process group orphaned.
+ */
+ return 0;
+}
Index: strace-4.24/tests-m32/orphaned_process_group.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests-m32/orphaned_process_group.c 2019-03-10 05:51:47.527971970 +0100
@@ -0,0 +1,155 @@
+/*
+ * Check tracing of orphaned process group.
+ *
+ * Copyright (c) 2019 The strace developers.
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "tests.h"
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/wait.h>
+
+#define TIMEOUT 5
+
+static void
+alarm_handler(const int no)
+{
+ error_msg_and_skip("Orphaned process group semantics"
+ " is not supported by the kernel");
+}
+
+int
+main(void)
+{
+ int status;
+
+ /*
+ * Unblock all signals.
+ */
+ static sigset_t mask;
+ if (sigprocmask(SIG_SETMASK, &mask, NULL))
+ perror_msg_and_fail("sigprocmask");
+
+ /*
+ * Create a pipe to track termination of processes.
+ */
+ int pipe_fds[2];
+ if (pipe(pipe_fds))
+ perror_msg_and_fail("pipe");
+
+ /*
+ * Create a leader for its own new process group.
+ */
+ pid_t leader = fork();
+ if (leader < 0)
+ perror_msg_and_fail("fork");
+
+ if (leader) {
+ /*
+ * Close the writing end of the pipe.
+ */
+ close(pipe_fds[1]);
+
+ /*
+ * Install the SIGALRM signal handler.
+ */
+ static const struct sigaction sa = {
+ .sa_handler = alarm_handler
+ };
+ if (sigaction(SIGALRM, &sa, NULL))
+ perror_msg_and_fail("sigaction");
+
+ /*
+ * Set an alarm clock.
+ */
+ alarm(TIMEOUT);
+
+ /*
+ * Wait for termination of the child process.
+ */
+ if (waitpid(leader, &status, 0) != leader)
+ perror_msg_and_fail("waitpid leader");
+ if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
+ error_msg_and_fail("waitpid leader: "
+ "unexpected wait status %d",
+ status);
+
+ /*
+ * Wait for termination of all processes
+ * in the process group of the child process.
+ */
+ if (read(pipe_fds[0], &status, sizeof(status)) != 0)
+ perror_msg_and_fail("read");
+
+ /*
+ * At this point all processes are gone.
+ * Let the tracer time to catch up.
+ */
+ alarm(0);
+ sleep(1);
+ return 0;
+ }
+
+ /*
+ * Close the reading end of the pipe.
+ */
+ close(pipe_fds[0]);
+
+ /*
+ * Create a new process group.
+ */
+ if (setpgid(0, 0))
+ perror_msg_and_fail("setpgid");
+
+ /*
+ * When the leader process terminates, the process group becomes orphaned.
+ * If any member of the orphaned process group is stopped, then
+ * a SIGHUP signal followed by a SIGCONT signal is sent to each process
+ * in the orphaned process group.
+ * Create a process in a stopped state to activate this behaviour.
+ */
+ const pid_t stopped = fork();
+ if (stopped < 0)
+ perror_msg_and_fail("fork");
+ if (!stopped) {
+ static const struct sigaction sa = { .sa_handler = SIG_DFL };
+ if (sigaction(SIGHUP, &sa, NULL))
+ perror_msg_and_fail("sigaction");
+
+ raise(SIGSTOP);
+ _exit(0);
+ }
+
+ /*
+ * Wait for the process to stop.
+ */
+ if (waitpid(stopped, &status, WUNTRACED) != stopped)
+ perror_msg_and_fail("waitpid WUNTRACED");
+ if (!WIFSTOPPED(status) || WSTOPSIG(status) != SIGSTOP)
+ error_msg_and_fail("unexpected wait status %d", status);
+
+ /*
+ * Print the expected output.
+ */
+ leader = getpid();
+ printf("%-5d --- %s {si_signo=%s, si_code=SI_TKILL"
+ ", si_pid=%d, si_uid=%u} ---\n",
+ stopped, "SIGSTOP", "SIGSTOP", stopped, geteuid());
+ printf("%-5d --- stopped by SIGSTOP ---\n", stopped);
+ printf("%-5d +++ exited with 0 +++\n", leader);
+ printf("%-5d --- %s {si_signo=%s, si_code=SI_KERNEL} ---\n",
+ stopped, "SIGHUP", "SIGHUP");
+ printf("%-5d +++ killed by %s +++\n", stopped, "SIGHUP");
+ printf("%-5d +++ exited with 0 +++\n", getppid());
+
+ /*
+ * Make the process group orphaned.
+ */
+ return 0;
+}
Index: strace-4.24/tests-mx32/orphaned_process_group.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests-mx32/orphaned_process_group.c 2019-03-10 05:51:50.259944613 +0100
@@ -0,0 +1,155 @@
+/*
+ * Check tracing of orphaned process group.
+ *
+ * Copyright (c) 2019 The strace developers.
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "tests.h"
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/wait.h>
+
+#define TIMEOUT 5
+
+static void
+alarm_handler(const int no)
+{
+ error_msg_and_skip("Orphaned process group semantics"
+ " is not supported by the kernel");
+}
+
+int
+main(void)
+{
+ int status;
+
+ /*
+ * Unblock all signals.
+ */
+ static sigset_t mask;
+ if (sigprocmask(SIG_SETMASK, &mask, NULL))
+ perror_msg_and_fail("sigprocmask");
+
+ /*
+ * Create a pipe to track termination of processes.
+ */
+ int pipe_fds[2];
+ if (pipe(pipe_fds))
+ perror_msg_and_fail("pipe");
+
+ /*
+ * Create a leader for its own new process group.
+ */
+ pid_t leader = fork();
+ if (leader < 0)
+ perror_msg_and_fail("fork");
+
+ if (leader) {
+ /*
+ * Close the writing end of the pipe.
+ */
+ close(pipe_fds[1]);
+
+ /*
+ * Install the SIGALRM signal handler.
+ */
+ static const struct sigaction sa = {
+ .sa_handler = alarm_handler
+ };
+ if (sigaction(SIGALRM, &sa, NULL))
+ perror_msg_and_fail("sigaction");
+
+ /*
+ * Set an alarm clock.
+ */
+ alarm(TIMEOUT);
+
+ /*
+ * Wait for termination of the child process.
+ */
+ if (waitpid(leader, &status, 0) != leader)
+ perror_msg_and_fail("waitpid leader");
+ if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
+ error_msg_and_fail("waitpid leader: "
+ "unexpected wait status %d",
+ status);
+
+ /*
+ * Wait for termination of all processes
+ * in the process group of the child process.
+ */
+ if (read(pipe_fds[0], &status, sizeof(status)) != 0)
+ perror_msg_and_fail("read");
+
+ /*
+ * At this point all processes are gone.
+ * Let the tracer time to catch up.
+ */
+ alarm(0);
+ sleep(1);
+ return 0;
+ }
+
+ /*
+ * Close the reading end of the pipe.
+ */
+ close(pipe_fds[0]);
+
+ /*
+ * Create a new process group.
+ */
+ if (setpgid(0, 0))
+ perror_msg_and_fail("setpgid");
+
+ /*
+ * When the leader process terminates, the process group becomes orphaned.
+ * If any member of the orphaned process group is stopped, then
+ * a SIGHUP signal followed by a SIGCONT signal is sent to each process
+ * in the orphaned process group.
+ * Create a process in a stopped state to activate this behaviour.
+ */
+ const pid_t stopped = fork();
+ if (stopped < 0)
+ perror_msg_and_fail("fork");
+ if (!stopped) {
+ static const struct sigaction sa = { .sa_handler = SIG_DFL };
+ if (sigaction(SIGHUP, &sa, NULL))
+ perror_msg_and_fail("sigaction");
+
+ raise(SIGSTOP);
+ _exit(0);
+ }
+
+ /*
+ * Wait for the process to stop.
+ */
+ if (waitpid(stopped, &status, WUNTRACED) != stopped)
+ perror_msg_and_fail("waitpid WUNTRACED");
+ if (!WIFSTOPPED(status) || WSTOPSIG(status) != SIGSTOP)
+ error_msg_and_fail("unexpected wait status %d", status);
+
+ /*
+ * Print the expected output.
+ */
+ leader = getpid();
+ printf("%-5d --- %s {si_signo=%s, si_code=SI_TKILL"
+ ", si_pid=%d, si_uid=%u} ---\n",
+ stopped, "SIGSTOP", "SIGSTOP", stopped, geteuid());
+ printf("%-5d --- stopped by SIGSTOP ---\n", stopped);
+ printf("%-5d +++ exited with 0 +++\n", leader);
+ printf("%-5d --- %s {si_signo=%s, si_code=SI_KERNEL} ---\n",
+ stopped, "SIGHUP", "SIGHUP");
+ printf("%-5d +++ killed by %s +++\n", stopped, "SIGHUP");
+ printf("%-5d +++ exited with 0 +++\n", getppid());
+
+ /*
+ * Make the process group orphaned.
+ */
+ return 0;
+}
Index: strace-4.24/tests/Makefile.in
===================================================================
--- strace-4.24.orig/tests/Makefile.in 2019-03-10 05:40:37.973676673 +0100
+++ strace-4.24/tests/Makefile.in 2019-03-10 05:56:10.763336015 +0100
@@ -161,8 +161,8 @@
net-tpacket_stats-success$(EXEEXT) netlink_inet_diag$(EXEEXT) \
netlink_netlink_diag$(EXEEXT) netlink_unix_diag$(EXEEXT) \
nsyscalls$(EXEEXT) nsyscalls-d$(EXEEXT) oldselect-P$(EXEEXT) \
- oldselect-efault-P$(EXEEXT) pc$(EXEEXT) \
- perf_event_open_nonverbose$(EXEEXT) \
+ oldselect-efault-P$(EXEEXT) orphaned_process_group$(EXEEXT) \
+ pc$(EXEEXT) perf_event_open_nonverbose$(EXEEXT) \
perf_event_open_unabbrev$(EXEEXT) ppoll-v$(EXEEXT) \
prctl-seccomp-filter-v$(EXEEXT) prctl-seccomp-strict$(EXEEXT) \
prctl-spec-inject$(EXEEXT) print_maxfd$(EXEEXT) \
@@ -1743,6 +1743,10 @@
openat_OBJECTS = openat.$(OBJEXT)
openat_LDADD = $(LDADD)
openat_DEPENDENCIES = libtests.a
+orphaned_process_group_SOURCES = orphaned_process_group.c
+orphaned_process_group_OBJECTS = orphaned_process_group.$(OBJEXT)
+orphaned_process_group_LDADD = $(LDADD)
+orphaned_process_group_DEPENDENCIES = libtests.a
osf_utimes_SOURCES = osf_utimes.c
osf_utimes_OBJECTS = osf_utimes.$(OBJEXT)
osf_utimes_LDADD = $(LDADD)
@@ -2786,7 +2790,8 @@
old_mmap-P.c old_mmap-Xabbrev.c old_mmap-Xraw.c \
old_mmap-Xverbose.c old_mmap-v-none.c oldfstat.c oldlstat.c \
oldselect.c oldselect-P.c oldselect-efault.c \
- oldselect-efault-P.c oldstat.c open.c openat.c osf_utimes.c \
+ oldselect-efault-P.c oldstat.c open.c openat.c \
+ orphaned_process_group.c osf_utimes.c \
pause.c pc.c perf_event_open.c perf_event_open_nonverbose.c \
perf_event_open_unabbrev.c personality.c personality-Xabbrev.c \
personality-Xraw.c personality-Xverbose.c pipe.c pipe2.c \
@@ -2931,7 +2936,8 @@
old_mmap-P.c old_mmap-Xabbrev.c old_mmap-Xraw.c \
old_mmap-Xverbose.c old_mmap-v-none.c oldfstat.c oldlstat.c \
oldselect.c oldselect-P.c oldselect-efault.c \
- oldselect-efault-P.c oldstat.c open.c openat.c osf_utimes.c \
+ oldselect-efault-P.c oldstat.c open.c openat.c \
+ orphaned_process_group.c osf_utimes.c \
pause.c pc.c perf_event_open.c perf_event_open_nonverbose.c \
perf_event_open_unabbrev.c personality.c personality-Xabbrev.c \
personality-Xraw.c personality-Xverbose.c pipe.c pipe2.c \
@@ -4058,7 +4064,8 @@
oldselect.gen.test oldselect-P.gen.test \
oldselect-efault.gen.test oldselect-efault-P.gen.test \
oldstat.gen.test open.gen.test openat.gen.test \
- osf_utimes.gen.test pause.gen.test perf_event_open.gen.test \
+ orphaned_process_group.gen.test osf_utimes.gen.test \
+ pause.gen.test perf_event_open.gen.test \
perf_event_open_nonverbose.gen.test \
perf_event_open_unabbrev.gen.test personality-Xabbrev.gen.test \
personality-Xraw.gen.test personality-Xverbose.gen.test \
@@ -5752,6 +5759,10 @@
@rm -f openat$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(openat_OBJECTS) $(openat_LDADD) $(LIBS)
+orphaned_process_group$(EXEEXT): $(orphaned_process_group_OBJECTS) $(orphaned_process_group_DEPENDENCIES) $(EXTRA_orphaned_process_group_DEPENDENCIES)
+ @rm -f orphaned_process_group$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(orphaned_process_group_OBJECTS) $(orphaned_process_group_LDADD) $(LIBS)
+
osf_utimes$(EXEEXT): $(osf_utimes_OBJECTS) $(osf_utimes_DEPENDENCIES) $(EXTRA_osf_utimes_DEPENDENCIES)
@rm -f osf_utimes$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(osf_utimes_OBJECTS) $(osf_utimes_LDADD) $(LIBS)
@@ -7030,6 +7041,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oldstat.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/open.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orphaned_process_group.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/osf_utimes.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pause.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pc.Po@am__quote@
@@ -9128,6 +9140,9 @@
$(srcdir)/openat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
$(AM_V_GEN) $^ $@
+$(srcdir)/orphaned_process_group.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+ $(AM_V_GEN) $^ $@
+
$(srcdir)/osf_utimes.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
$(AM_V_GEN) $^ $@
Index: strace-4.24/tests-m32/Makefile.in
===================================================================
--- strace-4.24.orig/tests-m32/Makefile.in 2019-03-10 05:44:56.112091757 +0100
+++ strace-4.24/tests-m32/Makefile.in 2019-03-10 05:57:09.322749620 +0100
@@ -161,8 +161,8 @@
net-tpacket_stats-success$(EXEEXT) netlink_inet_diag$(EXEEXT) \
netlink_netlink_diag$(EXEEXT) netlink_unix_diag$(EXEEXT) \
nsyscalls$(EXEEXT) nsyscalls-d$(EXEEXT) oldselect-P$(EXEEXT) \
- oldselect-efault-P$(EXEEXT) pc$(EXEEXT) \
- perf_event_open_nonverbose$(EXEEXT) \
+ oldselect-efault-P$(EXEEXT) orphaned_process_group$(EXEEXT) \
+ pc$(EXEEXT) perf_event_open_nonverbose$(EXEEXT) \
perf_event_open_unabbrev$(EXEEXT) ppoll-v$(EXEEXT) \
prctl-seccomp-filter-v$(EXEEXT) prctl-seccomp-strict$(EXEEXT) \
prctl-spec-inject$(EXEEXT) print_maxfd$(EXEEXT) \
@@ -1743,6 +1743,10 @@
openat_OBJECTS = openat.$(OBJEXT)
openat_LDADD = $(LDADD)
openat_DEPENDENCIES = libtests.a
+orphaned_process_group_SOURCES = orphaned_process_group.c
+orphaned_process_group_OBJECTS = orphaned_process_group.$(OBJEXT)
+orphaned_process_group_LDADD = $(LDADD)
+orphaned_process_group_DEPENDENCIES = libtests.a
osf_utimes_SOURCES = osf_utimes.c
osf_utimes_OBJECTS = osf_utimes.$(OBJEXT)
osf_utimes_LDADD = $(LDADD)
@@ -2786,7 +2790,8 @@
old_mmap-P.c old_mmap-Xabbrev.c old_mmap-Xraw.c \
old_mmap-Xverbose.c old_mmap-v-none.c oldfstat.c oldlstat.c \
oldselect.c oldselect-P.c oldselect-efault.c \
- oldselect-efault-P.c oldstat.c open.c openat.c osf_utimes.c \
+ oldselect-efault-P.c oldstat.c open.c openat.c \
+ orphaned_process_group.c osf_utimes.c \
pause.c pc.c perf_event_open.c perf_event_open_nonverbose.c \
perf_event_open_unabbrev.c personality.c personality-Xabbrev.c \
personality-Xraw.c personality-Xverbose.c pipe.c pipe2.c \
@@ -2931,7 +2936,8 @@
old_mmap-P.c old_mmap-Xabbrev.c old_mmap-Xraw.c \
old_mmap-Xverbose.c old_mmap-v-none.c oldfstat.c oldlstat.c \
oldselect.c oldselect-P.c oldselect-efault.c \
- oldselect-efault-P.c oldstat.c open.c openat.c osf_utimes.c \
+ oldselect-efault-P.c oldstat.c open.c openat.c \
+ orphaned_process_group.c osf_utimes.c \
pause.c pc.c perf_event_open.c perf_event_open_nonverbose.c \
perf_event_open_unabbrev.c personality.c personality-Xabbrev.c \
personality-Xraw.c personality-Xverbose.c pipe.c pipe2.c \
@@ -4058,7 +4064,8 @@
oldselect.gen.test oldselect-P.gen.test \
oldselect-efault.gen.test oldselect-efault-P.gen.test \
oldstat.gen.test open.gen.test openat.gen.test \
- osf_utimes.gen.test pause.gen.test perf_event_open.gen.test \
+ orphaned_process_group.gen.test osf_utimes.gen.test \
+ pause.gen.test perf_event_open.gen.test \
perf_event_open_nonverbose.gen.test \
perf_event_open_unabbrev.gen.test personality-Xabbrev.gen.test \
personality-Xraw.gen.test personality-Xverbose.gen.test \
@@ -5752,6 +5759,10 @@
@rm -f openat$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(openat_OBJECTS) $(openat_LDADD) $(LIBS)
+orphaned_process_group$(EXEEXT): $(orphaned_process_group_OBJECTS) $(orphaned_process_group_DEPENDENCIES) $(EXTRA_orphaned_process_group_DEPENDENCIES)
+ @rm -f orphaned_process_group$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(orphaned_process_group_OBJECTS) $(orphaned_process_group_LDADD) $(LIBS)
+
osf_utimes$(EXEEXT): $(osf_utimes_OBJECTS) $(osf_utimes_DEPENDENCIES) $(EXTRA_osf_utimes_DEPENDENCIES)
@rm -f osf_utimes$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(osf_utimes_OBJECTS) $(osf_utimes_LDADD) $(LIBS)
@@ -7030,6 +7041,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oldstat.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/open.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orphaned_process_group.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/osf_utimes.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pause.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pc.Po@am__quote@
@@ -9128,6 +9140,9 @@
$(srcdir)/openat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
$(AM_V_GEN) $^ $@
+$(srcdir)/orphaned_process_group.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+ $(AM_V_GEN) $^ $@
+
$(srcdir)/osf_utimes.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
$(AM_V_GEN) $^ $@
Index: strace-4.24/tests-mx32/Makefile.in
===================================================================
--- strace-4.24.orig/tests-mx32/Makefile.in 2019-03-10 05:45:49.892553217 +0100
+++ strace-4.24/tests-mx32/Makefile.in 2019-03-10 05:57:19.939643305 +0100
@@ -161,8 +161,8 @@
net-tpacket_stats-success$(EXEEXT) netlink_inet_diag$(EXEEXT) \
netlink_netlink_diag$(EXEEXT) netlink_unix_diag$(EXEEXT) \
nsyscalls$(EXEEXT) nsyscalls-d$(EXEEXT) oldselect-P$(EXEEXT) \
- oldselect-efault-P$(EXEEXT) pc$(EXEEXT) \
- perf_event_open_nonverbose$(EXEEXT) \
+ oldselect-efault-P$(EXEEXT) orphaned_process_group$(EXEEXT) \
+ pc$(EXEEXT) perf_event_open_nonverbose$(EXEEXT) \
perf_event_open_unabbrev$(EXEEXT) ppoll-v$(EXEEXT) \
prctl-seccomp-filter-v$(EXEEXT) prctl-seccomp-strict$(EXEEXT) \
prctl-spec-inject$(EXEEXT) print_maxfd$(EXEEXT) \
@@ -1743,6 +1743,10 @@
openat_OBJECTS = openat.$(OBJEXT)
openat_LDADD = $(LDADD)
openat_DEPENDENCIES = libtests.a
+orphaned_process_group_SOURCES = orphaned_process_group.c
+orphaned_process_group_OBJECTS = orphaned_process_group.$(OBJEXT)
+orphaned_process_group_LDADD = $(LDADD)
+orphaned_process_group_DEPENDENCIES = libtests.a
osf_utimes_SOURCES = osf_utimes.c
osf_utimes_OBJECTS = osf_utimes.$(OBJEXT)
osf_utimes_LDADD = $(LDADD)
@@ -2786,7 +2790,8 @@
old_mmap-P.c old_mmap-Xabbrev.c old_mmap-Xraw.c \
old_mmap-Xverbose.c old_mmap-v-none.c oldfstat.c oldlstat.c \
oldselect.c oldselect-P.c oldselect-efault.c \
- oldselect-efault-P.c oldstat.c open.c openat.c osf_utimes.c \
+ oldselect-efault-P.c oldstat.c open.c openat.c \
+ orphaned_process_group.c osf_utimes.c \
pause.c pc.c perf_event_open.c perf_event_open_nonverbose.c \
perf_event_open_unabbrev.c personality.c personality-Xabbrev.c \
personality-Xraw.c personality-Xverbose.c pipe.c pipe2.c \
@@ -2931,7 +2936,8 @@
old_mmap-P.c old_mmap-Xabbrev.c old_mmap-Xraw.c \
old_mmap-Xverbose.c old_mmap-v-none.c oldfstat.c oldlstat.c \
oldselect.c oldselect-P.c oldselect-efault.c \
- oldselect-efault-P.c oldstat.c open.c openat.c osf_utimes.c \
+ oldselect-efault-P.c oldstat.c open.c openat.c \
+ orphaned_process_group.c osf_utimes.c \
pause.c pc.c perf_event_open.c perf_event_open_nonverbose.c \
perf_event_open_unabbrev.c personality.c personality-Xabbrev.c \
personality-Xraw.c personality-Xverbose.c pipe.c pipe2.c \
@@ -4058,7 +4064,8 @@
oldselect.gen.test oldselect-P.gen.test \
oldselect-efault.gen.test oldselect-efault-P.gen.test \
oldstat.gen.test open.gen.test openat.gen.test \
- osf_utimes.gen.test pause.gen.test perf_event_open.gen.test \
+ orphaned_process_group.gen.test osf_utimes.gen.test \
+ pause.gen.test perf_event_open.gen.test \
perf_event_open_nonverbose.gen.test \
perf_event_open_unabbrev.gen.test personality-Xabbrev.gen.test \
personality-Xraw.gen.test personality-Xverbose.gen.test \
@@ -5752,6 +5759,10 @@
@rm -f openat$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(openat_OBJECTS) $(openat_LDADD) $(LIBS)
+orphaned_process_group$(EXEEXT): $(orphaned_process_group_OBJECTS) $(orphaned_process_group_DEPENDENCIES) $(EXTRA_orphaned_process_group_DEPENDENCIES)
+ @rm -f orphaned_process_group$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(orphaned_process_group_OBJECTS) $(orphaned_process_group_LDADD) $(LIBS)
+
osf_utimes$(EXEEXT): $(osf_utimes_OBJECTS) $(osf_utimes_DEPENDENCIES) $(EXTRA_osf_utimes_DEPENDENCIES)
@rm -f osf_utimes$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(osf_utimes_OBJECTS) $(osf_utimes_LDADD) $(LIBS)
@@ -7030,6 +7041,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oldstat.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/open.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orphaned_process_group.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/osf_utimes.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pause.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pc.Po@am__quote@
@@ -9128,6 +9140,9 @@
$(srcdir)/openat.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
$(AM_V_GEN) $^ $@
+$(srcdir)/orphaned_process_group.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
+ $(AM_V_GEN) $^ $@
+
$(srcdir)/osf_utimes.gen.test: $(abs_srcdir)/gen_tests.sh $(srcdir)/gen_tests.in
$(AM_V_GEN) $^ $@
Index: strace-4.24/tests-m32/orphaned_process_group.gen.test
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests-m32/orphaned_process_group.gen.test 2019-03-10 05:59:50.567134970 +0100
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (orphaned_process_group . "${srcdir=.}/PTRACE_SEIZE.sh"; run_strace_match_diff -f -e trace=none -e signal='!chld'); do not edit.
+. "${srcdir=.}/init.sh"
+. "${srcdir=.}/PTRACE_SEIZE.sh"; run_strace_match_diff -f -e trace=none -e signal='!chld'
Index: strace-4.24/tests-mx32/orphaned_process_group.gen.test
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests-mx32/orphaned_process_group.gen.test 2019-03-10 05:59:51.671123915 +0100
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (orphaned_process_group . "${srcdir=.}/PTRACE_SEIZE.sh"; run_strace_match_diff -f -e trace=none -e signal='!chld'); do not edit.
+. "${srcdir=.}/init.sh"
+. "${srcdir=.}/PTRACE_SEIZE.sh"; run_strace_match_diff -f -e trace=none -e signal='!chld'
Index: strace-4.24/tests/orphaned_process_group.gen.test
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests/orphaned_process_group.gen.test 2019-03-10 05:59:48.722153445 +0100
@@ -0,0 +1,4 @@
+#!/bin/sh -efu
+# Generated by ./tests/gen_tests.sh from ./tests/gen_tests.in (orphaned_process_group . "${srcdir=.}/PTRACE_SEIZE.sh"; run_strace_match_diff -f -e trace=none -e signal='!chld'); do not edit.
+. "${srcdir=.}/init.sh"
+. "${srcdir=.}/PTRACE_SEIZE.sh"; run_strace_match_diff -f -e trace=none -e signal='!chld'
Index: strace-4.24/tests-m32/gen_tests.in
===================================================================
--- strace-4.24.orig/tests-m32/gen_tests.in 2018-08-01 16:57:16.000000000 +0200
+++ strace-4.24/tests-m32/gen_tests.in 2019-03-10 06:00:59.151448188 +0100
@@ -3,27 +3,7 @@
# Copyright (c) 2017-2018 The strace developers.
# All rights reserved.
#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. The name of the author may not be used to endorse or promote products
-# derived from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# SPDX-License-Identifier: GPL-2.0-or-later
_newselect
_newselect-P -e trace=_newselect -P /dev/full 9>>/dev/full
@@ -307,6 +287,7 @@
oldstat -a32 -v -P stat.sample -P /dev/full
open -a30 -P $NAME.sample
openat -a36 -P $NAME.sample
+orphaned_process_group . "${srcdir=.}/PTRACE_SEIZE.sh"; run_strace_match_diff -f -e trace=none -e signal='!chld'
osf_utimes -a21
pause -a8 -esignal=none
perf_event_open -a1
Index: strace-4.24/tests-mx32/gen_tests.in
===================================================================
--- strace-4.24.orig/tests-mx32/gen_tests.in 2018-08-01 16:57:16.000000000 +0200
+++ strace-4.24/tests-mx32/gen_tests.in 2019-03-10 06:01:00.297436713 +0100
@@ -3,27 +3,7 @@
# Copyright (c) 2017-2018 The strace developers.
# All rights reserved.
#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. The name of the author may not be used to endorse or promote products
-# derived from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# SPDX-License-Identifier: GPL-2.0-or-later
_newselect
_newselect-P -e trace=_newselect -P /dev/full 9>>/dev/full
@@ -307,6 +287,7 @@
oldstat -a32 -v -P stat.sample -P /dev/full
open -a30 -P $NAME.sample
openat -a36 -P $NAME.sample
+orphaned_process_group . "${srcdir=.}/PTRACE_SEIZE.sh"; run_strace_match_diff -f -e trace=none -e signal='!chld'
osf_utimes -a21
pause -a8 -esignal=none
perf_event_open -a1

View File

@ -0,0 +1,874 @@
From 1fc4e011bb0d977b64385e5dff91620c42985bcf Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Wed, 4 Jul 2018 02:11:27 +0000
Subject: [PATCH 25/27] tests: check tracing of looping threads
* test/many_looping_threads.c: Remove.
* test/.gitignore: Remove many_looping_threads.
* test/Makefile (PROGS): Likewise.
(many_looping_threads): Remove.
* tests/looping_threads.c: New file.
* tests/looping_threads.test: New test.
* tests/.gitignore: Add looping_threads.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(looping_threads_LDADD): New variable.
(MISC_TESTS, XFAIL_TESTS): Add looping_threads.test.
Conflicts:
tests/Makefile.am
Skipped files (not present in the tarball):
test/.gitignore
test/Makefile
test/many_looping_threads.c
tests/.gitignore
Additional changes:
tests/Makefile.in (generated from tests/Makefile.am)
tests-m32/Makefile.in (generated from tests-m32/Makefile.am)
tests-m32/looping_threads.c (copy of tests/looping_threads.c)
tests-m32/looping_threads.test (copy of tests/looping_threads.test)
tests-mx32/Makefile.in (generated from tests-mx32/Makefile.am)
tests-mx32/looping_threads.c (copy of tests/looping_threads.c)
tests-mx32/looping_threads.test (copy of tests/looping_threads.test)
---
test/.gitignore | 1 -
test/Makefile | 5 +-
test/many_looping_threads.c | 49 ------------------
tests/.gitignore | 1 +
tests/Makefile.am | 6 ++-
tests/looping_threads.c | 121 ++++++++++++++++++++++++++++++++++++++++++++
tests/looping_threads.test | 38 ++++++++++++++
7 files changed, 166 insertions(+), 55 deletions(-)
delete mode 100644 test/many_looping_threads.c
create mode 100644 tests/looping_threads.c
create mode 100755 tests/looping_threads.test
Index: strace-4.24/tests/Makefile.am
===================================================================
--- strace-4.24.orig/tests/Makefile.am 2020-01-27 17:41:26.653586903 +0100
+++ strace-4.24/tests/Makefile.am 2020-01-27 20:17:51.315382082 +0100
@@ -108,6 +108,7 @@
ksysent \
list_sigaction_signum \
localtime \
+ looping_threads \
mmsg-silent \
mmsg_name-v \
msg_control-v \
@@ -172,6 +173,7 @@
fstatat64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
ftruncate64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
localtime_LDADD = $(clock_LIBS) $(LDADD)
+looping_threads_LDADD = -lpthread $(LDADD)
lstat64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
mmap64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
mmap64_Xabbrev_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
@@ -304,6 +306,7 @@
kill_child.test \
ksysent.test \
localtime.test \
+ looping_threads.test \
opipe.test \
options-syntax.test \
pc.test \
@@ -347,7 +350,8 @@
XFAIL_TESTS_mx32 = $(STACKTRACE_TESTS)
XFAIL_TESTS_x86_64 = int_0x80.gen.test
XFAIL_TESTS_x32 = int_0x80.gen.test
-XFAIL_TESTS = $(XFAIL_TESTS_$(MPERS_NAME)) $(XFAIL_TESTS_$(ARCH))
+XFAIL_TESTS = $(XFAIL_TESTS_$(MPERS_NAME)) $(XFAIL_TESTS_$(ARCH)) \
+ looping_threads.test
TEST_LOG_COMPILER = env
AM_TEST_LOG_FLAGS = STRACE_ARCH=$(ARCH) STRACE_NATIVE_ARCH=$(NATIVE_ARCH) \
Index: strace-4.24/tests/looping_threads.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests/looping_threads.c 2020-01-27 17:41:26.671586776 +0100
@@ -0,0 +1,121 @@
+/*
+ * Check tracing of looping threads.
+ *
+ * Copyright (c) 2009-2019 The strace developers.
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "tests.h"
+#include <assert.h>
+#include <errno.h>
+#include <pthread.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/wait.h>
+
+static void *
+thread(void *arg)
+{
+ for (;;)
+ getuid();
+ return arg;
+}
+
+int
+main(int ac, const char *av[])
+{
+ assert(ac == 3);
+
+ int timeout = atoi(av[1]);
+ assert(timeout > 0);
+
+ int num_threads = atoi(av[2]);
+ assert(num_threads > 0);
+
+ /*
+ * Unblock all signals.
+ */
+ static sigset_t mask;
+ if (sigprocmask(SIG_SETMASK, &mask, NULL))
+ perror_msg_and_fail("sigprocmask");
+
+ /*
+ * Reset SIGALRM and SIGHUP signal handlers.
+ */
+ static const struct sigaction sa_def = { .sa_handler = SIG_DFL };
+ if (sigaction(SIGHUP, &sa_def, NULL))
+ perror_msg_and_fail("sigaction SIGHUP");
+ if (sigaction(SIGALRM, &sa_def, NULL))
+ perror_msg_and_fail("sigaction SIGALRM");
+
+ /*
+ * Create a new process group.
+ */
+ if (setpgid(0, 0))
+ perror_msg_and_fail("setpgid");
+
+ /*
+ * Set an alarm clock.
+ */
+ alarm(timeout);
+
+ /*
+ * When the main process terminates, the process group becomes orphaned.
+ * If any member of the orphaned process group is stopped, then
+ * a SIGHUP signal followed by a SIGCONT signal is sent to each process
+ * in the orphaned process group.
+ * Create a process in a stopped state to activate this behaviour.
+ */
+ const pid_t stopped = fork();
+ if (stopped < 0)
+ perror_msg_and_fail("fork");
+ if (!stopped) {
+ raise(SIGSTOP);
+ _exit(0);
+ }
+
+ /*
+ * Wait for the process to stop.
+ */
+ int status;
+ if (waitpid(stopped, &status, WUNTRACED) != stopped)
+ perror_msg_and_fail("waitpid WUNTRACED");
+ if (!WIFSTOPPED(status) || WSTOPSIG(status) != SIGSTOP)
+ error_msg_and_fail("waitpid WUNTRACED: "
+ "unexpected wait status %d", status);
+ /*
+ * Create all threads in a subprocess, this guarantees that
+ * their tracer will not be their parent.
+ */
+ pid_t pid = fork();
+ if (pid < 0)
+ perror_msg_and_fail("fork");
+ if (!pid) {
+ for (int i = 0; i < num_threads; i++) {
+ pthread_t t;
+ if ((errno = pthread_create(&t, NULL, thread, NULL))) {
+ if (EAGAIN == errno)
+ break;
+ perror_msg_and_fail("pthread_create #%d", i);
+ }
+ }
+
+ /* This terminates all threads created above. */
+ _exit(0);
+ }
+
+ if (waitpid(pid, &status, 0) != pid)
+ perror_msg_and_fail("waitpid");
+ if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
+ error_msg_and_fail("waitpid: unexpected wait status %d",
+ status);
+
+ /*
+ * Make the process group orphaned.
+ */
+ return 0;
+}
Index: strace-4.24/tests/looping_threads.test
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests/looping_threads.test 2020-01-27 17:41:26.671586776 +0100
@@ -0,0 +1,38 @@
+#!/bin/sh
+#
+# Check tracing of looping threads.
+#
+# Copyright (c) 2009-2019 The strace developers.
+# All rights reserved.
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+. "${srcdir=.}/init.sh"
+. "${srcdir=.}/PTRACE_SEIZE.sh"
+
+run_prog ../orphaned_process_group > /dev/null
+
+run_prog_skip_if_failed date +%s > /dev/null
+s0="$(date +%s)"
+
+check_prog nproc
+inc="$(nproc)"
+[ "$inc" -ge 1 ] || inc=1
+
+timeout_2="$(($TIMEOUT_DURATION/2))"
+timeout_8="$(($TIMEOUT_DURATION/8))"
+nproc=1
+
+run_prog "../$NAME" "$timeout_8" "$nproc"
+
+while :; do
+ run_strace -f -qq -enone -esignal=none "../$NAME" "$timeout_2" "$nproc"
+
+ s1="$(date +%s)"
+ [ "$(($s1-$s0))" -lt "$timeout_8" ] ||
+ break
+
+ nproc="$(($nproc+$inc))"
+done
+
+warn_ "$ME_: nproc=$nproc elapsed=$(($s1-$s0))"
Index: strace-4.24/tests-m32/looping_threads.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests-m32/looping_threads.c 2020-01-27 17:41:26.671586776 +0100
@@ -0,0 +1,121 @@
+/*
+ * Check tracing of looping threads.
+ *
+ * Copyright (c) 2009-2019 The strace developers.
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "tests.h"
+#include <assert.h>
+#include <errno.h>
+#include <pthread.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/wait.h>
+
+static void *
+thread(void *arg)
+{
+ for (;;)
+ getuid();
+ return arg;
+}
+
+int
+main(int ac, const char *av[])
+{
+ assert(ac == 3);
+
+ int timeout = atoi(av[1]);
+ assert(timeout > 0);
+
+ int num_threads = atoi(av[2]);
+ assert(num_threads > 0);
+
+ /*
+ * Unblock all signals.
+ */
+ static sigset_t mask;
+ if (sigprocmask(SIG_SETMASK, &mask, NULL))
+ perror_msg_and_fail("sigprocmask");
+
+ /*
+ * Reset SIGALRM and SIGHUP signal handlers.
+ */
+ static const struct sigaction sa_def = { .sa_handler = SIG_DFL };
+ if (sigaction(SIGHUP, &sa_def, NULL))
+ perror_msg_and_fail("sigaction SIGHUP");
+ if (sigaction(SIGALRM, &sa_def, NULL))
+ perror_msg_and_fail("sigaction SIGALRM");
+
+ /*
+ * Create a new process group.
+ */
+ if (setpgid(0, 0))
+ perror_msg_and_fail("setpgid");
+
+ /*
+ * Set an alarm clock.
+ */
+ alarm(timeout);
+
+ /*
+ * When the main process terminates, the process group becomes orphaned.
+ * If any member of the orphaned process group is stopped, then
+ * a SIGHUP signal followed by a SIGCONT signal is sent to each process
+ * in the orphaned process group.
+ * Create a process in a stopped state to activate this behaviour.
+ */
+ const pid_t stopped = fork();
+ if (stopped < 0)
+ perror_msg_and_fail("fork");
+ if (!stopped) {
+ raise(SIGSTOP);
+ _exit(0);
+ }
+
+ /*
+ * Wait for the process to stop.
+ */
+ int status;
+ if (waitpid(stopped, &status, WUNTRACED) != stopped)
+ perror_msg_and_fail("waitpid WUNTRACED");
+ if (!WIFSTOPPED(status) || WSTOPSIG(status) != SIGSTOP)
+ error_msg_and_fail("waitpid WUNTRACED: "
+ "unexpected wait status %d", status);
+ /*
+ * Create all threads in a subprocess, this guarantees that
+ * their tracer will not be their parent.
+ */
+ pid_t pid = fork();
+ if (pid < 0)
+ perror_msg_and_fail("fork");
+ if (!pid) {
+ for (int i = 0; i < num_threads; i++) {
+ pthread_t t;
+ if ((errno = pthread_create(&t, NULL, thread, NULL))) {
+ if (EAGAIN == errno)
+ break;
+ perror_msg_and_fail("pthread_create #%d", i);
+ }
+ }
+
+ /* This terminates all threads created above. */
+ _exit(0);
+ }
+
+ if (waitpid(pid, &status, 0) != pid)
+ perror_msg_and_fail("waitpid");
+ if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
+ error_msg_and_fail("waitpid: unexpected wait status %d",
+ status);
+
+ /*
+ * Make the process group orphaned.
+ */
+ return 0;
+}
Index: strace-4.24/tests-mx32/looping_threads.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests-mx32/looping_threads.c 2020-01-27 17:41:26.671586776 +0100
@@ -0,0 +1,121 @@
+/*
+ * Check tracing of looping threads.
+ *
+ * Copyright (c) 2009-2019 The strace developers.
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "tests.h"
+#include <assert.h>
+#include <errno.h>
+#include <pthread.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/wait.h>
+
+static void *
+thread(void *arg)
+{
+ for (;;)
+ getuid();
+ return arg;
+}
+
+int
+main(int ac, const char *av[])
+{
+ assert(ac == 3);
+
+ int timeout = atoi(av[1]);
+ assert(timeout > 0);
+
+ int num_threads = atoi(av[2]);
+ assert(num_threads > 0);
+
+ /*
+ * Unblock all signals.
+ */
+ static sigset_t mask;
+ if (sigprocmask(SIG_SETMASK, &mask, NULL))
+ perror_msg_and_fail("sigprocmask");
+
+ /*
+ * Reset SIGALRM and SIGHUP signal handlers.
+ */
+ static const struct sigaction sa_def = { .sa_handler = SIG_DFL };
+ if (sigaction(SIGHUP, &sa_def, NULL))
+ perror_msg_and_fail("sigaction SIGHUP");
+ if (sigaction(SIGALRM, &sa_def, NULL))
+ perror_msg_and_fail("sigaction SIGALRM");
+
+ /*
+ * Create a new process group.
+ */
+ if (setpgid(0, 0))
+ perror_msg_and_fail("setpgid");
+
+ /*
+ * Set an alarm clock.
+ */
+ alarm(timeout);
+
+ /*
+ * When the main process terminates, the process group becomes orphaned.
+ * If any member of the orphaned process group is stopped, then
+ * a SIGHUP signal followed by a SIGCONT signal is sent to each process
+ * in the orphaned process group.
+ * Create a process in a stopped state to activate this behaviour.
+ */
+ const pid_t stopped = fork();
+ if (stopped < 0)
+ perror_msg_and_fail("fork");
+ if (!stopped) {
+ raise(SIGSTOP);
+ _exit(0);
+ }
+
+ /*
+ * Wait for the process to stop.
+ */
+ int status;
+ if (waitpid(stopped, &status, WUNTRACED) != stopped)
+ perror_msg_and_fail("waitpid WUNTRACED");
+ if (!WIFSTOPPED(status) || WSTOPSIG(status) != SIGSTOP)
+ error_msg_and_fail("waitpid WUNTRACED: "
+ "unexpected wait status %d", status);
+ /*
+ * Create all threads in a subprocess, this guarantees that
+ * their tracer will not be their parent.
+ */
+ pid_t pid = fork();
+ if (pid < 0)
+ perror_msg_and_fail("fork");
+ if (!pid) {
+ for (int i = 0; i < num_threads; i++) {
+ pthread_t t;
+ if ((errno = pthread_create(&t, NULL, thread, NULL))) {
+ if (EAGAIN == errno)
+ break;
+ perror_msg_and_fail("pthread_create #%d", i);
+ }
+ }
+
+ /* This terminates all threads created above. */
+ _exit(0);
+ }
+
+ if (waitpid(pid, &status, 0) != pid)
+ perror_msg_and_fail("waitpid");
+ if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
+ error_msg_and_fail("waitpid: unexpected wait status %d",
+ status);
+
+ /*
+ * Make the process group orphaned.
+ */
+ return 0;
+}
Index: strace-4.24/tests/Makefile.in
===================================================================
--- strace-4.24.orig/tests/Makefile.in 2020-01-27 17:41:26.655586889 +0100
+++ strace-4.24/tests/Makefile.in 2020-01-27 20:17:47.817414191 +0100
@@ -155,7 +155,7 @@
ioctl_perf-success$(EXEEXT) ioctl_rtc-v$(EXEEXT) \
is_linux_mips_n64$(EXEEXT) kill_child$(EXEEXT) \
ksysent$(EXEEXT) list_sigaction_signum$(EXEEXT) \
- localtime$(EXEEXT) \
+ localtime$(EXEEXT) looping_threads$(EXEEXT) \
mmsg-silent$(EXEEXT) mmsg_name-v$(EXEEXT) \
msg_control-v$(EXEEXT) net-accept-connect$(EXEEXT) \
net-tpacket_stats-success$(EXEEXT) netlink_inet_diag$(EXEEXT) \
@@ -1226,6 +1226,9 @@
lookup_dcookie_OBJECTS = lookup_dcookie.$(OBJEXT)
lookup_dcookie_LDADD = $(LDADD)
lookup_dcookie_DEPENDENCIES = libtests.a
+looping_threads_SOURCES = looping_threads.c
+looping_threads_OBJECTS = looping_threads.$(OBJEXT)
+looping_threads_DEPENDENCIES = $(LDADD)
lseek_SOURCES = lseek.c
lseek_OBJECTS = lseek.$(OBJEXT)
lseek_LDADD = $(LDADD)
@@ -2752,11 +2755,12 @@
kexec_file_load.c kexec_load.c keyctl.c keyctl-Xabbrev.c \
keyctl-Xraw.c keyctl-Xverbose.c kill.c kill_child.c ksysent.c \
lchown.c lchown32.c link.c linkat.c list_sigaction_signum.c \
- llseek.c localtime.c lookup_dcookie.c lseek.c lstat.c lstat64.c \
- madvise.c mbind.c membarrier.c memfd_create.c migrate_pages.c \
- mincore.c mkdir.c mkdirat.c mknod.c mknodat.c mlock.c mlock2.c \
- mlockall.c mmap.c mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c \
- mmap64.c mmap64-Xabbrev.c mmap64-Xraw.c mmap64-Xverbose.c \
+ llseek.c localtime.c lookup_dcookie.c looping_threads.c \
+ lseek.c lstat.c lstat64.c madvise.c mbind.c membarrier.c \
+ memfd_create.c migrate_pages.c mincore.c mkdir.c mkdirat.c \
+ mknod.c mknodat.c mlock.c mlock2.c mlockall.c mmap.c \
+ mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c mmap64.c \
+ mmap64-Xabbrev.c mmap64-Xraw.c mmap64-Xverbose.c \
mmsg.c mmsg-silent.c mmsg_name.c mmsg_name-v.c modify_ldt.c \
mount.c mount-Xabbrev.c mount-Xraw.c mount-Xverbose.c \
move_pages.c mq.c mq_sendrecv.c mq_sendrecv-read.c \
@@ -2898,11 +2902,12 @@
kexec_file_load.c kexec_load.c keyctl.c keyctl-Xabbrev.c \
keyctl-Xraw.c keyctl-Xverbose.c kill.c kill_child.c ksysent.c \
lchown.c lchown32.c link.c linkat.c list_sigaction_signum.c \
- llseek.c localtime.c lookup_dcookie.c lseek.c lstat.c lstat64.c \
- madvise.c mbind.c membarrier.c memfd_create.c migrate_pages.c \
- mincore.c mkdir.c mkdirat.c mknod.c mknodat.c mlock.c mlock2.c \
- mlockall.c mmap.c mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c \
- mmap64.c mmap64-Xabbrev.c mmap64-Xraw.c mmap64-Xverbose.c \
+ llseek.c localtime.c lookup_dcookie.c looping_threads.c \
+ lseek.c lstat.c lstat64.c madvise.c mbind.c membarrier.c \
+ memfd_create.c migrate_pages.c mincore.c mkdir.c mkdirat.c \
+ mknod.c mknodat.c mlock.c mlock2.c mlockall.c mmap.c \
+ mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c mmap64.c \
+ mmap64-Xabbrev.c mmap64-Xraw.c mmap64-Xverbose.c \
mmsg.c mmsg-silent.c mmsg_name.c mmsg_name-v.c modify_ldt.c \
mount.c mount-Xabbrev.c mount-Xraw.c mount-Xverbose.c \
move_pages.c mq.c mq_sendrecv.c mq_sendrecv-read.c \
@@ -3922,6 +3927,7 @@
fstatat64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
ftruncate64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
localtime_LDADD = $(clock_LIBS) $(LDADD)
+looping_threads_LDADD = -lpthread $(LDADD)
lstat64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
mmap64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
mmap64_Xabbrev_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
@@ -4242,6 +4248,7 @@
kill_child.test \
ksysent.test \
localtime.test \
+ looping_threads.test \
opipe.test \
options-syntax.test \
pc.test \
@@ -5243,6 +5250,10 @@
@rm -f lookup_dcookie$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(lookup_dcookie_OBJECTS) $(lookup_dcookie_LDADD) $(LIBS)
+looping_threads$(EXEEXT): $(looping_threads_OBJECTS) $(looping_threads_DEPENDENCIES) $(EXTRA_looping_threads_DEPENDENCIES)
+ @rm -f looping_threads$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(looping_threads_OBJECTS) $(looping_threads_LDADD) $(LIBS)
+
lseek$(EXEEXT): $(lseek_OBJECTS) $(lseek_DEPENDENCIES) $(EXTRA_lseek_DEPENDENCIES)
@rm -f lseek$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(lseek_OBJECTS) $(lseek_LDADD) $(LIBS)
@@ -6912,6 +6923,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/llseek.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/localtime.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lookup_dcookie.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/looping_threads.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lseek.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lstat.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lstat64-lstat64.Po@am__quote@
Index: strace-4.24/tests-m32/Makefile.in
===================================================================
--- strace-4.24.orig/tests-m32/Makefile.in 2020-01-27 17:41:26.657586875 +0100
+++ strace-4.24/tests-m32/Makefile.in 2020-01-27 20:17:47.817414191 +0100
@@ -155,7 +155,7 @@
ioctl_perf-success$(EXEEXT) ioctl_rtc-v$(EXEEXT) \
is_linux_mips_n64$(EXEEXT) kill_child$(EXEEXT) \
ksysent$(EXEEXT) list_sigaction_signum$(EXEEXT) \
- localtime$(EXEEXT) \
+ localtime$(EXEEXT) looping_threads$(EXEEXT) \
mmsg-silent$(EXEEXT) mmsg_name-v$(EXEEXT) \
msg_control-v$(EXEEXT) net-accept-connect$(EXEEXT) \
net-tpacket_stats-success$(EXEEXT) netlink_inet_diag$(EXEEXT) \
@@ -1226,6 +1226,9 @@
lookup_dcookie_OBJECTS = lookup_dcookie.$(OBJEXT)
lookup_dcookie_LDADD = $(LDADD)
lookup_dcookie_DEPENDENCIES = libtests.a
+looping_threads_SOURCES = looping_threads.c
+looping_threads_OBJECTS = looping_threads.$(OBJEXT)
+looping_threads_DEPENDENCIES = $(LDADD)
lseek_SOURCES = lseek.c
lseek_OBJECTS = lseek.$(OBJEXT)
lseek_LDADD = $(LDADD)
@@ -2752,11 +2755,12 @@
kexec_file_load.c kexec_load.c keyctl.c keyctl-Xabbrev.c \
keyctl-Xraw.c keyctl-Xverbose.c kill.c kill_child.c ksysent.c \
lchown.c lchown32.c link.c linkat.c list_sigaction_signum.c \
- llseek.c localtime.c lookup_dcookie.c lseek.c lstat.c lstat64.c \
- madvise.c mbind.c membarrier.c memfd_create.c migrate_pages.c \
- mincore.c mkdir.c mkdirat.c mknod.c mknodat.c mlock.c mlock2.c \
- mlockall.c mmap.c mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c \
- mmap64.c mmap64-Xabbrev.c mmap64-Xraw.c mmap64-Xverbose.c \
+ llseek.c localtime.c lookup_dcookie.c looping_threads.c \
+ lseek.c lstat.c lstat64.c madvise.c mbind.c membarrier.c \
+ memfd_create.c migrate_pages.c mincore.c mkdir.c mkdirat.c \
+ mknod.c mknodat.c mlock.c mlock2.c mlockall.c mmap.c \
+ mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c mmap64.c \
+ mmap64-Xabbrev.c mmap64-Xraw.c mmap64-Xverbose.c \
mmsg.c mmsg-silent.c mmsg_name.c mmsg_name-v.c modify_ldt.c \
mount.c mount-Xabbrev.c mount-Xraw.c mount-Xverbose.c \
move_pages.c mq.c mq_sendrecv.c mq_sendrecv-read.c \
@@ -2898,11 +2902,12 @@
kexec_file_load.c kexec_load.c keyctl.c keyctl-Xabbrev.c \
keyctl-Xraw.c keyctl-Xverbose.c kill.c kill_child.c ksysent.c \
lchown.c lchown32.c link.c linkat.c list_sigaction_signum.c \
- llseek.c localtime.c lookup_dcookie.c lseek.c lstat.c lstat64.c \
- madvise.c mbind.c membarrier.c memfd_create.c migrate_pages.c \
- mincore.c mkdir.c mkdirat.c mknod.c mknodat.c mlock.c mlock2.c \
- mlockall.c mmap.c mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c \
- mmap64.c mmap64-Xabbrev.c mmap64-Xraw.c mmap64-Xverbose.c \
+ llseek.c localtime.c lookup_dcookie.c looping_threads.c \
+ lseek.c lstat.c lstat64.c madvise.c mbind.c membarrier.c \
+ memfd_create.c migrate_pages.c mincore.c mkdir.c mkdirat.c \
+ mknod.c mknodat.c mlock.c mlock2.c mlockall.c mmap.c \
+ mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c mmap64.c \
+ mmap64-Xabbrev.c mmap64-Xraw.c mmap64-Xverbose.c \
mmsg.c mmsg-silent.c mmsg_name.c mmsg_name-v.c modify_ldt.c \
mount.c mount-Xabbrev.c mount-Xraw.c mount-Xverbose.c \
move_pages.c mq.c mq_sendrecv.c mq_sendrecv-read.c \
@@ -3922,6 +3927,7 @@
fstatat64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
ftruncate64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
localtime_LDADD = $(clock_LIBS) $(LDADD)
+looping_threads_LDADD = -lpthread $(LDADD)
lstat64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
mmap64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
mmap64_Xabbrev_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
@@ -4242,6 +4248,7 @@
kill_child.test \
ksysent.test \
localtime.test \
+ looping_threads.test \
opipe.test \
options-syntax.test \
pc.test \
@@ -5243,6 +5250,10 @@
@rm -f lookup_dcookie$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(lookup_dcookie_OBJECTS) $(lookup_dcookie_LDADD) $(LIBS)
+looping_threads$(EXEEXT): $(looping_threads_OBJECTS) $(looping_threads_DEPENDENCIES) $(EXTRA_looping_threads_DEPENDENCIES)
+ @rm -f looping_threads$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(looping_threads_OBJECTS) $(looping_threads_LDADD) $(LIBS)
+
lseek$(EXEEXT): $(lseek_OBJECTS) $(lseek_DEPENDENCIES) $(EXTRA_lseek_DEPENDENCIES)
@rm -f lseek$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(lseek_OBJECTS) $(lseek_LDADD) $(LIBS)
@@ -6912,6 +6923,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/llseek.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/localtime.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lookup_dcookie.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/looping_threads.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lseek.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lstat.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lstat64-lstat64.Po@am__quote@
Index: strace-4.24/tests-mx32/Makefile.in
===================================================================
--- strace-4.24.orig/tests-mx32/Makefile.in 2020-01-27 17:41:26.658586868 +0100
+++ strace-4.24/tests-mx32/Makefile.in 2020-01-27 20:17:47.817414191 +0100
@@ -155,7 +155,7 @@
ioctl_perf-success$(EXEEXT) ioctl_rtc-v$(EXEEXT) \
is_linux_mips_n64$(EXEEXT) kill_child$(EXEEXT) \
ksysent$(EXEEXT) list_sigaction_signum$(EXEEXT) \
- localtime$(EXEEXT) \
+ localtime$(EXEEXT) looping_threads$(EXEEXT) \
mmsg-silent$(EXEEXT) mmsg_name-v$(EXEEXT) \
msg_control-v$(EXEEXT) net-accept-connect$(EXEEXT) \
net-tpacket_stats-success$(EXEEXT) netlink_inet_diag$(EXEEXT) \
@@ -1226,6 +1226,9 @@
lookup_dcookie_OBJECTS = lookup_dcookie.$(OBJEXT)
lookup_dcookie_LDADD = $(LDADD)
lookup_dcookie_DEPENDENCIES = libtests.a
+looping_threads_SOURCES = looping_threads.c
+looping_threads_OBJECTS = looping_threads.$(OBJEXT)
+looping_threads_DEPENDENCIES = $(LDADD)
lseek_SOURCES = lseek.c
lseek_OBJECTS = lseek.$(OBJEXT)
lseek_LDADD = $(LDADD)
@@ -2752,11 +2755,12 @@
kexec_file_load.c kexec_load.c keyctl.c keyctl-Xabbrev.c \
keyctl-Xraw.c keyctl-Xverbose.c kill.c kill_child.c ksysent.c \
lchown.c lchown32.c link.c linkat.c list_sigaction_signum.c \
- llseek.c localtime.c lookup_dcookie.c lseek.c lstat.c lstat64.c \
- madvise.c mbind.c membarrier.c memfd_create.c migrate_pages.c \
- mincore.c mkdir.c mkdirat.c mknod.c mknodat.c mlock.c mlock2.c \
- mlockall.c mmap.c mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c \
- mmap64.c mmap64-Xabbrev.c mmap64-Xraw.c mmap64-Xverbose.c \
+ llseek.c localtime.c lookup_dcookie.c looping_threads.c \
+ lseek.c lstat.c lstat64.c madvise.c mbind.c membarrier.c \
+ memfd_create.c migrate_pages.c mincore.c mkdir.c mkdirat.c \
+ mknod.c mknodat.c mlock.c mlock2.c mlockall.c mmap.c \
+ mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c mmap64.c \
+ mmap64-Xabbrev.c mmap64-Xraw.c mmap64-Xverbose.c \
mmsg.c mmsg-silent.c mmsg_name.c mmsg_name-v.c modify_ldt.c \
mount.c mount-Xabbrev.c mount-Xraw.c mount-Xverbose.c \
move_pages.c mq.c mq_sendrecv.c mq_sendrecv-read.c \
@@ -2898,11 +2902,12 @@
kexec_file_load.c kexec_load.c keyctl.c keyctl-Xabbrev.c \
keyctl-Xraw.c keyctl-Xverbose.c kill.c kill_child.c ksysent.c \
lchown.c lchown32.c link.c linkat.c list_sigaction_signum.c \
- llseek.c localtime.c lookup_dcookie.c lseek.c lstat.c lstat64.c \
- madvise.c mbind.c membarrier.c memfd_create.c migrate_pages.c \
- mincore.c mkdir.c mkdirat.c mknod.c mknodat.c mlock.c mlock2.c \
- mlockall.c mmap.c mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c \
- mmap64.c mmap64-Xabbrev.c mmap64-Xraw.c mmap64-Xverbose.c \
+ llseek.c localtime.c lookup_dcookie.c looping_threads.c \
+ lseek.c lstat.c lstat64.c madvise.c mbind.c membarrier.c \
+ memfd_create.c migrate_pages.c mincore.c mkdir.c mkdirat.c \
+ mknod.c mknodat.c mlock.c mlock2.c mlockall.c mmap.c \
+ mmap-Xabbrev.c mmap-Xraw.c mmap-Xverbose.c mmap64.c \
+ mmap64-Xabbrev.c mmap64-Xraw.c mmap64-Xverbose.c \
mmsg.c mmsg-silent.c mmsg_name.c mmsg_name-v.c modify_ldt.c \
mount.c mount-Xabbrev.c mount-Xraw.c mount-Xverbose.c \
move_pages.c mq.c mq_sendrecv.c mq_sendrecv-read.c \
@@ -3922,6 +3927,7 @@
fstatat64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
ftruncate64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
localtime_LDADD = $(clock_LIBS) $(LDADD)
+looping_threads_LDADD = -lpthread $(LDADD)
lstat64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
mmap64_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
mmap64_Xabbrev_CPPFLAGS = $(AM_CPPFLAGS) -D_FILE_OFFSET_BITS=64
@@ -4242,6 +4248,7 @@
kill_child.test \
ksysent.test \
localtime.test \
+ looping_threads.test \
opipe.test \
options-syntax.test \
pc.test \
@@ -5243,6 +5250,10 @@
@rm -f lookup_dcookie$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(lookup_dcookie_OBJECTS) $(lookup_dcookie_LDADD) $(LIBS)
+looping_threads$(EXEEXT): $(looping_threads_OBJECTS) $(looping_threads_DEPENDENCIES) $(EXTRA_looping_threads_DEPENDENCIES)
+ @rm -f looping_threads$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(looping_threads_OBJECTS) $(looping_threads_LDADD) $(LIBS)
+
lseek$(EXEEXT): $(lseek_OBJECTS) $(lseek_DEPENDENCIES) $(EXTRA_lseek_DEPENDENCIES)
@rm -f lseek$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(lseek_OBJECTS) $(lseek_LDADD) $(LIBS)
@@ -6912,6 +6923,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/llseek.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/localtime.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lookup_dcookie.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/looping_threads.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lseek.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lstat.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lstat64-lstat64.Po@am__quote@
Index: strace-4.24/tests-m32/looping_threads.test
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests-m32/looping_threads.test 2020-01-27 20:18:24.992072957 +0100
@@ -0,0 +1,38 @@
+#!/bin/sh
+#
+# Check tracing of looping threads.
+#
+# Copyright (c) 2009-2019 The strace developers.
+# All rights reserved.
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+. "${srcdir=.}/init.sh"
+. "${srcdir=.}/PTRACE_SEIZE.sh"
+
+run_prog ../orphaned_process_group > /dev/null
+
+run_prog_skip_if_failed date +%s > /dev/null
+s0="$(date +%s)"
+
+check_prog nproc
+inc="$(nproc)"
+[ "$inc" -ge 1 ] || inc=1
+
+timeout_2="$(($TIMEOUT_DURATION/2))"
+timeout_8="$(($TIMEOUT_DURATION/8))"
+nproc=1
+
+run_prog "../$NAME" "$timeout_8" "$nproc"
+
+while :; do
+ run_strace -f -qq -enone -esignal=none "../$NAME" "$timeout_2" "$nproc"
+
+ s1="$(date +%s)"
+ [ "$(($s1-$s0))" -lt "$timeout_8" ] ||
+ break
+
+ nproc="$(($nproc+$inc))"
+done
+
+warn_ "$ME_: nproc=$nproc elapsed=$(($s1-$s0))"
Index: strace-4.24/tests-mx32/looping_threads.test
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests-mx32/looping_threads.test 2020-01-27 20:18:26.879055636 +0100
@@ -0,0 +1,38 @@
+#!/bin/sh
+#
+# Check tracing of looping threads.
+#
+# Copyright (c) 2009-2019 The strace developers.
+# All rights reserved.
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+. "${srcdir=.}/init.sh"
+. "${srcdir=.}/PTRACE_SEIZE.sh"
+
+run_prog ../orphaned_process_group > /dev/null
+
+run_prog_skip_if_failed date +%s > /dev/null
+s0="$(date +%s)"
+
+check_prog nproc
+inc="$(nproc)"
+[ "$inc" -ge 1 ] || inc=1
+
+timeout_2="$(($TIMEOUT_DURATION/2))"
+timeout_8="$(($TIMEOUT_DURATION/8))"
+nproc=1
+
+run_prog "../$NAME" "$timeout_8" "$nproc"
+
+while :; do
+ run_strace -f -qq -enone -esignal=none "../$NAME" "$timeout_2" "$nproc"
+
+ s1="$(date +%s)"
+ [ "$(($s1-$s0))" -lt "$timeout_8" ] ||
+ break
+
+ nproc="$(($nproc+$inc))"
+done
+
+warn_ "$ME_: nproc=$nproc elapsed=$(($s1-$s0))"

View File

@ -0,0 +1,368 @@
From 31a5eee990d64a98a071ce74cd4d53190c0fe94b Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Sun, 11 Sep 2016 12:11:45 +0300
Subject: [PATCH 26/27] Add a generic list implementation
Similar to the one used in the Linux kernel.
* macros.h (cast_ptr, containerof): New macros.
* list.h: New file.
* Makefile.am (strace_SOURCES): Add it.
---
Makefile.am | 1 +
list.h | 300 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
macros.h | 19 ++++
3 files changed, 320 insertions(+)
create mode 100644 list.h
diff --git a/Makefile.am b/Makefile.am
index f6679a3..f252bda 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -165,6 +165,7 @@ strace_SOURCES = \
linux/asm_stat.h \
linux/x32/asm_stat.h \
linux/x86_64/asm_stat.h \
+ list.h \
listen.c \
lookup_dcookie.c \
loop.c \
diff --git a/list.h b/list.h
new file mode 100644
index 0000000..cf68fa7
--- /dev/null
+++ b/list.h
@@ -0,0 +1,300 @@
+/*
+ * Some simple implementation of lists similar to the one used in the kernel.
+ *
+ * Copyright (c) 2016-2019 The strace developers.
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ */
+
+#ifndef STRACE_LIST_H
+#define STRACE_LIST_H
+
+/*
+ * struct list_item and related macros and functions provide an interface
+ * for manipulating and iterating linked lists. In order to have list
+ * associated with its payload, struct list_item has to be embedded into
+ * a structure type representing payload, and (optionally) an additional
+ * struct list_item should be added somewhere as a starting point for list
+ * iteration (creating a list with a designated head). A situation where
+ * no designated head exists, and each embedded struct list_head is considered
+ * a head (i.e. starting point for list iteration), is also possible.
+ *
+ * List head has to be initialised with list_init() call. Statically allocated
+ * list heads can also be defined with an EMPTY_LIST() macro.
+ *
+ * In order to get a pointer to list item from a struct list_item, list_elem
+ * macro is used.
+ *
+ * When a designated head is used, list_head() and list_tail() can be used
+ * for getting pointer to the first and the last list item, respectively.
+ *
+ * list_next() and list_prev() macros can be used for obtaining pointers
+ * to the next and the previous items in the list, respectively. Note that
+ * they do not perform additional checks for the validity of these pointers,
+ * so they have to be guarded with respective list_head/list_tail checks in case
+ * of lists with designated heads (where the list's head is not embedded withing
+ * a list item.
+ *
+ * list_{insert,append,remove,remove_tail,remove_head,replace} provide some
+ * basic means of list manipulation.
+ *
+ * list_foreach() and list_foreach_safe() are wrapper macros for simplifying
+ * iteration over a list, with the latter having an additional argument
+ * for storing temporary pointer, thus allowing list manipulations during
+ * its iteration.
+ *
+ * A simple example:
+ *
+ * struct my_struct {
+ * int a;
+ * struct list_item l1;
+ * struct list_item l2;
+ * };
+ *
+ * EMPTY_LIST(list_1); <--- Defining a designated head for list
+ *
+ * struct my_struct *item =
+ * calloc(1, sizeof(*item));
+ * list_init(&item->l2); <--- Initialising structure field that
+ * is used for lists without designated
+ * head.
+ * list_insert(&list_1, &item->l1); <--- Inserting an item into the list
+ *
+ * item = calloc(1, sizeof(*item));
+ * list_init(&item->l2);
+ *
+ * list_append(&(list_head(list_1, struct my_struct, l1)->l2), &item->l2);
+ *
+ * struct my_struct *cur = item; <--- Iteration over a headless list
+ * do {
+ * printf("%d\n", cur->a);
+ * } while ((cur = list_next(&cur, l2)) != item);
+ *
+ * struct my_struct *i;
+ * list_foreach(i, list_1, l1) { <--- Iteration over list_1 without list
+ * printf("%d\n", i->a); modification
+ * }
+ *
+ * struct my_struct *tmp; <--- Iteration with modification
+ * list_foreach_safe(i, list_1, l1, tmp) {
+ * list_remove(&i->l1);
+ * free(i);
+ * }
+ *
+ * See also:
+ * "Linux kernel design patterns - part 2", section "Linked Lists"
+ * https://lwn.net/Articles/336255/
+ */
+
+#include "macros.h"
+
+struct list_item {
+ struct list_item *prev;
+ struct list_item *next;
+};
+
+/**
+ * Define an empty list head.
+ *
+ * @param l_ List head variable name.
+ */
+#define EMPTY_LIST(l_) struct list_item l_ = { &l_, &l_ }
+
+/** Initialise an empty list. */
+static inline void
+list_init(struct list_item *l)
+{
+ l->prev = l;
+ l->next = l;
+}
+
+/** Check whether list is empty. */
+static inline bool
+list_is_empty(const struct list_item *l)
+{
+ return ((l->next == l) && (l->prev == l))
+ /*
+ * XXX This could be the case when struct list_item hasn't been
+ * initialised at all; we should probably also call some
+ * errror_func_msg() in that case, as it looks like sloppy
+ * programming.
+ */
+ || (!l->next && !l->prev);
+}
+
+/**
+ * Convert a pointer to a struct list_item to a pointer to a list item.
+ *
+ * @param var Pointer to struct list_item.
+ * @param type Type of the list's item.
+ * @param field Name of the field that holds the respective struct list_item.
+ */
+#define list_elem(var, type, field) containerof((var), type, field)
+
+/**
+ * Get the first element in a list.
+ *
+ * @param head Pointer to the list's head.
+ * @param type Type of the list's item.
+ * @param field Name of the field that holds the respective struct list_item.
+ */
+#define list_head(head, type, field) \
+ (list_is_empty(head) ? NULL : list_elem((head)->next, type, field))
+/**
+ * Get the last element in a list.
+ *
+ * @param head Pointer to the list's head.
+ * @param type Type of the list's item.
+ * @param field Name of the field that holds the respective struct list_item.
+ */
+#define list_tail(head, type, field) \
+ (list_is_empty(head) ? NULL : list_elem((head)->prev, type, field))
+
+/**
+ * Get the next element in a list.
+ *
+ * @param var Pointer to a list item.
+ * @param field Name of the field that holds the respective struct list_item.
+ */
+#define list_next(var, field) \
+ list_elem((var)->field.next, typeof(*(var)), field)
+/**
+ * Get the previous element in a list.
+ *
+ * @param var Pointer to a list item.
+ * @param field Name of the field that holds the respective struct list_item.
+ */
+#define list_prev(var, field) \
+ list_elem((var)->field.prev, typeof(*(var)), field)
+
+/**
+ * Insert an item into a list. The item is placed as the next list item
+ * to the head.
+ */
+static inline void
+list_insert(struct list_item *head, struct list_item *item)
+{
+ item->next = head->next;
+ item->prev = head;
+ head->next->prev = item;
+ head->next = item;
+}
+
+/**
+ * Insert an item into a list. The item is placed as the previous list item
+ * to the head.
+ */
+static inline void
+list_append(struct list_item *head, struct list_item *item)
+{
+ item->next = head;
+ item->prev = head->prev;
+ head->prev->next = item;
+ head->prev = item;
+}
+
+/**
+ * Remove an item from a list.
+ *
+ * @param item Pointer to struct list_item of the item to be removed.
+ * @return Whether the action has been performed.
+ */
+static inline bool
+list_remove(struct list_item *item)
+{
+ if (!item->next || !item->prev || list_is_empty(item))
+ return false;
+
+ item->prev->next = item->next;
+ item->next->prev = item->prev;
+ item->next = item->prev = item;
+
+ return true;
+}
+
+/**
+ * Remove the last element of a list.
+ *
+ * @param head Pointer to the list's head.
+ * @return Pointer to struct list_item removed from the list;
+ * or NULL, if the list is empty.
+ */
+static inline struct list_item *
+list_remove_tail(struct list_item *head)
+{
+ struct list_item *t = list_is_empty(head) ? NULL : head->prev;
+
+ if (t)
+ list_remove(t);
+
+ return t;
+}
+
+/**
+ * Remove the first element of a list.
+ *
+ * @param head Pointer to the list's head.
+ * @return Pointer to struct list_item removed from the list;
+ * or NULL, if the list is empty.
+ */
+static inline struct list_item *
+list_remove_head(struct list_item *head)
+{
+ struct list_item *h = list_is_empty(head) ? NULL : head->next;
+
+ if (h)
+ list_remove(h);
+
+ return h;
+}
+
+/**
+ * Replace an old struct list_item in a list with the new one.
+ *
+ * @param old Pointer to struct list_item of the item to be replaced.
+ * @param new Pointer to struct list_item of the item to be replaced with.
+ * @return Whether the replacement has been performed.
+ */
+static inline bool
+list_replace(struct list_item *old, struct list_item *new)
+{
+ if (!old->next || !old->prev || list_is_empty(old))
+ return false;
+
+ new->next = old->next;
+ new->prev = old->prev;
+ old->prev->next = new;
+ old->next->prev = new;
+ old->next = old->prev = old;
+
+ return true;
+}
+
+/**
+ * List iteration wrapper for non-destructive operations.
+ *
+ * @param var_ Variable holding pointer to a current list item.
+ * @param head_ Pointer to the list's head.
+ * @param field_ Name of the field containing the respective struct list_item
+ * inside list items.
+ */
+#define list_foreach(var_, head_, field_) \
+ for (var_ = list_elem((head_)->next, typeof(*var_), field_); \
+ &(var_->field_) != (head_); var_ = list_next(var_, field_))
+
+/**
+ * List iteration wrapper for destructive operations.
+ *
+ * @param var_ Variable holding pointer to a current list item.
+ * @param head_ Pointer to the list's head.
+ * @param field_ Name of the field containing the respective struct list_item
+ * inside list items.
+ * @param _tmp Temporary variable for storing pointer to the next item.
+ */
+#define list_foreach_safe(var_, head_, field_, _tmp) \
+ for (var_ = list_elem((head_)->next, typeof(*var_), field_), \
+ _tmp = list_elem((var_)->field_.next, typeof(*var_), field_); \
+ &var_->field_ != head_; var_ = _tmp, _tmp = list_next(_tmp, field_))
+
+#endif /* !STRACE_LIST_H */
diff --git a/macros.h b/macros.h
index 9346d90..6951928 100644
--- a/macros.h
+++ b/macros.h
@@ -33,6 +33,25 @@
(offsetof(type_, member_) + sizeof(((type_ *)0)->member_))
#endif
+#ifndef cast_ptr
+# define cast_ptr(type_, var_) \
+ ((type_) (uintptr_t) (const volatile void *) (var_))
+#endif
+
+#ifndef containerof
+/**
+ * Return a pointer to a structure that contains the provided variable.
+ *
+ * @param ptr_ Pointer to data that is a field of the container structure.
+ * @param struct_ Type of the container structure.
+ * @param member_ Name of the member field.
+ * @return Pointer to the container structure.
+ */
+# define containerof(ptr_, struct_, member_) \
+ cast_ptr(struct_ *, \
+ (const volatile char *) (ptr_) - offsetof(struct_, member_))
+#endif
+
static inline bool
is_filled(const char *ptr, char fill, size_t size)
{
--
2.1.4

View File

@ -0,0 +1,611 @@
From 496f922dad9b58b891f417b937ac5fb0b0a8649a Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Wed, 8 Aug 2018 21:41:39 +0200
Subject: [PATCH 27/27] Implement queueing of threads before dispatching them
It is possible that some tracees call a lot of cheap syscalls too fast,
and that can stress the tracer to the point some tracees are not served
for indefinite amount of time. In order to avoid that unfairness, try
to collect all the pending tracees first along with the relevant
information and only then dispatch the events.
* defs.h: Include "list.h".
(struct tcb): Add wait_data_idx, delayed_wait_data, and wait_list
fields.
* strace.c (struct tcb_wait_data): Add "msg" field.
(tcb_wait_tab, tcb_wait_tab_size): New static variables.
(alloctcb): Initialize wait_list.
(droptcb): Remove tcp from wait_list.
(maybe_switch_tcbs): Get old pid from
tcb_wait_tab[tcp->wait_data_idx].msg instead of calling
ptrace(PTRACE_GETEVENTMSG).
(trace_wait_data_size, init_trace_wait_data, copy_trace_wait_data,
free_trace_wait_data, tcb_wait_tab_check_size): New functions, in order
to allow the code outside next_event to operate with wait_data as with
an opaque object (needed for dispatch_event and restart_delayed_tcb).
(next_event): Add pending_tcps, extra_tcp, wait_nohang, elem, and
wait_tab_pos variables; check for elements in pending_tcps and skip
waiting if the list is not empty; check for extra_tcp and skip waiting
along with swapping wait_data_idx with wait_extra_data_idx;
after the initial wait4(), call wait4() in loop with WNOHANG flag set;
fetch siginfo on signal and eventmsg on PTRACE_EVENT_EXEC;
return the first tcp in pending_tcps list.
(dispatch_event): Store a pointer to a copy of tcb_wait_data in
tcp->delayed_wait_data if tcp's restart has to be delayed.
(restart_delayed_tcb): Use tcp->delayed_wait_data, create a stub
tcb_wait_data if it is NULL, free temporary trace_wait_data.
* tests/Makefile.am (XFAIL_TEST): Remove looping_threads.test.
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=478419
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=526740
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=851457
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1609318
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1610774
Co-Authored-by: Dmitry V. Levin <ldv@altlinux.org>
Co-Authored-by: Denys Vlasenko <dvlasenk@redhat.com>
Co-Authored-by: Andreas Schwab <aschwab@redhat.com>
Co-Authored-by: Jeff Law <law@redhat.com>
Co-Authored-by: DJ Delorie <dj@redhat.com>
Conflicts:
defs.h
tests/Makefile.am
---
defs.h | 12 ++
strace.c | 393 +++++++++++++++++++++++++++++++++++++-----------------
tests/Makefile.am | 3 +-
3 files changed, 283 insertions(+), 125 deletions(-)
diff --git a/defs.h b/defs.h
index 811bb0d..2a614a7 100644
--- a/defs.h
+++ b/defs.h
@@ -36,6 +36,7 @@
#include "arch_defs.h"
#include "error_prints.h"
#include "gcc_compat.h"
+#include "list.h"
#include "kernel_types.h"
#include "macros.h"
#include "mpers_type.h"
@@ -218,6 +219,17 @@ struct tcb {
struct mmap_cache_t *mmap_cache;
+ /*
+ * Data that is stored during process wait traversal.
+ * We use indices as the actual data is stored in an array
+ * that is realloc'ed at runtime.
+ */
+ size_t wait_data_idx;
+ /** Wait data storage for a delayed process. */
+ struct tcb_wait_data *delayed_wait_data;
+ struct list_item wait_list;
+
+
#ifdef HAVE_LINUX_KVM_H
struct vcpu_info *vcpu_info_list;
#endif
diff --git a/strace.c b/strace.c
index 0745838..0914dc7 100644
--- a/strace.c
+++ b/strace.c
@@ -141,6 +141,7 @@ static struct tcb *current_tcp;
struct tcb_wait_data {
enum trace_event te; /**< Event passed to dispatch_event() */
int status; /**< status, returned by wait4() */
+ unsigned long msg; /**< Value returned by PTRACE_GETEVENTMSG */
siginfo_t si; /**< siginfo, returned by PTRACE_GETSIGINFO */
};
@@ -148,6 +149,10 @@ static struct tcb **tcbtab;
static unsigned int nprocs;
static size_t tcbtabsize;
+static struct tcb_wait_data *tcb_wait_tab;
+static size_t tcb_wait_tab_size;
+
+
#ifndef HAVE_PROGRAM_INVOCATION_NAME
char *program_invocation_name;
#endif
@@ -745,6 +750,7 @@ alloctcb(int pid)
tcp = tcbtab[i];
if (!tcp->pid) {
memset(tcp, 0, sizeof(*tcp));
+ list_init(&tcp->wait_list);
tcp->pid = pid;
#if SUPPORTED_PERSONALITIES > 1
tcp->currpers = current_personality;
@@ -833,6 +839,8 @@ droptcb(struct tcb *tcp)
if (printing_tcp == tcp)
printing_tcp = NULL;
+ list_remove(&tcp->wait_list);
+
memset(tcp, 0, sizeof(*tcp));
}
@@ -2051,10 +2059,8 @@ maybe_switch_tcbs(struct tcb *tcp, const int pid)
{
FILE *fp;
struct tcb *execve_thread;
- long old_pid = 0;
+ long old_pid = tcb_wait_tab[tcp->wait_data_idx].msg;
- if (ptrace(PTRACE_GETEVENTMSG, pid, NULL, &old_pid) < 0)
- return tcp;
/* Avoid truncation in pid2tcb() param passing */
if (old_pid <= 0 || old_pid == pid)
return tcp;
@@ -2207,20 +2213,74 @@ print_event_exit(struct tcb *tcp)
line_ended();
}
-static const struct tcb_wait_data *
-next_event(void)
+static size_t
+trace_wait_data_size(struct tcb *tcp)
{
- static struct tcb_wait_data wait_data;
+ return sizeof(struct tcb_wait_data);
+}
- int pid;
- int status;
- struct tcb *tcp;
- struct tcb_wait_data *wd = &wait_data;
- struct rusage ru;
+static struct tcb_wait_data *
+init_trace_wait_data(void *p)
+{
+ struct tcb_wait_data *wd = p;
+
+ memset(wd, 0, sizeof(*wd));
+
+ return wd;
+}
+static struct tcb_wait_data *
+copy_trace_wait_data(const struct tcb_wait_data *wd)
+{
+ struct tcb_wait_data *new_wd = xmalloc(sizeof(*new_wd));
+
+ memcpy(new_wd, wd, sizeof(*wd));
+
+ return new_wd;
+}
+
+static void
+free_trace_wait_data(struct tcb_wait_data *wd)
+{
+ free(wd);
+}
+
+static void
+tcb_wait_tab_check_size(const size_t size)
+{
+ while (size >= tcb_wait_tab_size) {
+ tcb_wait_tab = xgrowarray(tcb_wait_tab,
+ &tcb_wait_tab_size,
+ sizeof(tcb_wait_tab[0]));
+ }
+}
+
+static const struct tcb_wait_data *
+next_event(void)
+{
if (interrupted)
return NULL;
+ struct tcb *tcp = NULL;
+ struct list_item *elem;
+
+ static EMPTY_LIST(pending_tcps);
+ /* Handle the queued tcbs before waiting for new events. */
+ if (!list_is_empty(&pending_tcps))
+ goto next_event_get_tcp;
+
+ static struct tcb *extra_tcp;
+ static size_t wait_extra_data_idx;
+ /* Handle the extra tcb event. */
+ if (extra_tcp) {
+ tcp = extra_tcp;
+ extra_tcp = NULL;
+ tcp->wait_data_idx = wait_extra_data_idx;
+
+ debug_msg("dequeued extra event for pid %u", tcp->pid);
+ goto next_event_exit;
+ }
+
/*
* Used to exit simply when nprocs hits zero, but in this testcase:
* int main(void) { _exit(!!fork()); }
@@ -2262,8 +2322,10 @@ next_event(void)
* then the system call will be interrupted and
* the expiration will be handled by the signal handler.
*/
- pid = wait4(-1, &status, __WALL, (cflag ? &ru : NULL));
- const int wait_errno = errno;
+ int status;
+ struct rusage ru;
+ int pid = wait4(-1, &status, __WALL, (cflag ? &ru : NULL));
+ int wait_errno = errno;
/*
* The window of opportunity to handle expirations
@@ -2279,135 +2341,202 @@ next_event(void)
return NULL;
}
- if (pid < 0) {
- if (wait_errno == EINTR) {
- wd->te = TE_NEXT;
- return wd;
+ size_t wait_tab_pos = 0;
+ bool wait_nohang = false;
+
+ /*
+ * Wait for new events until wait4() returns 0 (meaning that there's
+ * nothing more to wait for for now), or a second event for some tcb
+ * appears (which may happen if a tracee was SIGKILL'ed, for example).
+ */
+ for (;;) {
+ struct tcb_wait_data *wd;
+
+ if (pid < 0) {
+ if (wait_errno == EINTR)
+ break;
+ if (wait_nohang)
+ break;
+ if (nprocs == 0 && wait_errno == ECHILD)
+ return NULL;
+ /*
+ * If nprocs > 0, ECHILD is not expected,
+ * treat it as any other error here:
+ */
+ errno = wait_errno;
+ perror_msg_and_die("wait4(__WALL)");
}
- if (nprocs == 0 && wait_errno == ECHILD)
- return NULL;
- /*
- * If nprocs > 0, ECHILD is not expected,
- * treat it as any other error here:
- */
- errno = wait_errno;
- perror_msg_and_die("wait4(__WALL)");
- }
- wd->status = status;
+ if (!pid)
+ break;
- if (pid == popen_pid) {
- if (!WIFSTOPPED(status))
- popen_pid = 0;
- wd->te = TE_NEXT;
- return wd;
- }
+ if (pid == popen_pid) {
+ if (!WIFSTOPPED(status))
+ popen_pid = 0;
+ break;
+ }
- if (debug_flag)
- print_debug_info(pid, status);
+ if (debug_flag)
+ print_debug_info(pid, status);
- /* Look up 'pid' in our table. */
- tcp = pid2tcb(pid);
+ /* Look up 'pid' in our table. */
+ tcp = pid2tcb(pid);
- if (!tcp) {
- tcp = maybe_allocate_tcb(pid, status);
if (!tcp) {
- wd->te = TE_NEXT;
- return wd;
+ tcp = maybe_allocate_tcb(pid, status);
+ if (!tcp)
+ goto next_event_wait_next;
}
- }
- clear_regs(tcp);
+ if (cflag) {
+ struct timespec stime = {
+ .tv_sec = ru.ru_stime.tv_sec,
+ .tv_nsec = ru.ru_stime.tv_usec * 1000
+ };
+ ts_sub(&tcp->dtime, &stime, &tcp->stime);
+ tcp->stime = stime;
+ }
- /* Set current output file */
- set_current_tcp(tcp);
+ tcb_wait_tab_check_size(wait_tab_pos);
- if (cflag) {
- struct timespec stime = {
- .tv_sec = ru.ru_stime.tv_sec,
- .tv_nsec = ru.ru_stime.tv_usec * 1000
- };
- ts_sub(&tcp->dtime, &stime, &tcp->stime);
- tcp->stime = stime;
- }
+ /* Initialise a new wait data structure. */
+ wd = tcb_wait_tab + wait_tab_pos;
+ init_trace_wait_data(wd);
+ wd->status = status;
- if (WIFSIGNALED(status)) {
- wd->te = TE_SIGNALLED;
- return wd;
- }
+ if (WIFSIGNALED(status)) {
+ wd->te = TE_SIGNALLED;
+ } else if (WIFEXITED(status)) {
+ wd->te = TE_EXITED;
+ } else {
+ /*
+ * As WCONTINUED flag has not been specified to wait4,
+ * it cannot be WIFCONTINUED(status), so the only case
+ * that remains is WIFSTOPPED(status).
+ */
- if (WIFEXITED(status)) {
- wd->te = TE_EXITED;
- return wd;
+ const unsigned int sig = WSTOPSIG(status);
+ const unsigned int event = (unsigned int) status >> 16;
+
+ switch (event) {
+ case 0:
+ /*
+ * Is this post-attach SIGSTOP?
+ * Interestingly, the process may stop
+ * with STOPSIG equal to some other signal
+ * than SIGSTOP if we happened to attach
+ * just before the process takes a signal.
+ */
+ if (sig == SIGSTOP &&
+ (tcp->flags & TCB_IGNORE_ONE_SIGSTOP)) {
+ debug_func_msg("ignored SIGSTOP on "
+ "pid %d", tcp->pid);
+ tcp->flags &= ~TCB_IGNORE_ONE_SIGSTOP;
+ wd->te = TE_RESTART;
+ } else if (sig == syscall_trap_sig) {
+ wd->te = TE_SYSCALL_STOP;
+ } else {
+ /*
+ * True if tracee is stopped by signal
+ * (as opposed to "tracee received
+ * signal").
+ * TODO: shouldn't we check for
+ * errno == EINVAL too?
+ * We can get ESRCH instead, you know...
+ */
+ bool stopped = ptrace(PTRACE_GETSIGINFO,
+ pid, 0, &wd->si) < 0;
+
+ wd->te = stopped ? TE_GROUP_STOP
+ : TE_SIGNAL_DELIVERY_STOP;
+ }
+ break;
+ case PTRACE_EVENT_STOP:
+ /*
+ * PTRACE_INTERRUPT-stop or group-stop.
+ * PTRACE_INTERRUPT-stop has sig == SIGTRAP here.
+ */
+ switch (sig) {
+ case SIGSTOP:
+ case SIGTSTP:
+ case SIGTTIN:
+ case SIGTTOU:
+ wd->te = TE_GROUP_STOP;
+ break;
+ default:
+ wd->te = TE_RESTART;
+ }
+ break;
+ case PTRACE_EVENT_EXEC:
+ /*
+ * TODO: shouldn't we check for
+ * errno == EINVAL here, too?
+ * We can get ESRCH instead, you know...
+ */
+ if (ptrace(PTRACE_GETEVENTMSG, pid, NULL,
+ &wd->msg) < 0)
+ wd->msg = 0;
+
+ wd->te = TE_STOP_BEFORE_EXECVE;
+ break;
+ case PTRACE_EVENT_EXIT:
+ wd->te = TE_STOP_BEFORE_EXIT;
+ break;
+ default:
+ wd->te = TE_RESTART;
+ }
+ }
+
+ if (!wd->te)
+ error_func_msg("Tracing event hasn't been determined "
+ "for pid %d, status %0#x", pid, status);
+
+ if (!list_is_empty(&tcp->wait_list)) {
+ wait_extra_data_idx = wait_tab_pos;
+ extra_tcp = tcp;
+ debug_func_msg("queued extra pid %d", tcp->pid);
+ } else {
+ tcp->wait_data_idx = wait_tab_pos;
+ list_append(&pending_tcps, &tcp->wait_list);
+ debug_func_msg("queued pid %d", tcp->pid);
+ }
+
+ wait_tab_pos++;
+
+ if (extra_tcp)
+ break;
+
+next_event_wait_next:
+ pid = wait4(-1, &status, __WALL | WNOHANG, (cflag ? &ru : NULL));
+ wait_errno = errno;
+ wait_nohang = true;
}
- /*
- * As WCONTINUED flag has not been specified to wait4,
- * it cannot be WIFCONTINUED(status), so the only case
- * that remains is WIFSTOPPED(status).
- */
+next_event_get_tcp:
+ elem = list_remove_head(&pending_tcps);
+
+ if (!elem) {
+ tcb_wait_tab_check_size(0);
+ memset(tcb_wait_tab, 0, sizeof(*tcb_wait_tab));
+ tcb_wait_tab->te = TE_NEXT;
+ return tcb_wait_tab;
+ } else {
+ tcp = list_elem(elem, struct tcb, wait_list);
+ debug_func_msg("dequeued pid %d", tcp->pid);
+ }
+
+next_event_exit:
/* Is this the very first time we see this tracee stopped? */
if (tcp->flags & TCB_STARTUP)
startup_tcb(tcp);
- const unsigned int sig = WSTOPSIG(status);
- const unsigned int event = (unsigned int) status >> 16;
+ clear_regs(tcp);
- switch (event) {
- case 0:
- /*
- * Is this post-attach SIGSTOP?
- * Interestingly, the process may stop
- * with STOPSIG equal to some other signal
- * than SIGSTOP if we happened to attach
- * just before the process takes a signal.
- */
- if (sig == SIGSTOP && (tcp->flags & TCB_IGNORE_ONE_SIGSTOP)) {
- debug_func_msg("ignored SIGSTOP on pid %d", tcp->pid);
- tcp->flags &= ~TCB_IGNORE_ONE_SIGSTOP;
- wd->te = TE_RESTART;
- } else if (sig == syscall_trap_sig) {
- wd->te = TE_SYSCALL_STOP;
- } else {
- memset(&wd->si, 0, sizeof(wd->si));
- /*
- * True if tracee is stopped by signal
- * (as opposed to "tracee received signal").
- * TODO: shouldn't we check for errno == EINVAL too?
- * We can get ESRCH instead, you know...
- */
- bool stopped = ptrace(PTRACE_GETSIGINFO, pid, 0, &wd->si) < 0;
- wd->te = stopped ? TE_GROUP_STOP : TE_SIGNAL_DELIVERY_STOP;
- }
- break;
- case PTRACE_EVENT_STOP:
- /*
- * PTRACE_INTERRUPT-stop or group-stop.
- * PTRACE_INTERRUPT-stop has sig == SIGTRAP here.
- */
- switch (sig) {
- case SIGSTOP:
- case SIGTSTP:
- case SIGTTIN:
- case SIGTTOU:
- wd->te = TE_GROUP_STOP;
- break;
- default:
- wd->te = TE_RESTART;
- }
- break;
- case PTRACE_EVENT_EXEC:
- wd->te = TE_STOP_BEFORE_EXECVE;
- break;
- case PTRACE_EVENT_EXIT:
- wd->te = TE_STOP_BEFORE_EXIT;
- break;
- default:
- wd->te = TE_RESTART;
- }
+ /* Set current output file */
+ set_current_tcp(tcp);
- return wd;
+ return tcb_wait_tab + tcp->wait_data_idx;
}
static int
@@ -2569,8 +2698,15 @@ dispatch_event(const struct tcb_wait_data *wd)
return false;
/* If the process is being delayed, do not ptrace_restart just yet */
- if (syscall_delayed(current_tcp))
+ if (syscall_delayed(current_tcp)) {
+ if (current_tcp->delayed_wait_data)
+ error_func_msg("pid %d has delayed wait data set"
+ " already", current_tcp->pid);
+
+ current_tcp->delayed_wait_data = copy_trace_wait_data(wd);
+
return true;
+ }
if (ptrace_restart(restart_op, current_tcp, restart_sig) < 0) {
/* Note: ptrace_restart emitted error message */
@@ -2583,7 +2719,15 @@ dispatch_event(const struct tcb_wait_data *wd)
static bool
restart_delayed_tcb(struct tcb *const tcp)
{
- const struct tcb_wait_data wd = { .te = TE_RESTART };
+ struct tcb_wait_data *wd = tcp->delayed_wait_data;
+
+ if (!wd) {
+ error_func_msg("No delayed wait data found for pid %d",
+ tcp->pid);
+ wd = init_trace_wait_data(alloca(trace_wait_data_size(tcp)));
+ }
+
+ wd->te = TE_RESTART;
debug_func_msg("pid %d", tcp->pid);
@@ -2591,9 +2735,12 @@ restart_delayed_tcb(struct tcb *const tcp)
struct tcb *const prev_tcp = current_tcp;
current_tcp = tcp;
- bool ret = dispatch_event(&wd);
+ bool ret = dispatch_event(wd);
current_tcp = prev_tcp;
+ free_trace_wait_data(tcp->delayed_wait_data);
+ tcp->delayed_wait_data = NULL;
+
return ret;
}
diff --git a/tests/Makefile.am b/tests/Makefile.am
index de7a3d2..51f00a9 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -350,8 +350,7 @@ XFAIL_TESTS_m32 = $(STACKTRACE_TESTS)
XFAIL_TESTS_mx32 = $(STACKTRACE_TESTS)
XFAIL_TESTS_x86_64 = int_0x80.gen.test
XFAIL_TESTS_x32 = int_0x80.gen.test
-XFAIL_TESTS = $(XFAIL_TESTS_$(MPERS_NAME)) $(XFAIL_TESTS_$(ARCH)) \
- looping_threads.test
+XFAIL_TESTS = $(XFAIL_TESTS_$(MPERS_NAME)) $(XFAIL_TESTS_$(ARCH))
TEST_LOG_COMPILER = env
AM_TEST_LOG_FLAGS = STRACE_ARCH=$(ARCH) STRACE_NATIVE_ARCH=$(NATIVE_ARCH) \
--
2.1.4

View File

@ -0,0 +1,25 @@
From cbbf708b4d2f8a66b07cf805f82edbe892c0bbf7 Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Sun, 2 Sep 2018 18:15:40 +0200
Subject: [PATCH] macros: add ROUNDUP macro
* macros.h (ROUNDUP): New macro.
---
macros.h | 4 ++++
1 file changed, 4 insertions(+)
Index: strace-4.24/macros.h
===================================================================
--- strace-4.24.orig/macros.h 2019-08-01 18:40:47.322659137 +0200
+++ strace-4.24/macros.h 2019-08-01 19:49:00.405972298 +0200
@@ -28,6 +28,10 @@
#endif
#define CLAMP(val, min, max) MIN(MAX(min, val), max)
+#ifndef ROUNDUP
+# define ROUNDUP(val_, div_) ((((val_) + (div_) - 1) / (div_)) * (div_))
+#endif
+
#ifndef offsetofend
# define offsetofend(type_, member_) \
(offsetof(type_, member_) + sizeof(((type_ *)0)->member_))

View File

@ -0,0 +1,49 @@
From 79acbcf2550f3a55108240558efb8b9c36eb8399 Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Tue, 19 Feb 2019 03:10:11 +0100
Subject: [PATCH] util: update dumpstr
Use a buffer of a limited size, use proper type for dump amount, avoid
hard-coding of byte counts, calculate output buffer size more accurately
and minimise its rewriting, pad offset with zeros in accordance
with expected output amount.
* defs.h (dumpstr): Change the type of len argument from int to
kernel_ulong_t.
* macros.h (ROUNDUP_DIV): New macro.
(ROUNDUP): Rewrite using ROUNDUP_DIV.
* util.c (ILOG2_ITER_): New macro.
(ilog2_64, ilog2_32): New functions.
(ilog2_klong): New macro, wrapper around ilog2_32/ilog2_64, so (potentially
more expensive) ilog2_64 is not used for ilog2 calculation
of a kernel_ulong_t-typed variable on architectures with 32-bit kernel long.
(dumpstr): Update.
Co-Authored-by: Dmitry V. Levin <ldv@altlinux.org>
---
defs.h | 2 +-
macros.h | 6 +-
util.c | 205 ++++++++++++++++++++++++++++++++++++++++++++++++++-------------
3 files changed, 169 insertions(+), 44 deletions(-)
diff --git a/macros.h b/macros.h
index 7f019480..61abf826 100644
--- a/macros.h
+++ b/macros.h
@@ -28,8 +28,12 @@
#endif
#define CLAMP(val, min, max) MIN(MAX(min, val), max)
+#ifndef ROUNDUP_DIV
+# define ROUNDUP_DIV(val_, div_) (((val_) + (div_) - 1) / (div_))
+#endif
+
#ifndef ROUNDUP
-# define ROUNDUP(val_, div_) ((((val_) + (div_) - 1) / (div_)) * (div_))
+# define ROUNDUP(val_, div_) (ROUNDUP_DIV((val_), (div_)) * (div_))
#endif
#ifndef offsetofend
--
2.13.6

View File

@ -0,0 +1,42 @@
From 7ada13f3a40e2f58aea335cf910666378e7dd99a Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Fri, 12 Jul 2019 14:38:33 +0200
Subject: [PATCH 1/3] evdev: avoid bit vector decoding on non-successful and 0
return codes
Reported by Clang.
strace/evdev.c:157:3: note: The value 0 is assigned to 'size'
# size = tcp->u_rval * 8;
# ^~~~~~~~~~~~~~~~~~~~~~
strace/evdev.c:158:2: warning: Declared variable-length array (VLA)
has zero size
# char decoded_arg[size];
# ^
* evdev.c (decode_bitset_): Bail out before decoded_arg VLA definition.
---
evdev.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/evdev.c b/evdev.c
index e402d26e..4b811cf8 100644
--- a/evdev.c
+++ b/evdev.c
@@ -155,6 +155,13 @@ decode_bitset_(struct tcb *const tcp, const kernel_ulong_t arg,
size = max_nr;
else
size = tcp->u_rval * 8;
+
+ if (syserror(tcp) || !size) {
+ printaddr(arg);
+
+ return RVAL_IOCTL_DECODED;
+ }
+
char decoded_arg[size];
if (umove_or_printaddr(tcp, arg, &decoded_arg))
--
2.13.6

View File

@ -0,0 +1,57 @@
From 96194ed74158f0b9976fae43a910ad14eaea141e Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Fri, 12 Jul 2019 14:57:28 +0200
Subject: [PATCH 2/3] evdev: fix array size calculation in decode_bitset_
max_nr is in bits (as it is a number of flags), result is in bytes, and
the array allocation has to be in personality words.
There's still an open question, however, what to do on big-endian
architectures when a non-divisible-by-4 value is returned.
* evdev.c (decode_bitset_): Declare size_bits, initialise it and use it
later instead of size; round up size by personality's word boundary.
---
evdev.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/evdev.c b/evdev.c
index 4b811cf8..a3d9cb55 100644
--- a/evdev.c
+++ b/evdev.c
@@ -151,10 +151,14 @@ decode_bitset_(struct tcb *const tcp, const kernel_ulong_t arg,
tprints(", ");
unsigned int size;
+ unsigned int size_bits;
+
if ((kernel_ulong_t) tcp->u_rval > max_nr / 8)
- size = max_nr;
+ size_bits = max_nr;
else
- size = tcp->u_rval * 8;
+ size_bits = tcp->u_rval * 8;
+
+ size = ROUNDUP(ROUNDUP_DIV(size_bits, 8), current_wordsize);
if (syserror(tcp) || !size) {
printaddr(arg);
@@ -170,13 +174,13 @@ decode_bitset_(struct tcb *const tcp, const kernel_ulong_t arg,
tprints("[");
int bit_displayed = 0;
- int i = next_set_bit(decoded_arg, 0, size);
+ int i = next_set_bit(decoded_arg, 0, size_bits);
if (i < 0) {
tprints(" 0 ");
} else {
printxval_dispatch(decode_nr, decode_nr_size, i, dflt, xt);
- while ((i = next_set_bit(decoded_arg, i + 1, size)) > 0) {
+ while ((i = next_set_bit(decoded_arg, i + 1, size_bits)) > 0) {
if (abbrev(tcp) && bit_displayed >= 3) {
tprints(", ...");
break;
--
2.13.6

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,795 @@
From cdd8206af74fcb961f0179e21eacf5d55d23f0ac Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Fri, 12 Jul 2019 14:31:44 +0200
Subject: [PATCH 3/3] tests: test evdev bitset decoding more thoroughly
* tests/ioctl_evdev-success-v.test: Inject various values.
* tests/ioctl_evdev-success.test: Likewise.
* tests/ioctl_evdev-success.c (NUM_WORDS): New macro.
(struct evdev_check): Constify arg_ptr and print_arg args.
(invoke_test_syscall, test_evdev, print_input_absinfo, print_input_id,
print_mtslots): Add const qualifiers.
(print_getbit): Add const qualifiers, rewrite to expect trailing NULL
in the string array instead of leading string count.
(main): Set size for ev_more, ev_less, ev_zero arrays; replace leading
count element in ev_more_str, ev_less_str, ev_zero_str with trailing
NULL; replace ev_more_str and ev_less_str with ev_more_str_2/ev_less_str_2
and ev_more_str_3/ev_less_str_3 that differ by presence of flags that reside
beyond first two bytes; add static and const qualifiers where possible;
add key/key_sts_8/key_str_16 values; update a to provide either ev_more_str_2
or ev_more_str_3 and either key_str_8 or key_str_16 depending on inject_retval
value.
---
tests/ioctl_evdev-success-v.test | 15 +++---
tests/ioctl_evdev-success.c | 100 ++++++++++++++++++++++++++-------------
tests/ioctl_evdev-success.test | 15 +++---
3 files changed, 84 insertions(+), 46 deletions(-)
Index: strace-4.24/tests/ioctl_evdev-success-v.test
===================================================================
--- strace-4.24.orig/tests/ioctl_evdev-success-v.test 2019-08-01 18:40:58.009521546 +0200
+++ strace-4.24/tests/ioctl_evdev-success-v.test 2019-08-01 19:21:32.297062218 +0200
@@ -3,11 +3,14 @@
. "${srcdir=.}/scno_tampering.sh"
: ${IOCTL_INJECT_START=256}
-: ${IOCTL_INJECT_RETVAL=8}
run_prog
-run_strace -a16 -v -e trace=ioctl \
- -e inject=ioctl:retval="${IOCTL_INJECT_RETVAL}":when="${IOCTL_INJECT_START}+" \
- ../ioctl_evdev-success-v "${IOCTL_INJECT_START}" "${IOCTL_INJECT_RETVAL}"> "$EXP"
-grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT"
-match_diff "$OUT" "$EXP"
+
+for ret in 0 2 8 15 16; do
+ run_strace -a16 -v -e trace=ioctl \
+ -e inject=ioctl:retval="${ret}":when="${IOCTL_INJECT_START}+" \
+ ../ioctl_evdev-success-v \
+ "${IOCTL_INJECT_START}" "${ret}"> "$EXP.$ret"
+ grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT.$ret"
+ match_diff "$OUT.$ret" "$EXP.$ret"
+done
Index: strace-4.24/tests/ioctl_evdev-success.c
===================================================================
--- strace-4.24.orig/tests/ioctl_evdev-success.c 2019-08-01 18:40:58.009521546 +0200
+++ strace-4.24/tests/ioctl_evdev-success.c 2019-08-01 19:21:32.297062218 +0200
@@ -2,6 +2,7 @@
#ifdef HAVE_LINUX_INPUT_H
+# include <assert.h>
# include <inttypes.h>
# include <stdio.h>
# include <stdlib.h>
@@ -9,17 +10,19 @@
# include <linux/input.h>
# include "print_fields.h"
+# define NUM_WORDS 4
+
static const char *errstr;
struct evdev_check {
unsigned long cmd;
const char *cmd_str;
- void *arg_ptr;
- void (*print_arg)(long rc, void *ptr, void *arg);
+ const void *arg_ptr;
+ void (*print_arg)(long rc, const void *ptr, const void *arg);
};
static long
-invoke_test_syscall(unsigned long cmd, void *p)
+invoke_test_syscall(unsigned long cmd, const void *p)
{
long rc = ioctl(-1, cmd, p);
errstr = sprintrc(rc);
@@ -31,7 +34,7 @@
}
static void
-test_evdev(struct evdev_check *check, void *arg)
+test_evdev(struct evdev_check *check, const void *arg)
{
long rc = invoke_test_syscall(check->cmd, check->arg_ptr);
printf("ioctl(-1, %s, ", check->cmd_str);
@@ -43,9 +46,9 @@
}
static void
-print_input_absinfo(long rc, void *ptr, void *arg)
+print_input_absinfo(long rc, const void *ptr, const void *arg)
{
- struct input_absinfo *absinfo = ptr;
+ const struct input_absinfo *absinfo = ptr;
if (rc < 0) {
printf("%p", absinfo);
@@ -67,9 +70,9 @@
}
static void
-print_input_id(long rc, void *ptr, void *arg)
+print_input_id(long rc, const void *ptr, const void *arg)
{
- struct input_id *id = ptr;
+ const struct input_id *id = ptr;
if (rc < 0) {
printf("%p", id);
@@ -84,10 +87,10 @@
# ifdef EVIOCGMTSLOTS
static void
-print_mtslots(long rc, void *ptr, void *arg)
+print_mtslots(long rc, const void *ptr, const void *arg)
{
- int *buffer = ptr;
- const char **str = arg;
+ const int *buffer = ptr;
+ const char * const * str = arg;
int num = atoi(*(str + 1));
if (rc < 0) {
@@ -104,27 +107,26 @@
# endif
static void
-print_getbit(long rc, void *ptr, void *arg)
+print_getbit(long rc, const void *ptr, const void *arg)
{
- const char **str = arg;
- int num = atoi(*str);
+ const char * const *str = arg;
- if (rc < 0) {
+ if (rc <= 0) {
printf("%p", ptr);
return;
}
printf("[");
- printf("%s", *(str + 1));
- for (unsigned int i = 2; i <= (unsigned) num; i++) {
+ for (unsigned long i = 0; str[i]; i++) {
# if ! VERBOSE
- if (i > 4) {
+ if (i >= 4) {
printf(", ...");
break;
}
# endif
- printf(", ");
- printf("%s", *(str + i));
+ if (i)
+ printf(", ");
+ printf("%s", str[i]);
}
printf("]");
}
@@ -170,6 +172,7 @@
TAIL_ALLOC_OBJECT_CONST_PTR(struct input_id, id);
TAIL_ALLOC_OBJECT_CONST_PTR(struct input_absinfo, absinfo);
TAIL_ALLOC_OBJECT_CONST_PTR(int, bad_addr_slot);
+
# ifdef EVIOCGMTSLOTS
int mtslots[] = { ABS_MT_SLOT, 1, 3 };
/* we use the second element to indicate the number of values */
@@ -183,36 +186,65 @@
const char *invalid_mtslot_str[] = { invalid_str, "1", "1" };
# endif
+ enum { ULONG_BIT = sizeof(unsigned long) * 8 };
+
/* set more than 4 bits */
- unsigned long ev_more[] = { 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED | 1 << EV_SND | 1 << EV_PWR };
- /* we use the first element to indicate the number of set bits */
- /* ev_more_str[0] is "5" so the number of set bits is 5 */
- const char *ev_more_str[] = { "5", "EV_ABS", "EV_MSC", "EV_LED", "EV_SND", "EV_PWR" };
+ static const unsigned long ev_more[NUM_WORDS] = {
+ 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED | 1 << EV_SND
+ | 1 << EV_PWR };
+ static const char * const ev_more_str_2[] = {
+ "EV_ABS", "EV_MSC", NULL };
+ static const char * const ev_more_str_3[] = {
+ "EV_ABS", "EV_MSC", "EV_LED", "EV_SND", "EV_PWR", NULL };
/* set less than 4 bits */
- unsigned long ev_less[] = { 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED };
- const char *ev_less_str[] = { "3", "EV_ABS", "EV_MSC", "EV_LED" };
+ static const unsigned long ev_less[NUM_WORDS] = {
+ 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED };
+ static const char * const ev_less_str_2[] = {
+ "EV_ABS", "EV_MSC", NULL };
+ static const char * const ev_less_str_3[] = {
+ "EV_ABS", "EV_MSC", "EV_LED", NULL };
/* set zero bit */
- unsigned long ev_zero[] = { 0x0 };
- const char *ev_zero_str[] = { "0", " 0 " };
+ static const unsigned long ev_zero[NUM_WORDS] = { 0x0 };
+ static const char * const ev_zero_str[] = { " 0 ", NULL };
/* KEY_MAX is 0x2ff which is greater than retval * 8 */
- unsigned long key[] = { 1 << KEY_1 | 1 << KEY_2, 0 };
- const char *key_str[] = { "2", "KEY_1", "KEY_2" };
+ static const unsigned long key[NUM_WORDS] = {
+ 1 << KEY_1 | 1 << KEY_2,
+ [ KEY_F12 / ULONG_BIT ] = 1 << (KEY_F12 % ULONG_BIT) };
+
+ static const char * const key_str_8[] = {
+ "KEY_1", "KEY_2", NULL };
+ static const char * const key_str_16[] = {
+ "KEY_1", "KEY_2", "KEY_F12", NULL };
+
+ assert(sizeof(ev_more) >= (unsigned long) inject_retval);
+ assert(sizeof(ev_less) >= (unsigned long) inject_retval);
+ assert(sizeof(ev_zero) >= (unsigned long) inject_retval);
+ assert(sizeof(key) >= (unsigned long) inject_retval);
struct {
struct evdev_check check;
- void *ptr;
+ const void *ptr;
} a[] = {
{ { ARG_STR(EVIOCGID), id, print_input_id }, NULL },
{ { ARG_STR(EVIOCGABS(ABS_X)), absinfo, print_input_absinfo }, NULL },
{ { ARG_STR(EVIOCGABS(ABS_Y)), absinfo, print_input_absinfo }, NULL },
{ { ARG_STR(EVIOCGABS(ABS_Y)), absinfo, print_input_absinfo }, NULL },
- { { ARG_STR(EVIOCGBIT(0, 0)), ev_more, print_getbit }, &ev_more_str },
- { { ARG_STR(EVIOCGBIT(0, 0)), ev_less, print_getbit }, &ev_less_str },
+ { { ARG_STR(EVIOCGBIT(0, 0)), ev_more, print_getbit },
+ inject_retval * 8 <= EV_LED
+ ? (const void *) &ev_more_str_2
+ : (const void *) &ev_more_str_3 },
+ { { ARG_STR(EVIOCGBIT(0, 0)), ev_less, print_getbit },
+ inject_retval * 8 <= EV_LED
+ ? (const void *) &ev_less_str_2
+ : (const void *) &ev_less_str_3 },
{ { ARG_STR(EVIOCGBIT(0, 0)), ev_zero, print_getbit }, &ev_zero_str },
- { { ARG_STR(EVIOCGBIT(EV_KEY, 0)), key, print_getbit }, &key_str},
+ { { ARG_STR(EVIOCGBIT(EV_KEY, 0)), key, print_getbit },
+ inject_retval * 8 <= KEY_F12
+ ? (const void *) &key_str_8
+ : (const void *) &key_str_16 },
# ifdef EVIOCGMTSLOTS
{ { ARG_STR(EVIOCGMTSLOTS(12)), mtslots, print_mtslots }, &mtslots_str },
{ { ARG_STR(EVIOCGMTSLOTS(8)), invalid_mtslot, print_mtslots }, &invalid_mtslot_str }
Index: strace-4.24/tests/ioctl_evdev-success.test
===================================================================
--- strace-4.24.orig/tests/ioctl_evdev-success.test 2019-08-01 18:40:58.009521546 +0200
+++ strace-4.24/tests/ioctl_evdev-success.test 2019-08-01 19:21:32.298062205 +0200
@@ -3,11 +3,14 @@
. "${srcdir=.}/scno_tampering.sh"
: ${IOCTL_INJECT_START=256}
-: ${IOCTL_INJECT_RETVAL=8}
run_prog
-run_strace -a16 -e trace=ioctl \
- -e inject=ioctl:retval="${IOCTL_INJECT_RETVAL}":when="${IOCTL_INJECT_START}+" \
- ../ioctl_evdev-success "${IOCTL_INJECT_START}" "${IOCTL_INJECT_RETVAL}"> "$EXP"
-grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT"
-match_diff "$OUT" "$EXP"
+
+for ret in 0 2 8 15 16; do
+ run_strace -a16 -e trace=ioctl \
+ -e inject=ioctl:retval="${ret}":when="${IOCTL_INJECT_START}+" \
+ ../ioctl_evdev-success \
+ "${IOCTL_INJECT_START}" "${ret}"> "$EXP.${ret}"
+ grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT.$ret"
+ match_diff "$OUT.$ret" "$EXP.$ret"
+done
Index: strace-4.24/tests-m32/ioctl_evdev-success-v.test
===================================================================
--- strace-4.24.orig/tests-m32/ioctl_evdev-success-v.test 2019-08-01 18:40:58.009521546 +0200
+++ strace-4.24/tests-m32/ioctl_evdev-success-v.test 2019-08-01 19:21:32.298062205 +0200
@@ -3,11 +3,14 @@
. "${srcdir=.}/scno_tampering.sh"
: ${IOCTL_INJECT_START=256}
-: ${IOCTL_INJECT_RETVAL=8}
run_prog
-run_strace -a16 -v -e trace=ioctl \
- -e inject=ioctl:retval="${IOCTL_INJECT_RETVAL}":when="${IOCTL_INJECT_START}+" \
- ../ioctl_evdev-success-v "${IOCTL_INJECT_START}" "${IOCTL_INJECT_RETVAL}"> "$EXP"
-grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT"
-match_diff "$OUT" "$EXP"
+
+for ret in 0 2 8 15 16; do
+ run_strace -a16 -v -e trace=ioctl \
+ -e inject=ioctl:retval="${ret}":when="${IOCTL_INJECT_START}+" \
+ ../ioctl_evdev-success-v \
+ "${IOCTL_INJECT_START}" "${ret}"> "$EXP.$ret"
+ grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT.$ret"
+ match_diff "$OUT.$ret" "$EXP.$ret"
+done
Index: strace-4.24/tests-m32/ioctl_evdev-success.test
===================================================================
--- strace-4.24.orig/tests-m32/ioctl_evdev-success.test 2019-08-01 18:40:58.009521546 +0200
+++ strace-4.24/tests-m32/ioctl_evdev-success.test 2019-08-01 19:21:32.298062205 +0200
@@ -3,11 +3,14 @@
. "${srcdir=.}/scno_tampering.sh"
: ${IOCTL_INJECT_START=256}
-: ${IOCTL_INJECT_RETVAL=8}
run_prog
-run_strace -a16 -e trace=ioctl \
- -e inject=ioctl:retval="${IOCTL_INJECT_RETVAL}":when="${IOCTL_INJECT_START}+" \
- ../ioctl_evdev-success "${IOCTL_INJECT_START}" "${IOCTL_INJECT_RETVAL}"> "$EXP"
-grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT"
-match_diff "$OUT" "$EXP"
+
+for ret in 0 2 8 15 16; do
+ run_strace -a16 -e trace=ioctl \
+ -e inject=ioctl:retval="${ret}":when="${IOCTL_INJECT_START}+" \
+ ../ioctl_evdev-success \
+ "${IOCTL_INJECT_START}" "${ret}"> "$EXP.${ret}"
+ grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT.$ret"
+ match_diff "$OUT.$ret" "$EXP.$ret"
+done
Index: strace-4.24/tests-mx32/ioctl_evdev-success-v.test
===================================================================
--- strace-4.24.orig/tests-mx32/ioctl_evdev-success-v.test 2019-08-01 18:40:58.009521546 +0200
+++ strace-4.24/tests-mx32/ioctl_evdev-success-v.test 2019-08-01 19:21:32.298062205 +0200
@@ -3,11 +3,14 @@
. "${srcdir=.}/scno_tampering.sh"
: ${IOCTL_INJECT_START=256}
-: ${IOCTL_INJECT_RETVAL=8}
run_prog
-run_strace -a16 -v -e trace=ioctl \
- -e inject=ioctl:retval="${IOCTL_INJECT_RETVAL}":when="${IOCTL_INJECT_START}+" \
- ../ioctl_evdev-success-v "${IOCTL_INJECT_START}" "${IOCTL_INJECT_RETVAL}"> "$EXP"
-grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT"
-match_diff "$OUT" "$EXP"
+
+for ret in 0 2 8 15 16; do
+ run_strace -a16 -v -e trace=ioctl \
+ -e inject=ioctl:retval="${ret}":when="${IOCTL_INJECT_START}+" \
+ ../ioctl_evdev-success-v \
+ "${IOCTL_INJECT_START}" "${ret}"> "$EXP.$ret"
+ grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT.$ret"
+ match_diff "$OUT.$ret" "$EXP.$ret"
+done
Index: strace-4.24/tests-mx32/ioctl_evdev-success.test
===================================================================
--- strace-4.24.orig/tests-mx32/ioctl_evdev-success.test 2019-08-01 18:40:58.009521546 +0200
+++ strace-4.24/tests-mx32/ioctl_evdev-success.test 2019-08-01 19:21:32.299062192 +0200
@@ -3,11 +3,14 @@
. "${srcdir=.}/scno_tampering.sh"
: ${IOCTL_INJECT_START=256}
-: ${IOCTL_INJECT_RETVAL=8}
run_prog
-run_strace -a16 -e trace=ioctl \
- -e inject=ioctl:retval="${IOCTL_INJECT_RETVAL}":when="${IOCTL_INJECT_START}+" \
- ../ioctl_evdev-success "${IOCTL_INJECT_START}" "${IOCTL_INJECT_RETVAL}"> "$EXP"
-grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT"
-match_diff "$OUT" "$EXP"
+
+for ret in 0 2 8 15 16; do
+ run_strace -a16 -e trace=ioctl \
+ -e inject=ioctl:retval="${ret}":when="${IOCTL_INJECT_START}+" \
+ ../ioctl_evdev-success \
+ "${IOCTL_INJECT_START}" "${ret}"> "$EXP.${ret}"
+ grep -v '^ioctl([012][,<]' < "$LOG" > "$OUT.$ret"
+ match_diff "$OUT.$ret" "$EXP.$ret"
+done
Index: strace-4.24/tests-m32/ioctl_evdev-success.c
===================================================================
--- strace-4.24.orig/tests-m32/ioctl_evdev-success.c 2019-08-01 18:40:58.009521546 +0200
+++ strace-4.24/tests-m32/ioctl_evdev-success.c 2019-08-29 12:09:27.898700830 +0200
@@ -2,6 +2,7 @@
#ifdef HAVE_LINUX_INPUT_H
+# include <assert.h>
# include <inttypes.h>
# include <stdio.h>
# include <stdlib.h>
@@ -9,17 +10,19 @@
# include <linux/input.h>
# include "print_fields.h"
+# define NUM_WORDS 4
+
static const char *errstr;
struct evdev_check {
unsigned long cmd;
const char *cmd_str;
- void *arg_ptr;
- void (*print_arg)(long rc, void *ptr, void *arg);
+ const void *arg_ptr;
+ void (*print_arg)(long rc, const void *ptr, const void *arg);
};
static long
-invoke_test_syscall(unsigned long cmd, void *p)
+invoke_test_syscall(unsigned long cmd, const void *p)
{
long rc = ioctl(-1, cmd, p);
errstr = sprintrc(rc);
@@ -31,7 +34,7 @@
}
static void
-test_evdev(struct evdev_check *check, void *arg)
+test_evdev(struct evdev_check *check, const void *arg)
{
long rc = invoke_test_syscall(check->cmd, check->arg_ptr);
printf("ioctl(-1, %s, ", check->cmd_str);
@@ -43,9 +46,9 @@
}
static void
-print_input_absinfo(long rc, void *ptr, void *arg)
+print_input_absinfo(long rc, const void *ptr, const void *arg)
{
- struct input_absinfo *absinfo = ptr;
+ const struct input_absinfo *absinfo = ptr;
if (rc < 0) {
printf("%p", absinfo);
@@ -67,9 +70,9 @@
}
static void
-print_input_id(long rc, void *ptr, void *arg)
+print_input_id(long rc, const void *ptr, const void *arg)
{
- struct input_id *id = ptr;
+ const struct input_id *id = ptr;
if (rc < 0) {
printf("%p", id);
@@ -84,10 +87,10 @@
# ifdef EVIOCGMTSLOTS
static void
-print_mtslots(long rc, void *ptr, void *arg)
+print_mtslots(long rc, const void *ptr, const void *arg)
{
- int *buffer = ptr;
- const char **str = arg;
+ const int *buffer = ptr;
+ const char * const * str = arg;
int num = atoi(*(str + 1));
if (rc < 0) {
@@ -104,27 +107,26 @@
# endif
static void
-print_getbit(long rc, void *ptr, void *arg)
+print_getbit(long rc, const void *ptr, const void *arg)
{
- const char **str = arg;
- int num = atoi(*str);
+ const char * const *str = arg;
- if (rc < 0) {
+ if (rc <= 0) {
printf("%p", ptr);
return;
}
printf("[");
- printf("%s", *(str + 1));
- for (unsigned int i = 2; i <= (unsigned) num; i++) {
+ for (unsigned long i = 0; str[i]; i++) {
# if ! VERBOSE
- if (i > 4) {
+ if (i >= 4) {
printf(", ...");
break;
}
# endif
- printf(", ");
- printf("%s", *(str + i));
+ if (i)
+ printf(", ");
+ printf("%s", str[i]);
}
printf("]");
}
@@ -170,6 +172,7 @@
TAIL_ALLOC_OBJECT_CONST_PTR(struct input_id, id);
TAIL_ALLOC_OBJECT_CONST_PTR(struct input_absinfo, absinfo);
TAIL_ALLOC_OBJECT_CONST_PTR(int, bad_addr_slot);
+
# ifdef EVIOCGMTSLOTS
int mtslots[] = { ABS_MT_SLOT, 1, 3 };
/* we use the second element to indicate the number of values */
@@ -183,36 +186,65 @@
const char *invalid_mtslot_str[] = { invalid_str, "1", "1" };
# endif
+ enum { ULONG_BIT = sizeof(unsigned long) * 8 };
+
/* set more than 4 bits */
- unsigned long ev_more[] = { 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED | 1 << EV_SND | 1 << EV_PWR };
- /* we use the first element to indicate the number of set bits */
- /* ev_more_str[0] is "5" so the number of set bits is 5 */
- const char *ev_more_str[] = { "5", "EV_ABS", "EV_MSC", "EV_LED", "EV_SND", "EV_PWR" };
+ static const unsigned long ev_more[NUM_WORDS] = {
+ 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED | 1 << EV_SND
+ | 1 << EV_PWR };
+ static const char * const ev_more_str_2[] = {
+ "EV_ABS", "EV_MSC", NULL };
+ static const char * const ev_more_str_3[] = {
+ "EV_ABS", "EV_MSC", "EV_LED", "EV_SND", "EV_PWR", NULL };
/* set less than 4 bits */
- unsigned long ev_less[] = { 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED };
- const char *ev_less_str[] = { "3", "EV_ABS", "EV_MSC", "EV_LED" };
+ static const unsigned long ev_less[NUM_WORDS] = {
+ 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED };
+ static const char * const ev_less_str_2[] = {
+ "EV_ABS", "EV_MSC", NULL };
+ static const char * const ev_less_str_3[] = {
+ "EV_ABS", "EV_MSC", "EV_LED", NULL };
/* set zero bit */
- unsigned long ev_zero[] = { 0x0 };
- const char *ev_zero_str[] = { "0", " 0 " };
+ static const unsigned long ev_zero[NUM_WORDS] = { 0x0 };
+ static const char * const ev_zero_str[] = { " 0 ", NULL };
/* KEY_MAX is 0x2ff which is greater than retval * 8 */
- unsigned long key[] = { 1 << KEY_1 | 1 << KEY_2, 0 };
- const char *key_str[] = { "2", "KEY_1", "KEY_2" };
+ static const unsigned long key[NUM_WORDS] = {
+ 1 << KEY_1 | 1 << KEY_2,
+ [ KEY_F12 / ULONG_BIT ] = 1 << (KEY_F12 % ULONG_BIT) };
+
+ static const char * const key_str_8[] = {
+ "KEY_1", "KEY_2", NULL };
+ static const char * const key_str_16[] = {
+ "KEY_1", "KEY_2", "KEY_F12", NULL };
+
+ assert(sizeof(ev_more) >= (unsigned long) inject_retval);
+ assert(sizeof(ev_less) >= (unsigned long) inject_retval);
+ assert(sizeof(ev_zero) >= (unsigned long) inject_retval);
+ assert(sizeof(key) >= (unsigned long) inject_retval);
struct {
struct evdev_check check;
- void *ptr;
+ const void *ptr;
} a[] = {
{ { ARG_STR(EVIOCGID), id, print_input_id }, NULL },
{ { ARG_STR(EVIOCGABS(ABS_X)), absinfo, print_input_absinfo }, NULL },
{ { ARG_STR(EVIOCGABS(ABS_Y)), absinfo, print_input_absinfo }, NULL },
{ { ARG_STR(EVIOCGABS(ABS_Y)), absinfo, print_input_absinfo }, NULL },
- { { ARG_STR(EVIOCGBIT(0, 0)), ev_more, print_getbit }, &ev_more_str },
- { { ARG_STR(EVIOCGBIT(0, 0)), ev_less, print_getbit }, &ev_less_str },
+ { { ARG_STR(EVIOCGBIT(0, 0)), ev_more, print_getbit },
+ inject_retval * 8 <= EV_LED
+ ? (const void *) &ev_more_str_2
+ : (const void *) &ev_more_str_3 },
+ { { ARG_STR(EVIOCGBIT(0, 0)), ev_less, print_getbit },
+ inject_retval * 8 <= EV_LED
+ ? (const void *) &ev_less_str_2
+ : (const void *) &ev_less_str_3 },
{ { ARG_STR(EVIOCGBIT(0, 0)), ev_zero, print_getbit }, &ev_zero_str },
- { { ARG_STR(EVIOCGBIT(EV_KEY, 0)), key, print_getbit }, &key_str},
+ { { ARG_STR(EVIOCGBIT(EV_KEY, 0)), key, print_getbit },
+ inject_retval * 8 <= KEY_F12
+ ? (const void *) &key_str_8
+ : (const void *) &key_str_16 },
# ifdef EVIOCGMTSLOTS
{ { ARG_STR(EVIOCGMTSLOTS(12)), mtslots, print_mtslots }, &mtslots_str },
{ { ARG_STR(EVIOCGMTSLOTS(8)), invalid_mtslot, print_mtslots }, &invalid_mtslot_str }
Index: strace-4.24/tests-mx32/ioctl_evdev-success.c
===================================================================
--- strace-4.24.orig/tests-mx32/ioctl_evdev-success.c 2019-08-01 18:40:58.009521546 +0200
+++ strace-4.24/tests-mx32/ioctl_evdev-success.c 2019-08-29 12:09:30.350669261 +0200
@@ -2,6 +2,7 @@
#ifdef HAVE_LINUX_INPUT_H
+# include <assert.h>
# include <inttypes.h>
# include <stdio.h>
# include <stdlib.h>
@@ -9,17 +10,19 @@
# include <linux/input.h>
# include "print_fields.h"
+# define NUM_WORDS 4
+
static const char *errstr;
struct evdev_check {
unsigned long cmd;
const char *cmd_str;
- void *arg_ptr;
- void (*print_arg)(long rc, void *ptr, void *arg);
+ const void *arg_ptr;
+ void (*print_arg)(long rc, const void *ptr, const void *arg);
};
static long
-invoke_test_syscall(unsigned long cmd, void *p)
+invoke_test_syscall(unsigned long cmd, const void *p)
{
long rc = ioctl(-1, cmd, p);
errstr = sprintrc(rc);
@@ -31,7 +34,7 @@
}
static void
-test_evdev(struct evdev_check *check, void *arg)
+test_evdev(struct evdev_check *check, const void *arg)
{
long rc = invoke_test_syscall(check->cmd, check->arg_ptr);
printf("ioctl(-1, %s, ", check->cmd_str);
@@ -43,9 +46,9 @@
}
static void
-print_input_absinfo(long rc, void *ptr, void *arg)
+print_input_absinfo(long rc, const void *ptr, const void *arg)
{
- struct input_absinfo *absinfo = ptr;
+ const struct input_absinfo *absinfo = ptr;
if (rc < 0) {
printf("%p", absinfo);
@@ -67,9 +70,9 @@
}
static void
-print_input_id(long rc, void *ptr, void *arg)
+print_input_id(long rc, const void *ptr, const void *arg)
{
- struct input_id *id = ptr;
+ const struct input_id *id = ptr;
if (rc < 0) {
printf("%p", id);
@@ -84,10 +87,10 @@
# ifdef EVIOCGMTSLOTS
static void
-print_mtslots(long rc, void *ptr, void *arg)
+print_mtslots(long rc, const void *ptr, const void *arg)
{
- int *buffer = ptr;
- const char **str = arg;
+ const int *buffer = ptr;
+ const char * const * str = arg;
int num = atoi(*(str + 1));
if (rc < 0) {
@@ -104,27 +107,26 @@
# endif
static void
-print_getbit(long rc, void *ptr, void *arg)
+print_getbit(long rc, const void *ptr, const void *arg)
{
- const char **str = arg;
- int num = atoi(*str);
+ const char * const *str = arg;
- if (rc < 0) {
+ if (rc <= 0) {
printf("%p", ptr);
return;
}
printf("[");
- printf("%s", *(str + 1));
- for (unsigned int i = 2; i <= (unsigned) num; i++) {
+ for (unsigned long i = 0; str[i]; i++) {
# if ! VERBOSE
- if (i > 4) {
+ if (i >= 4) {
printf(", ...");
break;
}
# endif
- printf(", ");
- printf("%s", *(str + i));
+ if (i)
+ printf(", ");
+ printf("%s", str[i]);
}
printf("]");
}
@@ -170,6 +172,7 @@
TAIL_ALLOC_OBJECT_CONST_PTR(struct input_id, id);
TAIL_ALLOC_OBJECT_CONST_PTR(struct input_absinfo, absinfo);
TAIL_ALLOC_OBJECT_CONST_PTR(int, bad_addr_slot);
+
# ifdef EVIOCGMTSLOTS
int mtslots[] = { ABS_MT_SLOT, 1, 3 };
/* we use the second element to indicate the number of values */
@@ -183,36 +186,65 @@
const char *invalid_mtslot_str[] = { invalid_str, "1", "1" };
# endif
+ enum { ULONG_BIT = sizeof(unsigned long) * 8 };
+
/* set more than 4 bits */
- unsigned long ev_more[] = { 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED | 1 << EV_SND | 1 << EV_PWR };
- /* we use the first element to indicate the number of set bits */
- /* ev_more_str[0] is "5" so the number of set bits is 5 */
- const char *ev_more_str[] = { "5", "EV_ABS", "EV_MSC", "EV_LED", "EV_SND", "EV_PWR" };
+ static const unsigned long ev_more[NUM_WORDS] = {
+ 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED | 1 << EV_SND
+ | 1 << EV_PWR };
+ static const char * const ev_more_str_2[] = {
+ "EV_ABS", "EV_MSC", NULL };
+ static const char * const ev_more_str_3[] = {
+ "EV_ABS", "EV_MSC", "EV_LED", "EV_SND", "EV_PWR", NULL };
/* set less than 4 bits */
- unsigned long ev_less[] = { 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED };
- const char *ev_less_str[] = { "3", "EV_ABS", "EV_MSC", "EV_LED" };
+ static const unsigned long ev_less[NUM_WORDS] = {
+ 1 << EV_ABS | 1 << EV_MSC | 1 << EV_LED };
+ static const char * const ev_less_str_2[] = {
+ "EV_ABS", "EV_MSC", NULL };
+ static const char * const ev_less_str_3[] = {
+ "EV_ABS", "EV_MSC", "EV_LED", NULL };
/* set zero bit */
- unsigned long ev_zero[] = { 0x0 };
- const char *ev_zero_str[] = { "0", " 0 " };
+ static const unsigned long ev_zero[NUM_WORDS] = { 0x0 };
+ static const char * const ev_zero_str[] = { " 0 ", NULL };
/* KEY_MAX is 0x2ff which is greater than retval * 8 */
- unsigned long key[] = { 1 << KEY_1 | 1 << KEY_2, 0 };
- const char *key_str[] = { "2", "KEY_1", "KEY_2" };
+ static const unsigned long key[NUM_WORDS] = {
+ 1 << KEY_1 | 1 << KEY_2,
+ [ KEY_F12 / ULONG_BIT ] = 1 << (KEY_F12 % ULONG_BIT) };
+
+ static const char * const key_str_8[] = {
+ "KEY_1", "KEY_2", NULL };
+ static const char * const key_str_16[] = {
+ "KEY_1", "KEY_2", "KEY_F12", NULL };
+
+ assert(sizeof(ev_more) >= (unsigned long) inject_retval);
+ assert(sizeof(ev_less) >= (unsigned long) inject_retval);
+ assert(sizeof(ev_zero) >= (unsigned long) inject_retval);
+ assert(sizeof(key) >= (unsigned long) inject_retval);
struct {
struct evdev_check check;
- void *ptr;
+ const void *ptr;
} a[] = {
{ { ARG_STR(EVIOCGID), id, print_input_id }, NULL },
{ { ARG_STR(EVIOCGABS(ABS_X)), absinfo, print_input_absinfo }, NULL },
{ { ARG_STR(EVIOCGABS(ABS_Y)), absinfo, print_input_absinfo }, NULL },
{ { ARG_STR(EVIOCGABS(ABS_Y)), absinfo, print_input_absinfo }, NULL },
- { { ARG_STR(EVIOCGBIT(0, 0)), ev_more, print_getbit }, &ev_more_str },
- { { ARG_STR(EVIOCGBIT(0, 0)), ev_less, print_getbit }, &ev_less_str },
+ { { ARG_STR(EVIOCGBIT(0, 0)), ev_more, print_getbit },
+ inject_retval * 8 <= EV_LED
+ ? (const void *) &ev_more_str_2
+ : (const void *) &ev_more_str_3 },
+ { { ARG_STR(EVIOCGBIT(0, 0)), ev_less, print_getbit },
+ inject_retval * 8 <= EV_LED
+ ? (const void *) &ev_less_str_2
+ : (const void *) &ev_less_str_3 },
{ { ARG_STR(EVIOCGBIT(0, 0)), ev_zero, print_getbit }, &ev_zero_str },
- { { ARG_STR(EVIOCGBIT(EV_KEY, 0)), key, print_getbit }, &key_str},
+ { { ARG_STR(EVIOCGBIT(EV_KEY, 0)), key, print_getbit },
+ inject_retval * 8 <= KEY_F12
+ ? (const void *) &key_str_8
+ : (const void *) &key_str_16 },
# ifdef EVIOCGMTSLOTS
{ { ARG_STR(EVIOCGMTSLOTS(12)), mtslots, print_mtslots }, &mtslots_str },
{ { ARG_STR(EVIOCGMTSLOTS(8)), invalid_mtslot, print_mtslots }, &invalid_mtslot_str }

View File

@ -0,0 +1,37 @@
From f476724ea13d6fae08219aba75a7669eb3e836b3 Mon Sep 17 00:00:00 2001
From: Janosch Frank <frankja@linux.ibm.com>
Date: Fri, 30 Nov 2018 16:41:39 +0100
Subject: [PATCH] s390x: beautify sthyi data tail prints
The test already expects a ", " before the print of struct
padding. Let's add it to s390.c to make the output look a bit nicer and
fix test runs on z/VM that have padding at the end of the STHYI structs.
* s390.c (decode_ebcdic): Add missing comma.
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
---
s390.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/s390.c b/s390.c
index 422c08d..a00c274 100644
--- a/s390.c
+++ b/s390.c
@@ -472,10 +472,12 @@ decode_ebcdic(const char *ebcdic, char *ascii, size_t size)
do { \
if ((size_) > sizeof(*(hdr_)) && \
!is_filled((char *) ((hdr_) + 1), '\0', \
- (size_) - sizeof(*(hdr_)))) \
+ (size_) - sizeof(*(hdr_)))) { \
+ tprints(", "); \
print_quoted_string((char *) ((hdr_) + 1), \
(size_) - sizeof(*(hdr_)), \
QUOTE_FORCE_HEX); \
+ } \
} while (0)
static void
--
2.1.4

View File

@ -0,0 +1,32 @@
From 91281fec7823f1cd3df3374fbcbd14af52a3fa1b Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Wed, 14 Aug 2019 17:15:47 +0200
Subject: [PATCH] v4l2: avoid shifting left a signed number by 31 bit
cppcheck warns about it with the following diagnostics:
error[shiftTooManyBitsSigned]: Shifting signed 32-bit value by 31 bits is
undefined behaviour
* v4l2.c [!v4l2_fourcc_be] (v4l2_fourcc_be): Shift left 1U and not 1 in
order to get 0x80000000.
---
v4l2.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/v4l2.c b/v4l2.c
index 5da457c..505e7b8 100644
--- a/v4l2.c
+++ b/v4l2.c
@@ -47,7 +47,7 @@ typedef struct v4l2_standard struct_v4l2_standard;
/* v4l2_fourcc_be was added by Linux commit v3.18-rc1~101^2^2~127 */
#ifndef v4l2_fourcc_be
-# define v4l2_fourcc_be(a, b, c, d) (v4l2_fourcc(a, b, c, d) | (1 << 31))
+# define v4l2_fourcc_be(a, b, c, d) (v4l2_fourcc(a, b, c, d) | (1U << 31))
#endif
#define FMT_FRACT "%u/%u"
--
2.1.4

View File

@ -0,0 +1,55 @@
From 522ad3a0e73148dadd2480cd9cec84d9112b2e57 Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Tue, 4 Sep 2018 14:48:13 +0200
Subject: [PATCH] syscall.c: avoid infinite loop in subcalls parsing
clang complains about it, so it might be a good reason to refactor it
into something more linear.
* syscall.c (syscall_entering_decode): Put syscall subcall decoding
before ipc/socket subcall decoding, remove the loop.
---
syscall.c | 19 ++++++-------------
1 file changed, 6 insertions(+), 13 deletions(-)
diff --git a/syscall.c b/syscall.c
index bae7343..a67d744 100644
--- a/syscall.c
+++ b/syscall.c
@@ -579,11 +579,13 @@ syscall_entering_decode(struct tcb *tcp)
return res;
}
+# ifdef SYS_syscall_subcall
+ if (tcp_sysent(tcp)->sen == SEN_syscall)
+ decode_syscall_subcall(tcp);
+# endif
#if defined SYS_ipc_subcall \
- || defined SYS_socket_subcall \
- || defined SYS_syscall_subcall
- for (;;) {
- switch (tcp_sysent(tcp)->sen) {
+ || defined SYS_socket_subcall
+ switch (tcp_sysent(tcp)->sen) {
# ifdef SYS_ipc_subcall
case SEN_ipc:
decode_ipc_subcall(tcp);
@@ -594,15 +596,6 @@ syscall_entering_decode(struct tcb *tcp)
decode_socket_subcall(tcp);
break;
# endif
-# ifdef SYS_syscall_subcall
- case SEN_syscall:
- decode_syscall_subcall(tcp);
- if (tcp_sysent(tcp)->sen != SEN_syscall)
- continue;
- break;
-# endif
- }
- break;
}
#endif
--
2.1.4

View File

@ -0,0 +1,36 @@
From 9446038e9face3313373ca5f7539476789fd4660 Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Tue, 18 Dec 2018 05:37:30 +0100
Subject: [PATCH] kvm: avoid bogus vcpu_info assignment in vcpu_register
Also reformat code a bit to make nesting a bit clearer.
Reported by Clang.
* kvm.c (vcpu_register): Do not assign vcpu_alloc result to vcpu_info
as this value is not used afterwards in the function.
---
kvm.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/kvm.c b/kvm.c
index 984a75e..8bdf1cc 100644
--- a/kvm.c
+++ b/kvm.c
@@ -76,10 +76,9 @@ vcpu_register(struct tcb *const tcp, int fd, int cpuid)
struct vcpu_info *vcpu_info = vcpu_find(tcp, fd);
- if (!vcpu_info)
- vcpu_info = vcpu_alloc(tcp, fd, cpuid);
- else if (vcpu_info->cpuid != cpuid)
- {
+ if (!vcpu_info) {
+ vcpu_alloc(tcp, fd, cpuid);
+ } else if (vcpu_info->cpuid != cpuid) {
vcpu_info->cpuid = cpuid;
vcpu_info->resolved = false;
}
--
2.1.4

View File

@ -0,0 +1,365 @@
From c26541c73c3b4be2977e719d77287255eb346cdf Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Thu, 17 Oct 2019 13:13:45 +0200
Subject: [PATCH] xlat: use unsgined type for mount_flags fallback values
Reported by cppcheck:
strace/xlat/mount_flags.h:256: error[shiftTooManyBitsSigned]:
Shifting signed 32-bit value by 31 bits is undefined behaviour
# 254| XLAT(MS_BORN),
# 255| XLAT(MS_ACTIVE),
# 256|-> XLAT(MS_NOUSER),
# 257| XLAT_END
# 258| };
* xlat/mount_flags.in: Use 1U instead of 1 as a bit shifting operand.
References: https://bugzilla.redhat.com/show_bug.cgi?id=1747524
---
xlat/mount_flags.in | 60 ++++++++++++++++++++++++++---------------------------
1 file changed, 30 insertions(+), 30 deletions(-)
Index: strace-4.24/xlat/mount_flags.in
===================================================================
--- strace-4.24.orig/xlat/mount_flags.in 2018-04-24 02:35:27.000000000 +0200
+++ strace-4.24/xlat/mount_flags.in 2019-12-02 18:37:39.403710911 +0100
@@ -1,30 +1,30 @@
-MS_RDONLY 1
-MS_NOSUID 2
-MS_NODEV 4
-MS_NOEXEC 8
-MS_SYNCHRONOUS 16
-MS_REMOUNT 32
-MS_MANDLOCK 64
-MS_DIRSYNC 128
-MS_NOATIME 1024
-MS_NODIRATIME 2048
-MS_BIND 4096
-MS_MOVE 8192
-MS_REC 16384
-MS_SILENT 32768
-MS_POSIXACL (1<<16)
-MS_UNBINDABLE (1<<17)
-MS_PRIVATE (1<<18)
-MS_SLAVE (1<<19)
-MS_SHARED (1<<20)
-MS_RELATIME (1<<21)
-MS_KERNMOUNT (1<<22)
-MS_I_VERSION (1<<23)
-MS_STRICTATIME (1<<24)
-MS_LAZYTIME (1<<25)
-MS_SUBMOUNT (1<<26)
-MS_NOREMOTELOCK (1<<27)
-MS_NOSEC (1<<28)
-MS_BORN (1<<29)
-MS_ACTIVE (1<<30)
-MS_NOUSER (1<<31)
+MS_RDONLY (1U<<0)
+MS_NOSUID (1U<<1)
+MS_NODEV (1U<<2)
+MS_NOEXEC (1U<<3)
+MS_SYNCHRONOUS (1U<<4)
+MS_REMOUNT (1U<<5)
+MS_MANDLOCK (1U<<6)
+MS_DIRSYNC (1U<<7)
+MS_NOATIME (1U<<10)
+MS_NODIRATIME (1U<<11)
+MS_BIND (1U<<12)
+MS_MOVE (1U<<13)
+MS_REC (1U<<14)
+MS_SILENT (1U<<15)
+MS_POSIXACL (1U<<16)
+MS_UNBINDABLE (1U<<17)
+MS_PRIVATE (1U<<18)
+MS_SLAVE (1U<<19)
+MS_SHARED (1U<<20)
+MS_RELATIME (1U<<21)
+MS_KERNMOUNT (1U<<22)
+MS_I_VERSION (1U<<23)
+MS_STRICTATIME (1U<<24)
+MS_LAZYTIME (1U<<25)
+MS_SUBMOUNT (1U<<26)
+MS_NOREMOTELOCK (1U<<27)
+MS_NOSEC (1U<<28)
+MS_BORN (1U<<29)
+MS_ACTIVE (1U<<30)
+MS_NOUSER (1U<<31)
Index: strace-4.24/xlat/mount_flags.h
===================================================================
--- strace-4.24.orig/xlat/mount_flags.h 2018-08-14 02:44:19.000000000 +0200
+++ strace-4.24/xlat/mount_flags.h 2019-12-02 18:38:36.102900164 +0100
@@ -5,213 +5,213 @@
#if defined(MS_RDONLY) || (defined(HAVE_DECL_MS_RDONLY) && HAVE_DECL_MS_RDONLY)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_RDONLY) == (1), "MS_RDONLY != 1");
+static_assert((MS_RDONLY) == ((1U<<0)), "MS_RDONLY != (1U<<0)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_RDONLY 1
+# define MS_RDONLY (1U<<0)
#endif
#if defined(MS_NOSUID) || (defined(HAVE_DECL_MS_NOSUID) && HAVE_DECL_MS_NOSUID)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_NOSUID) == (2), "MS_NOSUID != 2");
+static_assert((MS_NOSUID) == ((1U<<1)), "MS_NOSUID != (1U<<1)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_NOSUID 2
+# define MS_NOSUID (1U<<1)
#endif
#if defined(MS_NODEV) || (defined(HAVE_DECL_MS_NODEV) && HAVE_DECL_MS_NODEV)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_NODEV) == (4), "MS_NODEV != 4");
+static_assert((MS_NODEV) == ((1U<<2)), "MS_NODEV != (1U<<2)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_NODEV 4
+# define MS_NODEV (1U<<2)
#endif
#if defined(MS_NOEXEC) || (defined(HAVE_DECL_MS_NOEXEC) && HAVE_DECL_MS_NOEXEC)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_NOEXEC) == (8), "MS_NOEXEC != 8");
+static_assert((MS_NOEXEC) == ((1U<<3)), "MS_NOEXEC != (1U<<3)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_NOEXEC 8
+# define MS_NOEXEC (1U<<3)
#endif
#if defined(MS_SYNCHRONOUS) || (defined(HAVE_DECL_MS_SYNCHRONOUS) && HAVE_DECL_MS_SYNCHRONOUS)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_SYNCHRONOUS) == (16), "MS_SYNCHRONOUS != 16");
+static_assert((MS_SYNCHRONOUS) == ((1U<<4)), "MS_SYNCHRONOUS != (1U<<4)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_SYNCHRONOUS 16
+# define MS_SYNCHRONOUS (1U<<4)
#endif
#if defined(MS_REMOUNT) || (defined(HAVE_DECL_MS_REMOUNT) && HAVE_DECL_MS_REMOUNT)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_REMOUNT) == (32), "MS_REMOUNT != 32");
+static_assert((MS_REMOUNT) == ((1U<<5)), "MS_REMOUNT != (1U<<5)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_REMOUNT 32
+# define MS_REMOUNT (1U<<5)
#endif
#if defined(MS_MANDLOCK) || (defined(HAVE_DECL_MS_MANDLOCK) && HAVE_DECL_MS_MANDLOCK)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_MANDLOCK) == (64), "MS_MANDLOCK != 64");
+static_assert((MS_MANDLOCK) == ((1U<<6)), "MS_MANDLOCK != (1U<<6)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_MANDLOCK 64
+# define MS_MANDLOCK (1U<<6)
#endif
#if defined(MS_DIRSYNC) || (defined(HAVE_DECL_MS_DIRSYNC) && HAVE_DECL_MS_DIRSYNC)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_DIRSYNC) == (128), "MS_DIRSYNC != 128");
+static_assert((MS_DIRSYNC) == ((1U<<7)), "MS_DIRSYNC != (1U<<7)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_DIRSYNC 128
+# define MS_DIRSYNC (1U<<7)
#endif
#if defined(MS_NOATIME) || (defined(HAVE_DECL_MS_NOATIME) && HAVE_DECL_MS_NOATIME)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_NOATIME) == (1024), "MS_NOATIME != 1024");
+static_assert((MS_NOATIME) == ((1U<<10)), "MS_NOATIME != (1U<<10)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_NOATIME 1024
+# define MS_NOATIME (1U<<10)
#endif
#if defined(MS_NODIRATIME) || (defined(HAVE_DECL_MS_NODIRATIME) && HAVE_DECL_MS_NODIRATIME)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_NODIRATIME) == (2048), "MS_NODIRATIME != 2048");
+static_assert((MS_NODIRATIME) == ((1U<<11)), "MS_NODIRATIME != (1U<<11)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_NODIRATIME 2048
+# define MS_NODIRATIME (1U<<11)
#endif
#if defined(MS_BIND) || (defined(HAVE_DECL_MS_BIND) && HAVE_DECL_MS_BIND)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_BIND) == (4096), "MS_BIND != 4096");
+static_assert((MS_BIND) == ((1U<<12)), "MS_BIND != (1U<<12)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_BIND 4096
+# define MS_BIND (1U<<12)
#endif
#if defined(MS_MOVE) || (defined(HAVE_DECL_MS_MOVE) && HAVE_DECL_MS_MOVE)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_MOVE) == (8192), "MS_MOVE != 8192");
+static_assert((MS_MOVE) == ((1U<<13)), "MS_MOVE != (1U<<13)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_MOVE 8192
+# define MS_MOVE (1U<<13)
#endif
#if defined(MS_REC) || (defined(HAVE_DECL_MS_REC) && HAVE_DECL_MS_REC)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_REC) == (16384), "MS_REC != 16384");
+static_assert((MS_REC) == ((1U<<14)), "MS_REC != (1U<<14)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_REC 16384
+# define MS_REC (1U<<14)
#endif
#if defined(MS_SILENT) || (defined(HAVE_DECL_MS_SILENT) && HAVE_DECL_MS_SILENT)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_SILENT) == (32768), "MS_SILENT != 32768");
+static_assert((MS_SILENT) == ((1U<<15)), "MS_SILENT != (1U<<15)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_SILENT 32768
+# define MS_SILENT (1U<<15)
#endif
#if defined(MS_POSIXACL) || (defined(HAVE_DECL_MS_POSIXACL) && HAVE_DECL_MS_POSIXACL)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_POSIXACL) == ((1<<16)), "MS_POSIXACL != (1<<16)");
+static_assert((MS_POSIXACL) == ((1U<<16)), "MS_POSIXACL != (1U<<16)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_POSIXACL (1<<16)
+# define MS_POSIXACL (1U<<16)
#endif
#if defined(MS_UNBINDABLE) || (defined(HAVE_DECL_MS_UNBINDABLE) && HAVE_DECL_MS_UNBINDABLE)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_UNBINDABLE) == ((1<<17)), "MS_UNBINDABLE != (1<<17)");
+static_assert((MS_UNBINDABLE) == ((1U<<17)), "MS_UNBINDABLE != (1U<<17)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_UNBINDABLE (1<<17)
+# define MS_UNBINDABLE (1U<<17)
#endif
#if defined(MS_PRIVATE) || (defined(HAVE_DECL_MS_PRIVATE) && HAVE_DECL_MS_PRIVATE)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_PRIVATE) == ((1<<18)), "MS_PRIVATE != (1<<18)");
+static_assert((MS_PRIVATE) == ((1U<<18)), "MS_PRIVATE != (1U<<18)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_PRIVATE (1<<18)
+# define MS_PRIVATE (1U<<18)
#endif
#if defined(MS_SLAVE) || (defined(HAVE_DECL_MS_SLAVE) && HAVE_DECL_MS_SLAVE)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_SLAVE) == ((1<<19)), "MS_SLAVE != (1<<19)");
+static_assert((MS_SLAVE) == ((1U<<19)), "MS_SLAVE != (1U<<19)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_SLAVE (1<<19)
+# define MS_SLAVE (1U<<19)
#endif
#if defined(MS_SHARED) || (defined(HAVE_DECL_MS_SHARED) && HAVE_DECL_MS_SHARED)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_SHARED) == ((1<<20)), "MS_SHARED != (1<<20)");
+static_assert((MS_SHARED) == ((1U<<20)), "MS_SHARED != (1U<<20)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_SHARED (1<<20)
+# define MS_SHARED (1U<<20)
#endif
#if defined(MS_RELATIME) || (defined(HAVE_DECL_MS_RELATIME) && HAVE_DECL_MS_RELATIME)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_RELATIME) == ((1<<21)), "MS_RELATIME != (1<<21)");
+static_assert((MS_RELATIME) == ((1U<<21)), "MS_RELATIME != (1U<<21)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_RELATIME (1<<21)
+# define MS_RELATIME (1U<<21)
#endif
#if defined(MS_KERNMOUNT) || (defined(HAVE_DECL_MS_KERNMOUNT) && HAVE_DECL_MS_KERNMOUNT)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_KERNMOUNT) == ((1<<22)), "MS_KERNMOUNT != (1<<22)");
+static_assert((MS_KERNMOUNT) == ((1U<<22)), "MS_KERNMOUNT != (1U<<22)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_KERNMOUNT (1<<22)
+# define MS_KERNMOUNT (1U<<22)
#endif
#if defined(MS_I_VERSION) || (defined(HAVE_DECL_MS_I_VERSION) && HAVE_DECL_MS_I_VERSION)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_I_VERSION) == ((1<<23)), "MS_I_VERSION != (1<<23)");
+static_assert((MS_I_VERSION) == ((1U<<23)), "MS_I_VERSION != (1U<<23)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_I_VERSION (1<<23)
+# define MS_I_VERSION (1U<<23)
#endif
#if defined(MS_STRICTATIME) || (defined(HAVE_DECL_MS_STRICTATIME) && HAVE_DECL_MS_STRICTATIME)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_STRICTATIME) == ((1<<24)), "MS_STRICTATIME != (1<<24)");
+static_assert((MS_STRICTATIME) == ((1U<<24)), "MS_STRICTATIME != (1U<<24)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_STRICTATIME (1<<24)
+# define MS_STRICTATIME (1U<<24)
#endif
#if defined(MS_LAZYTIME) || (defined(HAVE_DECL_MS_LAZYTIME) && HAVE_DECL_MS_LAZYTIME)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_LAZYTIME) == ((1<<25)), "MS_LAZYTIME != (1<<25)");
+static_assert((MS_LAZYTIME) == ((1U<<25)), "MS_LAZYTIME != (1U<<25)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_LAZYTIME (1<<25)
+# define MS_LAZYTIME (1U<<25)
#endif
#if defined(MS_SUBMOUNT) || (defined(HAVE_DECL_MS_SUBMOUNT) && HAVE_DECL_MS_SUBMOUNT)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_SUBMOUNT) == ((1<<26)), "MS_SUBMOUNT != (1<<26)");
+static_assert((MS_SUBMOUNT) == ((1U<<26)), "MS_SUBMOUNT != (1U<<26)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_SUBMOUNT (1<<26)
+# define MS_SUBMOUNT (1U<<26)
#endif
#if defined(MS_NOREMOTELOCK) || (defined(HAVE_DECL_MS_NOREMOTELOCK) && HAVE_DECL_MS_NOREMOTELOCK)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_NOREMOTELOCK) == ((1<<27)), "MS_NOREMOTELOCK != (1<<27)");
+static_assert((MS_NOREMOTELOCK) == ((1U<<27)), "MS_NOREMOTELOCK != (1U<<27)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_NOREMOTELOCK (1<<27)
+# define MS_NOREMOTELOCK (1U<<27)
#endif
#if defined(MS_NOSEC) || (defined(HAVE_DECL_MS_NOSEC) && HAVE_DECL_MS_NOSEC)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_NOSEC) == ((1<<28)), "MS_NOSEC != (1<<28)");
+static_assert((MS_NOSEC) == ((1U<<28)), "MS_NOSEC != (1U<<28)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_NOSEC (1<<28)
+# define MS_NOSEC (1U<<28)
#endif
#if defined(MS_BORN) || (defined(HAVE_DECL_MS_BORN) && HAVE_DECL_MS_BORN)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_BORN) == ((1<<29)), "MS_BORN != (1<<29)");
+static_assert((MS_BORN) == ((1U<<29)), "MS_BORN != (1U<<29)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_BORN (1<<29)
+# define MS_BORN (1U<<29)
#endif
#if defined(MS_ACTIVE) || (defined(HAVE_DECL_MS_ACTIVE) && HAVE_DECL_MS_ACTIVE)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_ACTIVE) == ((1<<30)), "MS_ACTIVE != (1<<30)");
+static_assert((MS_ACTIVE) == ((1U<<30)), "MS_ACTIVE != (1U<<30)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_ACTIVE (1<<30)
+# define MS_ACTIVE (1U<<30)
#endif
#if defined(MS_NOUSER) || (defined(HAVE_DECL_MS_NOUSER) && HAVE_DECL_MS_NOUSER)
DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE
-static_assert((MS_NOUSER) == ((1<<31)), "MS_NOUSER != (1<<31)");
+static_assert((MS_NOUSER) == ((1U<<31)), "MS_NOUSER != (1U<<31)");
DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE
#else
-# define MS_NOUSER (1<<31)
+# define MS_NOUSER (1U<<31)
#endif
#ifndef XLAT_MACROS_ONLY

View File

@ -0,0 +1,36 @@
From 69b2c33a77fa687feb41fafdbe187013aa812384 Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Tue, 7 Jan 2020 18:54:55 +0000
Subject: [PATCH] unwind-libdw: fix initialization of libdwfl cache
This fixes stack trace printing for early syscalls that precede
the first syscall from memory mapping or execve families.
* unwind-libdw.c (tcb_init): Set struct ctx.last_proc_updating
to a value different from mapping_generation so that libdwfl cache
is properly initialized before the first use.
* NEWS: Mention this fix.
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1788636
---
Backport changes:
- NEWS hunk has been dropped.
---
NEWS | 2 ++
unwind-libdw.c | 2 +-
2 files changed, 3 insertions(+), 1 deletion(-)
Index: strace-4.24/unwind-libdw.c
===================================================================
--- strace-4.24.orig/unwind-libdw.c 2020-01-23 12:55:01.922338273 +0100
+++ strace-4.24/unwind-libdw.c 2020-01-23 12:55:06.131299136 +0100
@@ -69,7 +69,7 @@
struct ctx *ctx = xmalloc(sizeof(*ctx));
ctx->dwfl = dwfl;
- ctx->last_proc_updating = 0;
+ ctx->last_proc_updating = mapping_generation - 1;
return ctx;
}

View File

@ -0,0 +1,724 @@
From 8e515c744935fe67e6a1b941f4c5414472c163b7 Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Mon, 20 Jan 2020 16:19:40 +0100
Subject: [PATCH] tests: add strace-k-p test
Add a check of the stack unwinding for attached processes.
* tests/stack-fcall-attach.c: New file.
* tests/strace-k-p.expected: Likewise.
* tests/strace-k-p.test: New test.
* tests/Makefile.am (EXTRA_DIST): Add strace-k-p.expected and strace-k-p.test.
(STACKTRACE_TESTS): Add strace-k-p.test
(check_PROGRAMS): Add stack-fcall-attach.
(stack_fcall_attach_SOURCES): New variable.
* tests/stack-fcall.c: Include "tests.h" and <unistd.h>.
[!ATTACH_MODE] (ATTACH_MODE): Define to 0.
(main) [ATTACH_MODE]: Wait a bit.
* tests/strace-k.test: Add attach mode.
Complements: v5.4-18-g69b2c33 "unwind-libdw: fix initialization of libdwfl cache"
---
Backport changes:
* "SIGURG" line has been removed from tests/strace-k-p.expected, as it requires
v4.25~22 "Print stack traces on signals" and v4.25~21 "tests: check stack
unwinding for signals".
* "chdir" usage in tests/strace-k-p.expected has been replaced with "getpid",
as it is the syscall that was used in the stack-fcall.c at the time.
* Added the respective changes to tests/Makefile.in file.
* The changes to tests/stack-fcall-attach.c, tests/strace-k-p.expected,
tests/strace-k-p.test, tests/Makefile.am, tests/stack-fcall.c,
and tests/strace-k.test have been copied over to tests-m32 and tests-mx32
directories.
---
tests/Makefile.am | 8 +++++++-
tests/stack-fcall-attach.c | 2 ++
tests/stack-fcall.c | 11 +++++++++++
tests/strace-k-p.expected | 2 ++
tests/strace-k-p.test | 13 +++++++++++++
tests/strace-k.test | 17 ++++++++++++++++-
6 files changed, 51 insertions(+), 2 deletions(-)
create mode 100644 tests/stack-fcall-attach.c
create mode 100644 tests/strace-k-p.expected
create mode 100755 tests/strace-k-p.test
Index: strace-4.24/tests/Makefile.am
===================================================================
--- strace-4.24.orig/tests/Makefile.am 2020-01-23 14:58:43.424959638 +0100
+++ strace-4.24/tests/Makefile.am 2020-01-23 14:58:43.440959144 +0100
@@ -156,6 +156,7 @@
signal_receive \
sleep \
stack-fcall \
+ stack-fcall-attach \
stack-fcall-mangled \
threads-execve \
unblock_reset_raise \
@@ -198,6 +199,9 @@
stack_fcall_SOURCES = stack-fcall.c \
stack-fcall-0.c stack-fcall-1.c stack-fcall-2.c stack-fcall-3.c
+stack_fcall_attach_SOURCES = stack-fcall-attach.c \
+ stack-fcall-0.c stack-fcall-1.c stack-fcall-2.c stack-fcall-3.c
+
stack_fcall_mangled_SOURCES = stack-fcall-mangled.c \
stack-fcall-mangled-0.c stack-fcall-mangled-1.c \
stack-fcall-mangled-2.c stack-fcall-mangled-3.c
@@ -205,7 +209,7 @@
include gen_tests.am
if ENABLE_STACKTRACE
-STACKTRACE_TESTS = strace-k.test
+STACKTRACE_TESTS = strace-k.test strace-k-p.test
if USE_DEMANGLE
STACKTRACE_TESTS += strace-k-demangle.test
endif
@@ -423,6 +427,8 @@
strace-ff.expected \
strace-k-demangle.expected \
strace-k-demangle.test \
+ strace-k-p.expected \
+ strace-k-p.test \
strace-k.expected \
strace-k.test \
strace-r.expected \
Index: strace-4.24/tests/stack-fcall-attach.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests/stack-fcall-attach.c 2020-01-23 14:58:43.441959113 +0100
@@ -0,0 +1,2 @@
+#define ATTACH_MODE 1
+#include "stack-fcall.c"
Index: strace-4.24/tests/stack-fcall.c
===================================================================
--- strace-4.24.orig/tests/stack-fcall.c 2020-01-23 14:58:09.934993679 +0100
+++ strace-4.24/tests/stack-fcall.c 2020-01-23 14:58:43.441959113 +0100
@@ -1,7 +1,18 @@
+#include "tests.h"
+#include <unistd.h>
#include "stack-fcall.h"
+#ifndef ATTACH_MODE
+# define ATTACH_MODE 0
+#endif
+
int main(int argc, char **argv)
{
+#if ATTACH_MODE
+ /* sleep a bit to let the tracer time to catch up */
+ sleep(1);
+#endif
+
f0(argc);
return 0;
}
Index: strace-4.24/tests/strace-k-p.expected
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests/strace-k-p.expected 2020-01-23 16:23:03.932457826 +0100
@@ -0,0 +1 @@
+(__kernel_vsyscall )?(__)?getpid f3 f2 f1 f0 main
Index: strace-4.24/tests/strace-k-p.test
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests/strace-k-p.test 2020-01-23 14:58:43.441959113 +0100
@@ -0,0 +1,13 @@
+#!/bin/sh
+#
+# Check strace -k for attached tracees.
+#
+# Copyright (c) 2020 The strace developers.
+# All rights reserved.
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+ATTACH_MODE=1
+test_prog=../stack-fcall-attach
+
+. "${srcdir=.}"/strace-k.test
Index: strace-4.24/tests/strace-k.test
===================================================================
--- strace-4.24.orig/tests/strace-k.test 2020-01-23 14:58:43.001972698 +0100
+++ strace-4.24/tests/strace-k.test 2020-01-23 14:58:43.441959113 +0100
@@ -11,6 +11,8 @@
. "${srcdir=.}/init.sh"
+: "${ATTACH_MODE=0}"
+
# strace -k is implemented using /proc/$pid/maps
[ -f /proc/self/maps ] ||
framework_skip_ '/proc/self/maps is not available'
@@ -20,7 +22,19 @@
check_prog tr
run_prog "${test_prog=../stack-fcall}"
-run_strace -e getpid -k $args
+if [ "x${ATTACH_MODE}" = "x1" ]; then
+ ../set_ptracer_any "${test_prog}" >> "$EXP" &
+ tracee_pid=$!
+
+ while ! [ -s "$EXP" ]; do
+ kill -0 "$tracee_pid" 2> /dev/null ||
+ fail_ 'set_ptracer_any failed'
+ done
+
+ run_strace -e getpid -k -p "$tracee_pid"
+else
+ run_strace -e getpid -k $args
+fi
expected="$srcdir/$NAME.expected"
sed -r -n '1,/\(main\+0x[a-f0-9]+\) .*/ s/^[^(]+\(([^+]+)\+0x[a-f0-9]+\) .*/\1/p' "$LOG" |
Index: strace-4.24/tests/Makefile.in
===================================================================
--- strace-4.24.orig/tests/Makefile.in 2020-01-23 14:58:43.425959607 +0100
+++ strace-4.24/tests/Makefile.in 2020-01-23 14:57:57.710371128 +0100
@@ -178,9 +178,9 @@
seccomp-strict$(EXEEXT) select-P$(EXEEXT) \
set_ptracer_any$(EXEEXT) set_sigblock$(EXEEXT) \
set_sigign$(EXEEXT) signal_receive$(EXEEXT) sleep$(EXEEXT) \
- stack-fcall$(EXEEXT) stack-fcall-mangled$(EXEEXT) \
- threads-execve$(EXEEXT) unblock_reset_raise$(EXEEXT) \
- unix-pair-send-recv$(EXEEXT) \
+ stack-fcall$(EXEEXT) stack-fcall-attach$(EXEEXT) \
+ stack-fcall-mangled$(EXEEXT) threads-execve$(EXEEXT) \
+ unblock_reset_raise$(EXEEXT) unix-pair-send-recv$(EXEEXT) \
unix-pair-sendto-recvfrom$(EXEEXT) vfork-f$(EXEEXT) \
wait4-v$(EXEEXT) waitid-v$(EXEEXT) zeroargc$(EXEEXT)
@ENABLE_STACKTRACE_TRUE@@USE_DEMANGLE_TRUE@am__append_1 = strace-k-demangle.test
@@ -2427,6 +2427,12 @@
stack_fcall_OBJECTS = $(am_stack_fcall_OBJECTS)
stack_fcall_LDADD = $(LDADD)
stack_fcall_DEPENDENCIES = libtests.a
+am_stack_fcall_attach_OBJECTS = stack-fcall-attach.$(OBJEXT) \
+ stack-fcall-0.$(OBJEXT) stack-fcall-1.$(OBJEXT) \
+ stack-fcall-2.$(OBJEXT) stack-fcall-3.$(OBJEXT)
+stack_fcall_attach_OBJECTS = $(am_stack_fcall_attach_OBJECTS)
+stack_fcall_attach_LDADD = $(LDADD)
+stack_fcall_attach_DEPENDENCIES = libtests.a
am_stack_fcall_mangled_OBJECTS = stack-fcall-mangled.$(OBJEXT) \
stack-fcall-mangled-0.$(OBJEXT) \
stack-fcall-mangled-1.$(OBJEXT) \
@@ -2851,7 +2857,7 @@
so_peercred.c so_peercred-Xabbrev.c so_peercred-Xraw.c \
so_peercred-Xverbose.c sock_filter-v.c sock_filter-v-Xabbrev.c \
sock_filter-v-Xraw.c sock_filter-v-Xverbose.c socketcall.c \
- sockopt-sol_netlink.c splice.c $(stack_fcall_SOURCES) \
+ sockopt-sol_netlink.c splice.c $(stack_fcall_SOURCES) $(stack_fcall_attach_SOURCES) \
$(stack_fcall_mangled_SOURCES) stat.c stat64.c statfs.c \
statfs64.c statx.c swap.c sxetmask.c symlink.c symlinkat.c \
sync.c sync_file_range.c sync_file_range2.c sysinfo.c syslog.c \
@@ -2999,7 +3005,7 @@
so_peercred.c so_peercred-Xabbrev.c so_peercred-Xraw.c \
so_peercred-Xverbose.c sock_filter-v.c sock_filter-v-Xabbrev.c \
sock_filter-v-Xraw.c sock_filter-v-Xverbose.c socketcall.c \
- sockopt-sol_netlink.c splice.c $(stack_fcall_SOURCES) \
+ sockopt-sol_netlink.c splice.c $(stack_fcall_SOURCES) $(stack_fcall_attach_SOURCES) \
$(stack_fcall_mangled_SOURCES) stat.c stat64.c statfs.c \
statfs64.c statx.c swap.c sxetmask.c symlink.c symlinkat.c \
sync.c sync_file_range.c sync_file_range2.c sysinfo.c syslog.c \
@@ -3226,7 +3232,8 @@
bases=`echo $$bases`
RECHECK_LOGS = $(TEST_LOGS)
AM_RECURSIVE_TARGETS = check recheck
-@ENABLE_STACKTRACE_TRUE@am__EXEEXT_2 = strace-k.test $(am__append_1)
+@ENABLE_STACKTRACE_TRUE@am__EXEEXT_2 = strace-k.test strace-k-p.test \
+@ENABLE_STACKTRACE_TRUE@ $(am__append_1)
TEST_SUITE_LOG = test-suite.log
TEST_EXTENSIONS = @EXEEXT@ .test
am__test_logs1 = $(TESTS:=.log)
@@ -3960,6 +3967,9 @@
stack_fcall_SOURCES = stack-fcall.c \
stack-fcall-0.c stack-fcall-1.c stack-fcall-2.c stack-fcall-3.c
+stack_fcall_attach_SOURCES = stack-fcall-attach.c \
+ stack-fcall-0.c stack-fcall-1.c stack-fcall-2.c stack-fcall-3.c
+
stack_fcall_mangled_SOURCES = stack-fcall-mangled.c \
stack-fcall-mangled-0.c stack-fcall-mangled-1.c \
stack-fcall-mangled-2.c stack-fcall-mangled-3.c
@@ -4163,7 +4173,7 @@
xettimeofday.gen.test
@ENABLE_STACKTRACE_FALSE@STACKTRACE_TESTS =
@ENABLE_STACKTRACE_TRUE@STACKTRACE_TESTS = strace-k.test \
-@ENABLE_STACKTRACE_TRUE@ $(am__append_1)
+@ENABLE_STACKTRACE_TRUE@ strace-k-p.test $(am__append_1)
DECODER_TESTS = \
bpf-success-v.test \
bpf-success.test \
@@ -4366,6 +4376,8 @@
strace-ff.expected \
strace-k-demangle.expected \
strace-k-demangle.test \
+ strace-k-p.expected \
+ strace-k-p.test \
strace-k.expected \
strace-k.test \
strace-r.expected \
@@ -6454,6 +6466,10 @@
@rm -f stack-fcall$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(stack_fcall_OBJECTS) $(stack_fcall_LDADD) $(LIBS)
+stack-fcall-attach$(EXEEXT): $(stack_fcall_attach_OBJECTS) $(stack_fcall_attach_DEPENDENCIES) $(EXTRA_stack_fcall_attach_DEPENDENCIES)
+ @rm -f stack-fcall-attach$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(stack_fcall_attach_OBJECTS) $(stack_fcall_attach_LDADD) $(LIBS)
+
stack-fcall-mangled$(EXEEXT): $(stack_fcall_mangled_OBJECTS) $(stack_fcall_mangled_DEPENDENCIES) $(EXTRA_stack_fcall_mangled_DEPENDENCIES)
@rm -f stack-fcall-mangled$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(stack_fcall_mangled_OBJECTS) $(stack_fcall_mangled_LDADD) $(LIBS)
@@ -7244,6 +7260,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stack-fcall-1.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stack-fcall-2.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stack-fcall-3.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stack-fcall-attach.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stack-fcall-mangled-0.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stack-fcall-mangled-1.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stack-fcall-mangled-2.Po@am__quote@
Index: strace-4.24/tests-m32/Makefile.am
===================================================================
--- strace-4.24.orig/tests-m32/Makefile.am 2020-01-23 14:58:43.422959699 +0100
+++ strace-4.24/tests-m32/Makefile.am 2020-01-23 14:58:43.442959082 +0100
@@ -173,6 +173,7 @@
signal_receive \
sleep \
stack-fcall \
+ stack-fcall-attach \
stack-fcall-mangled \
threads-execve \
unblock_reset_raise \
@@ -214,6 +215,9 @@
stack_fcall_SOURCES = stack-fcall.c \
stack-fcall-0.c stack-fcall-1.c stack-fcall-2.c stack-fcall-3.c
+stack_fcall_attach_SOURCES = stack-fcall-attach.c \
+ stack-fcall-0.c stack-fcall-1.c stack-fcall-2.c stack-fcall-3.c
+
stack_fcall_mangled_SOURCES = stack-fcall-mangled.c \
stack-fcall-mangled-0.c stack-fcall-mangled-1.c \
stack-fcall-mangled-2.c stack-fcall-mangled-3.c
@@ -221,7 +225,7 @@
include gen_tests.am
if ENABLE_STACKTRACE
-STACKTRACE_TESTS = strace-k.test
+STACKTRACE_TESTS = strace-k.test strace-k-p.test
if USE_DEMANGLE
STACKTRACE_TESTS += strace-k-demangle.test
endif
@@ -434,6 +438,8 @@
strace-ff.expected \
strace-k-demangle.expected \
strace-k-demangle.test \
+ strace-k-p.expected \
+ strace-k-p.test \
strace-k.expected \
strace-k.test \
strace-r.expected \
Index: strace-4.24/tests-m32/Makefile.in
===================================================================
--- strace-4.24.orig/tests-m32/Makefile.in 2020-01-23 14:58:43.424959638 +0100
+++ strace-4.24/tests-m32/Makefile.in 2020-01-23 17:52:08.510416337 +0100
@@ -177,9 +177,9 @@
seccomp-strict$(EXEEXT) select-P$(EXEEXT) \
set_ptracer_any$(EXEEXT) set_sigblock$(EXEEXT) \
set_sigign$(EXEEXT) signal_receive$(EXEEXT) sleep$(EXEEXT) \
- stack-fcall$(EXEEXT) stack-fcall-mangled$(EXEEXT) \
- threads-execve$(EXEEXT) unblock_reset_raise$(EXEEXT) \
- unix-pair-send-recv$(EXEEXT) \
+ stack-fcall$(EXEEXT) stack-fcall-attach$(EXEEXT) \
+ stack-fcall-mangled$(EXEEXT) threads-execve$(EXEEXT) \
+ unblock_reset_raise$(EXEEXT) unix-pair-send-recv$(EXEEXT) \
unix-pair-sendto-recvfrom$(EXEEXT) vfork-f$(EXEEXT) \
wait4-v$(EXEEXT) waitid-v$(EXEEXT) zeroargc$(EXEEXT)
@ENABLE_STACKTRACE_TRUE@@USE_DEMANGLE_TRUE@am__append_1 = strace-k-demangle.test
@@ -2418,6 +2418,12 @@
stack_fcall_OBJECTS = $(am_stack_fcall_OBJECTS)
stack_fcall_LDADD = $(LDADD)
stack_fcall_DEPENDENCIES = libtests.a
+am_stack_fcall_attach_OBJECTS = stack-fcall-attach.$(OBJEXT) \
+ stack-fcall-0.$(OBJEXT) stack-fcall-1.$(OBJEXT) \
+ stack-fcall-2.$(OBJEXT) stack-fcall-3.$(OBJEXT)
+stack_fcall_attach_OBJECTS = $(am_stack_fcall_attach_OBJECTS)
+stack_fcall_attach_LDADD = $(LDADD)
+stack_fcall_attach_DEPENDENCIES = libtests.a
am_stack_fcall_mangled_OBJECTS = stack-fcall-mangled.$(OBJEXT) \
stack-fcall-mangled-0.$(OBJEXT) \
stack-fcall-mangled-1.$(OBJEXT) \
@@ -2841,7 +2847,7 @@
so_peercred.c so_peercred-Xabbrev.c so_peercred-Xraw.c \
so_peercred-Xverbose.c sock_filter-v.c sock_filter-v-Xabbrev.c \
sock_filter-v-Xraw.c sock_filter-v-Xverbose.c socketcall.c \
- sockopt-sol_netlink.c splice.c $(stack_fcall_SOURCES) \
+ sockopt-sol_netlink.c splice.c $(stack_fcall_SOURCES) $(stack_fcall_attach_SOURCES) \
$(stack_fcall_mangled_SOURCES) stat.c stat64.c statfs.c \
statfs64.c statx.c swap.c sxetmask.c symlink.c symlinkat.c \
sync.c sync_file_range.c sync_file_range2.c sysinfo.c syslog.c \
@@ -2988,7 +2994,7 @@
so_peercred.c so_peercred-Xabbrev.c so_peercred-Xraw.c \
so_peercred-Xverbose.c sock_filter-v.c sock_filter-v-Xabbrev.c \
sock_filter-v-Xraw.c sock_filter-v-Xverbose.c socketcall.c \
- sockopt-sol_netlink.c splice.c $(stack_fcall_SOURCES) \
+ sockopt-sol_netlink.c splice.c $(stack_fcall_SOURCES) $(stack_fcall_attach_SOURCES) \
$(stack_fcall_mangled_SOURCES) stat.c stat64.c statfs.c \
statfs64.c statx.c swap.c sxetmask.c symlink.c symlinkat.c \
sync.c sync_file_range.c sync_file_range2.c sysinfo.c syslog.c \
@@ -3215,7 +3221,8 @@
bases=`echo $$bases`
RECHECK_LOGS = $(TEST_LOGS)
AM_RECURSIVE_TARGETS = check recheck
-@ENABLE_STACKTRACE_TRUE@am__EXEEXT_2 = strace-k.test $(am__append_1)
+@ENABLE_STACKTRACE_TRUE@am__EXEEXT_2 = strace-k.test strace-k-p.test \
+@ENABLE_STACKTRACE_TRUE@ $(am__append_1)
TEST_SUITE_LOG = test-suite.log
TEST_EXTENSIONS = @EXEEXT@ .test
am__test_logs1 = $(TESTS:=.log)
@@ -3949,6 +3956,9 @@
stack_fcall_SOURCES = stack-fcall.c \
stack-fcall-0.c stack-fcall-1.c stack-fcall-2.c stack-fcall-3.c
+stack_fcall_attach_SOURCES = stack-fcall-attach.c \
+ stack-fcall-0.c stack-fcall-1.c stack-fcall-2.c stack-fcall-3.c
+
stack_fcall_mangled_SOURCES = stack-fcall-mangled.c \
stack-fcall-mangled-0.c stack-fcall-mangled-1.c \
stack-fcall-mangled-2.c stack-fcall-mangled-3.c
@@ -4152,7 +4162,7 @@
xettimeofday.gen.test
@ENABLE_STACKTRACE_FALSE@STACKTRACE_TESTS =
@ENABLE_STACKTRACE_TRUE@STACKTRACE_TESTS = strace-k.test \
-@ENABLE_STACKTRACE_TRUE@ $(am__append_1)
+@ENABLE_STACKTRACE_TRUE@ strace-k-p.test $(am__append_1)
DECODER_TESTS = \
bpf-success-v.test \
bpf-success.test \
@@ -4353,6 +4363,8 @@
strace-ff.expected \
strace-k-demangle.expected \
strace-k-demangle.test \
+ strace-k-p.expected \
+ strace-k-p.test \
strace-k.expected \
strace-k.test \
strace-r.expected \
@@ -6433,6 +6445,10 @@
@rm -f stack-fcall$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(stack_fcall_OBJECTS) $(stack_fcall_LDADD) $(LIBS)
+stack-fcall-attach$(EXEEXT): $(stack_fcall_attach_OBJECTS) $(stack_fcall_attach_DEPENDENCIES) $(EXTRA_stack_fcall_attach_DEPENDENCIES)
+ @rm -f stack-fcall-attach$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(stack_fcall_attach_OBJECTS) $(stack_fcall_attach_LDADD) $(LIBS)
+
stack-fcall-mangled$(EXEEXT): $(stack_fcall_mangled_OBJECTS) $(stack_fcall_mangled_DEPENDENCIES) $(EXTRA_stack_fcall_mangled_DEPENDENCIES)
@rm -f stack-fcall-mangled$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(stack_fcall_mangled_OBJECTS) $(stack_fcall_mangled_LDADD) $(LIBS)
@@ -7221,6 +7237,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stack-fcall-1.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stack-fcall-2.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stack-fcall-3.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stack-fcall-attach.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stack-fcall-mangled-0.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stack-fcall-mangled-1.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stack-fcall-mangled-2.Po@am__quote@
Index: strace-4.24/tests-mx32/Makefile.am
===================================================================
--- strace-4.24.orig/tests-mx32/Makefile.am 2020-01-23 14:58:43.424959638 +0100
+++ strace-4.24/tests-mx32/Makefile.am 2020-01-23 14:58:43.443959051 +0100
@@ -173,6 +173,7 @@
signal_receive \
sleep \
stack-fcall \
+ stack-fcall-attach \
stack-fcall-mangled \
threads-execve \
unblock_reset_raise \
@@ -214,6 +215,9 @@
stack_fcall_SOURCES = stack-fcall.c \
stack-fcall-0.c stack-fcall-1.c stack-fcall-2.c stack-fcall-3.c
+stack_fcall_attach_SOURCES = stack-fcall-attach.c \
+ stack-fcall-0.c stack-fcall-1.c stack-fcall-2.c stack-fcall-3.c
+
stack_fcall_mangled_SOURCES = stack-fcall-mangled.c \
stack-fcall-mangled-0.c stack-fcall-mangled-1.c \
stack-fcall-mangled-2.c stack-fcall-mangled-3.c
@@ -221,7 +225,7 @@
include gen_tests.am
if ENABLE_STACKTRACE
-STACKTRACE_TESTS = strace-k.test
+STACKTRACE_TESTS = strace-k.test strace-k-p.test
if USE_DEMANGLE
STACKTRACE_TESTS += strace-k-demangle.test
endif
@@ -434,6 +438,8 @@
strace-ff.expected \
strace-k-demangle.expected \
strace-k-demangle.test \
+ strace-k-p.expected \
+ strace-k-p.test \
strace-k.expected \
strace-k.test \
strace-r.expected \
Index: strace-4.24/tests-mx32/Makefile.in
===================================================================
--- strace-4.24.orig/tests-mx32/Makefile.in 2020-01-23 14:58:43.424959638 +0100
+++ strace-4.24/tests-mx32/Makefile.in 2020-01-23 14:58:08.177047958 +0100
@@ -177,9 +177,9 @@
seccomp-strict$(EXEEXT) select-P$(EXEEXT) \
set_ptracer_any$(EXEEXT) set_sigblock$(EXEEXT) \
set_sigign$(EXEEXT) signal_receive$(EXEEXT) sleep$(EXEEXT) \
- stack-fcall$(EXEEXT) stack-fcall-mangled$(EXEEXT) \
- threads-execve$(EXEEXT) unblock_reset_raise$(EXEEXT) \
- unix-pair-send-recv$(EXEEXT) \
+ stack-fcall$(EXEEXT) stack-fcall-attach$(EXEEXT) \
+ stack-fcall-mangled$(EXEEXT) threads-execve$(EXEEXT) \
+ unblock_reset_raise$(EXEEXT) unix-pair-send-recv$(EXEEXT) \
unix-pair-sendto-recvfrom$(EXEEXT) vfork-f$(EXEEXT) \
wait4-v$(EXEEXT) waitid-v$(EXEEXT) zeroargc$(EXEEXT)
@ENABLE_STACKTRACE_TRUE@@USE_DEMANGLE_TRUE@am__append_1 = strace-k-demangle.test
@@ -2841,7 +2841,7 @@
so_peercred.c so_peercred-Xabbrev.c so_peercred-Xraw.c \
so_peercred-Xverbose.c sock_filter-v.c sock_filter-v-Xabbrev.c \
sock_filter-v-Xraw.c sock_filter-v-Xverbose.c socketcall.c \
- sockopt-sol_netlink.c splice.c $(stack_fcall_SOURCES) \
+ sockopt-sol_netlink.c splice.c $(stack_fcall_SOURCES) $(stack_fcall_attach_SOURCES) \
$(stack_fcall_mangled_SOURCES) stat.c stat64.c statfs.c \
statfs64.c statx.c swap.c sxetmask.c symlink.c symlinkat.c \
sync.c sync_file_range.c sync_file_range2.c sysinfo.c syslog.c \
@@ -2988,7 +2988,7 @@
so_peercred.c so_peercred-Xabbrev.c so_peercred-Xraw.c \
so_peercred-Xverbose.c sock_filter-v.c sock_filter-v-Xabbrev.c \
sock_filter-v-Xraw.c sock_filter-v-Xverbose.c socketcall.c \
- sockopt-sol_netlink.c splice.c $(stack_fcall_SOURCES) \
+ sockopt-sol_netlink.c splice.c $(stack_fcall_SOURCES) $(stack_fcall_attach_SOURCES) \
$(stack_fcall_mangled_SOURCES) stat.c stat64.c statfs.c \
statfs64.c statx.c swap.c sxetmask.c symlink.c symlinkat.c \
sync.c sync_file_range.c sync_file_range2.c sysinfo.c syslog.c \
Index: strace-4.24/tests-m32/stack-fcall-attach.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests-m32/stack-fcall-attach.c 2020-01-23 15:42:03.377780293 +0100
@@ -0,0 +1,2 @@
+#define ATTACH_MODE 1
+#include "stack-fcall.c"
Index: strace-4.24/tests-m32/stack-fcall.c
===================================================================
--- strace-4.24.orig/tests-m32/stack-fcall.c 2017-12-29 16:20:21.000000000 +0100
+++ strace-4.24/tests-m32/stack-fcall.c 2020-01-23 15:42:03.381780261 +0100
@@ -1,7 +1,18 @@
+#include "tests.h"
+#include <unistd.h>
#include "stack-fcall.h"
+#ifndef ATTACH_MODE
+# define ATTACH_MODE 0
+#endif
+
int main(int argc, char **argv)
{
+#if ATTACH_MODE
+ /* sleep a bit to let the tracer time to catch up */
+ sleep(1);
+#endif
+
f0(argc);
return 0;
}
Index: strace-4.24/tests-m32/strace-k-p.expected
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests-m32/strace-k-p.expected 2020-01-23 16:22:56.367298204 +0100
@@ -0,0 +1 @@
+(__kernel_vsyscall )?(__)?getpid f3 f2 f1 f0 main
Index: strace-4.24/tests-m32/strace-k-p.test
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests-m32/strace-k-p.test 2020-01-23 15:42:03.383780246 +0100
@@ -0,0 +1,13 @@
+#!/bin/sh
+#
+# Check strace -k for attached tracees.
+#
+# Copyright (c) 2020 The strace developers.
+# All rights reserved.
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+ATTACH_MODE=1
+test_prog=../stack-fcall-attach
+
+. "${srcdir=.}"/strace-k.test
Index: strace-4.24/tests-m32/strace-k.test
===================================================================
--- strace-4.24.orig/tests-m32/strace-k.test 2018-06-14 13:00:00.000000000 +0200
+++ strace-4.24/tests-m32/strace-k.test 2020-01-23 15:42:03.385780230 +0100
@@ -7,30 +7,12 @@
# Copyright (c) 2014-2018 The strace developers.
# All rights reserved.
#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. The name of the author may not be used to endorse or promote products
-# derived from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# SPDX-License-Identifier: GPL-2.0-or-later
. "${srcdir=.}/init.sh"
+: "${ATTACH_MODE=0}"
+
# strace -k is implemented using /proc/$pid/maps
[ -f /proc/self/maps ] ||
framework_skip_ '/proc/self/maps is not available'
@@ -40,7 +22,19 @@
check_prog tr
run_prog "${test_prog=../stack-fcall}"
-run_strace -e getpid -k $args
+if [ "x${ATTACH_MODE}" = "x1" ]; then
+ ../set_ptracer_any "${test_prog}" >> "$EXP" &
+ tracee_pid=$!
+
+ while ! [ -s "$EXP" ]; do
+ kill -0 "$tracee_pid" 2> /dev/null ||
+ fail_ 'set_ptracer_any failed'
+ done
+
+ run_strace -e getpid -k -p "$tracee_pid"
+else
+ run_strace -e getpid -k $args
+fi
expected="$srcdir/$NAME.expected"
sed -r -n '1,/\(main\+0x[a-f0-9]+\) .*/ s/^[^(]+\(([^+]+)\+0x[a-f0-9]+\) .*/\1/p' "$LOG" |
Index: strace-4.24/tests-mx32/stack-fcall-attach.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests-mx32/stack-fcall-attach.c 2020-01-23 15:42:10.783722024 +0100
@@ -0,0 +1,2 @@
+#define ATTACH_MODE 1
+#include "stack-fcall.c"
Index: strace-4.24/tests-mx32/stack-fcall.c
===================================================================
--- strace-4.24.orig/tests-mx32/stack-fcall.c 2017-12-29 16:20:21.000000000 +0100
+++ strace-4.24/tests-mx32/stack-fcall.c 2020-01-23 15:42:10.797721914 +0100
@@ -1,7 +1,18 @@
+#include "tests.h"
+#include <unistd.h>
#include "stack-fcall.h"
+#ifndef ATTACH_MODE
+# define ATTACH_MODE 0
+#endif
+
int main(int argc, char **argv)
{
+#if ATTACH_MODE
+ /* sleep a bit to let the tracer time to catch up */
+ sleep(1);
+#endif
+
f0(argc);
return 0;
}
Index: strace-4.24/tests-mx32/strace-k-p.expected
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests-mx32/strace-k-p.expected 2020-01-23 16:22:53.346234461 +0100
@@ -0,0 +1 @@
+(__kernel_vsyscall )?(__)?getpid f3 f2 f1 f0 main
Index: strace-4.24/tests-mx32/strace-k-p.test
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ strace-4.24/tests-mx32/strace-k-p.test 2020-01-23 15:42:10.803721866 +0100
@@ -0,0 +1,13 @@
+#!/bin/sh
+#
+# Check strace -k for attached tracees.
+#
+# Copyright (c) 2020 The strace developers.
+# All rights reserved.
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+ATTACH_MODE=1
+test_prog=../stack-fcall-attach
+
+. "${srcdir=.}"/strace-k.test
Index: strace-4.24/tests-mx32/strace-k.test
===================================================================
--- strace-4.24.orig/tests-mx32/strace-k.test 2018-06-14 13:00:00.000000000 +0200
+++ strace-4.24/tests-mx32/strace-k.test 2020-01-23 15:42:10.810721811 +0100
@@ -7,30 +7,12 @@
# Copyright (c) 2014-2018 The strace developers.
# All rights reserved.
#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. The name of the author may not be used to endorse or promote products
-# derived from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# SPDX-License-Identifier: GPL-2.0-or-later
. "${srcdir=.}/init.sh"
+: "${ATTACH_MODE=0}"
+
# strace -k is implemented using /proc/$pid/maps
[ -f /proc/self/maps ] ||
framework_skip_ '/proc/self/maps is not available'
@@ -40,7 +22,19 @@
check_prog tr
run_prog "${test_prog=../stack-fcall}"
-run_strace -e getpid -k $args
+if [ "x${ATTACH_MODE}" = "x1" ]; then
+ ../set_ptracer_any "${test_prog}" >> "$EXP" &
+ tracee_pid=$!
+
+ while ! [ -s "$EXP" ]; do
+ kill -0 "$tracee_pid" 2> /dev/null ||
+ fail_ 'set_ptracer_any failed'
+ done
+
+ run_strace -e getpid -k -p "$tracee_pid"
+else
+ run_strace -e getpid -k $args
+fi
expected="$srcdir/$NAME.expected"
sed -r -n '1,/\(main\+0x[a-f0-9]+\) .*/ s/^[^(]+\(([^+]+)\+0x[a-f0-9]+\) .*/\1/p' "$LOG" |

View File

@ -0,0 +1,225 @@
From 5a9b0f1ef83300f853e77ada03515c8542c1cfe0 Mon Sep 17 00:00:00 2001
From: Eugene Syromyatnikov <evgsyr@gmail.com>
Date: Thu, 29 Aug 2019 19:03:51 +0200
Subject: [PATCH] sockaddr: properly decode sockaddr_hci addresses without
hci_channel
Before Linux commit v2.6.38-rc1~476^2~14^2~3^2~43^2~9,
struct sockaddr_hci did not contain hci_channel field.
* configure.ac (AC_CHECK_HEADERS([bluetooth/bluetooth.h])): Add check
for struct sockaddr_hci.hci_channel.
* sockaddr.c (print_sockaddr_data_bt): Decode struct sockaddr_hci
without hci_channel field.
* tests/net-sockaddr.c (check_hci): Add check for struct sockaddr_hci
decoding without hci_channel field; guard hci_channel with #ifdef
HAVE_STRUCT_SOCKADDR_HCI_HCI_CHANNEL.
(check_raw): Remove "len++", as 4-byte AF_BLUETOOTH socket addresses are
interpreted as struct sockaddr_hci without hci_channel field.
---
configure.ac | 3 +++
sockaddr.c | 16 +++++++++++++---
tests/net-sockaddr.c | 18 ++++++++++++++----
3 files changed, 30 insertions(+), 7 deletions(-)
Index: strace-4.24/configure.ac
===================================================================
--- strace-4.24.orig/configure.ac 2020-01-26 13:47:02.277446765 +0100
+++ strace-4.24/configure.ac 2020-01-26 13:47:08.976575337 +0100
@@ -458,6 +458,9 @@
])
AC_CHECK_HEADERS([bluetooth/bluetooth.h], [
+ AC_CHECK_MEMBERS([struct sockaddr_hci.hci_channel],,,
+ [#include <bluetooth/bluetooth.h>
+ #include <bluetooth/hci.h>])
AC_CHECK_MEMBERS([struct sockaddr_l2.l2_bdaddr_type],,,
[#include <bluetooth/bluetooth.h>
#include <bluetooth/l2cap.h>])
Index: strace-4.24/sockaddr.c
===================================================================
--- strace-4.24.orig/sockaddr.c 2020-01-26 13:47:08.977575356 +0100
+++ strace-4.24/sockaddr.c 2020-01-27 16:26:32.975222449 +0100
@@ -355,12 +355,21 @@
};
switch (addrlen) {
+ case offsetofend(struct sockaddr_hci, hci_dev):
case sizeof(struct sockaddr_hci): {
const struct sockaddr_hci *const hci = buf;
- tprintf("hci_dev=htobs(%hu), hci_channel=",
- btohs(hci->hci_dev));
- printxval_index(hci_channels, hci->hci_channel,
- "HCI_CHANNEL_???");
+ tprintf("hci_dev=htobs(%hu)", btohs(hci->hci_dev));
+
+ /*
+ * hci_channel field has been introduced
+ * Linux commit in v2.6.38-rc1~476^2~14^2~3^2~43^2~9.
+ */
+ if (addrlen == sizeof(struct sockaddr_hci)) {
+ tprints(", hci_channel=");
+ printxval_index(hci_channels, hci->hci_channel,
+ "HCI_CHANNEL_???");
+ }
+
break;
}
case sizeof(struct sockaddr_sco): {
Index: strace-4.24/tests/net-sockaddr.c
===================================================================
--- strace-4.24.orig/tests/net-sockaddr.c 2020-01-26 13:47:02.279446803 +0100
+++ strace-4.24/tests/net-sockaddr.c 2020-01-26 13:47:08.979575395 +0100
@@ -364,11 +364,22 @@
TAIL_ALLOC_OBJECT_VAR_PTR(struct sockaddr_hci, hci);
hci->hci_family = AF_BLUETOOTH;
hci->hci_dev = htobs(h_port);
+# ifdef HAVE_STRUCT_SOCKADDR_HCI_HCI_CHANNEL
hci->hci_channel = HCI_CHANNEL_RAW;
+# endif
unsigned int len = sizeof(*hci);
- int ret = connect(-1, (void *) hci, len);
+
+ int ret = connect(-1, (void *) hci, 4);
+ printf("connect(-1, {sa_family=AF_BLUETOOTH, hci_dev=htobs(%hu)"
+ "}, 4) = %d EBADF (%m)\n",
+ h_port, ret);
+
+ ret = connect(-1, (void *) hci, len);
printf("connect(-1, {sa_family=AF_BLUETOOTH, hci_dev=htobs(%hu)"
- ", hci_channel=HCI_CHANNEL_RAW}, %u) = %d EBADF (%m)\n",
+# ifdef HAVE_STRUCT_SOCKADDR_HCI_HCI_CHANNEL
+ ", hci_channel=HCI_CHANNEL_RAW"
+# endif
+ "}, %u) = %d EBADF (%m)\n",
h_port, len, ret);
}
@@ -521,9 +532,8 @@
" = %d EBADF (%m)\n", len, ret);
u.sa->sa_family = AF_BLUETOOTH;
- ++len;
ret = connect(-1, (void *) u.st, len);
- printf("connect(-1, {sa_family=AF_BLUETOOTH, sa_data=\"00\"}, %u)"
+ printf("connect(-1, {sa_family=AF_BLUETOOTH, sa_data=\"0\"}, %u)"
" = %d EBADF (%m)\n", len, ret);
}
Index: strace-4.24/tests-m32/net-sockaddr.c
===================================================================
--- strace-4.24.orig/tests-m32/net-sockaddr.c 2020-01-26 13:47:02.282446861 +0100
+++ strace-4.24/tests-m32/net-sockaddr.c 2020-01-26 13:47:08.979575395 +0100
@@ -384,11 +384,22 @@
TAIL_ALLOC_OBJECT_VAR_PTR(struct sockaddr_hci, hci);
hci->hci_family = AF_BLUETOOTH;
hci->hci_dev = htobs(h_port);
+# ifdef HAVE_STRUCT_SOCKADDR_HCI_HCI_CHANNEL
hci->hci_channel = HCI_CHANNEL_RAW;
+# endif
unsigned int len = sizeof(*hci);
- int ret = connect(-1, (void *) hci, len);
+
+ int ret = connect(-1, (void *) hci, 4);
+ printf("connect(-1, {sa_family=AF_BLUETOOTH, hci_dev=htobs(%hu)"
+ "}, 4) = %d EBADF (%m)\n",
+ h_port, ret);
+
+ ret = connect(-1, (void *) hci, len);
printf("connect(-1, {sa_family=AF_BLUETOOTH, hci_dev=htobs(%hu)"
- ", hci_channel=HCI_CHANNEL_RAW}, %u) = %d EBADF (%m)\n",
+# ifdef HAVE_STRUCT_SOCKADDR_HCI_HCI_CHANNEL
+ ", hci_channel=HCI_CHANNEL_RAW"
+# endif
+ "}, %u) = %d EBADF (%m)\n",
h_port, len, ret);
}
@@ -541,9 +552,8 @@
" = %d EBADF (%m)\n", len, ret);
u.sa->sa_family = AF_BLUETOOTH;
- ++len;
ret = connect(-1, (void *) u.st, len);
- printf("connect(-1, {sa_family=AF_BLUETOOTH, sa_data=\"00\"}, %u)"
+ printf("connect(-1, {sa_family=AF_BLUETOOTH, sa_data=\"0\"}, %u)"
" = %d EBADF (%m)\n", len, ret);
}
Index: strace-4.24/tests-mx32/net-sockaddr.c
===================================================================
--- strace-4.24.orig/tests-mx32/net-sockaddr.c 2020-01-26 13:47:02.282446861 +0100
+++ strace-4.24/tests-mx32/net-sockaddr.c 2020-01-26 13:47:08.979575395 +0100
@@ -384,11 +384,22 @@
TAIL_ALLOC_OBJECT_VAR_PTR(struct sockaddr_hci, hci);
hci->hci_family = AF_BLUETOOTH;
hci->hci_dev = htobs(h_port);
+# ifdef HAVE_STRUCT_SOCKADDR_HCI_HCI_CHANNEL
hci->hci_channel = HCI_CHANNEL_RAW;
+# endif
unsigned int len = sizeof(*hci);
- int ret = connect(-1, (void *) hci, len);
+
+ int ret = connect(-1, (void *) hci, 4);
+ printf("connect(-1, {sa_family=AF_BLUETOOTH, hci_dev=htobs(%hu)"
+ "}, 4) = %d EBADF (%m)\n",
+ h_port, ret);
+
+ ret = connect(-1, (void *) hci, len);
printf("connect(-1, {sa_family=AF_BLUETOOTH, hci_dev=htobs(%hu)"
- ", hci_channel=HCI_CHANNEL_RAW}, %u) = %d EBADF (%m)\n",
+# ifdef HAVE_STRUCT_SOCKADDR_HCI_HCI_CHANNEL
+ ", hci_channel=HCI_CHANNEL_RAW"
+# endif
+ "}, %u) = %d EBADF (%m)\n",
h_port, len, ret);
}
@@ -541,9 +552,8 @@
" = %d EBADF (%m)\n", len, ret);
u.sa->sa_family = AF_BLUETOOTH;
- ++len;
ret = connect(-1, (void *) u.st, len);
- printf("connect(-1, {sa_family=AF_BLUETOOTH, sa_data=\"00\"}, %u)"
+ printf("connect(-1, {sa_family=AF_BLUETOOTH, sa_data=\"0\"}, %u)"
" = %d EBADF (%m)\n", len, ret);
}
Index: strace-4.24/configure
===================================================================
--- strace-4.24.orig/configure 2020-01-26 13:47:02.285446919 +0100
+++ strace-4.24/configure 2020-01-26 13:47:08.981575433 +0100
@@ -11240,6 +11240,18 @@
#define HAVE_BLUETOOTH_BLUETOOTH_H 1
_ACEOF
+ ac_fn_c_check_member "$LINENO" "struct sockaddr_hci" "hci_channel" "ac_cv_member_struct_sockaddr_hci_hci_channel" "#include <bluetooth/bluetooth.h>
+ #include <bluetooth/hci.h>
+"
+if test "x$ac_cv_member_struct_sockaddr_hci_hci_channel" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_SOCKADDR_HCI_HCI_CHANNEL 1
+_ACEOF
+
+
+fi
+
ac_fn_c_check_member "$LINENO" "struct sockaddr_l2" "l2_bdaddr_type" "ac_cv_member_struct_sockaddr_l2_l2_bdaddr_type" "#include <bluetooth/bluetooth.h>
#include <bluetooth/l2cap.h>
"
Index: strace-4.24/config.h.in
===================================================================
--- strace-4.24.orig/config.h.in 2020-01-26 13:47:02.287446957 +0100
+++ strace-4.24/config.h.in 2020-01-26 13:47:08.982575452 +0100
@@ -1315,6 +1315,9 @@
/* Define to 1 if the system has the type `struct sigcontext'. */
#undef HAVE_STRUCT_SIGCONTEXT
+/* Define to 1 if `hci_channel' is a member of `struct sockaddr_hci'. */
+#undef HAVE_STRUCT_SOCKADDR_HCI_HCI_CHANNEL
+
/* Define to 1 if `l2_bdaddr_type' is a member of `struct sockaddr_l2'. */
#undef HAVE_STRUCT_SOCKADDR_L2_L2_BDADDR_TYPE

View File

@ -0,0 +1,90 @@
From 4377e3a1535a0ec3a42da8a1366ad6943f4efa0e Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Sun, 4 Aug 2019 08:47:00 +0000
Subject: [PATCH] tests: fix expected output for some ipc tests
* tests/gen_tests.in (ipc_msgbuf-Xraw, ipc_shm, ipc_shm-Xabbrev,
ipc_shm-Xverbose): Adjust -a argument.
---
Backport changes:
* tests/gen_tests.in change is copied over to tests-m32/gen_tests.in
and tests-m32/gen_tests.in
---
tests/gen_tests.in | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
Index: strace-4.24/tests/gen_tests.in
===================================================================
--- strace-4.24.orig/tests/gen_tests.in 2020-01-27 18:21:22.896068950 +0100
+++ strace-4.24/tests/gen_tests.in 2020-01-27 18:21:42.169892032 +0100
@@ -147,16 +147,16 @@
ipc_msg-Xraw +ipc.sh -Xraw -a16
ipc_msg-Xverbose +ipc.sh -Xverbose -a34
ipc_msgbuf-Xabbrev +ipc_msgbuf.test -Xabbrev
-ipc_msgbuf-Xraw +ipc_msgbuf.test -Xraw -a22
+ipc_msgbuf-Xraw +ipc_msgbuf.test -Xraw -a20
ipc_msgbuf-Xverbose +ipc_msgbuf.test -Xverbose
ipc_sem +ipc.sh -a29
ipc_sem-Xabbrev +ipc.sh -Xabbrev -a29
ipc_sem-Xraw +ipc.sh -Xraw -a19
ipc_sem-Xverbose +ipc.sh -Xverbose -a36
-ipc_shm +ipc.sh -a29
-ipc_shm-Xabbrev +ipc.sh -Xabbrev -a29
+ipc_shm +ipc.sh -a26
+ipc_shm-Xabbrev +ipc.sh -Xabbrev -a26
ipc_shm-Xraw +ipc.sh -Xraw -a19
-ipc_shm-Xverbose +ipc.sh -Xverbose -a36
+ipc_shm-Xverbose +ipc.sh -Xverbose -a34
kcmp -a22
kcmp-y -a22 -y -e trace=kcmp
kern_features -a16
Index: strace-4.24/tests-m32/gen_tests.in
===================================================================
--- strace-4.24.orig/tests-m32/gen_tests.in 2020-01-27 18:21:36.149947290 +0100
+++ strace-4.24/tests-m32/gen_tests.in 2020-01-27 18:38:00.954898561 +0100
@@ -147,16 +147,16 @@
ipc_msg-Xraw +ipc.sh -Xraw -a16
ipc_msg-Xverbose +ipc.sh -Xverbose -a34
ipc_msgbuf-Xabbrev +ipc_msgbuf.test -Xabbrev
-ipc_msgbuf-Xraw +ipc_msgbuf.test -Xraw -a22
+ipc_msgbuf-Xraw +ipc_msgbuf.test -Xraw -a20
ipc_msgbuf-Xverbose +ipc_msgbuf.test -Xverbose
ipc_sem +ipc.sh -a29
ipc_sem-Xabbrev +ipc.sh -Xabbrev -a29
ipc_sem-Xraw +ipc.sh -Xraw -a19
ipc_sem-Xverbose +ipc.sh -Xverbose -a36
-ipc_shm +ipc.sh -a29
-ipc_shm-Xabbrev +ipc.sh -Xabbrev -a29
+ipc_shm +ipc.sh -a26
+ipc_shm-Xabbrev +ipc.sh -Xabbrev -a26
ipc_shm-Xraw +ipc.sh -Xraw -a19
-ipc_shm-Xverbose +ipc.sh -Xverbose -a36
+ipc_shm-Xverbose +ipc.sh -Xverbose -a34
kcmp -a22
kcmp-y -a22 -y -e trace=kcmp
kern_features -a16
Index: strace-4.24/tests-mx32/gen_tests.in
===================================================================
--- strace-4.24.orig/tests-mx32/gen_tests.in 2020-01-27 18:21:37.445935394 +0100
+++ strace-4.24/tests-mx32/gen_tests.in 2020-01-27 18:37:59.481911731 +0100
@@ -147,16 +147,16 @@
ipc_msg-Xraw +ipc.sh -Xraw -a16
ipc_msg-Xverbose +ipc.sh -Xverbose -a34
ipc_msgbuf-Xabbrev +ipc_msgbuf.test -Xabbrev
-ipc_msgbuf-Xraw +ipc_msgbuf.test -Xraw -a22
+ipc_msgbuf-Xraw +ipc_msgbuf.test -Xraw -a20
ipc_msgbuf-Xverbose +ipc_msgbuf.test -Xverbose
ipc_sem +ipc.sh -a29
ipc_sem-Xabbrev +ipc.sh -Xabbrev -a29
ipc_sem-Xraw +ipc.sh -Xraw -a19
ipc_sem-Xverbose +ipc.sh -Xverbose -a36
-ipc_shm +ipc.sh -a29
-ipc_shm-Xabbrev +ipc.sh -Xabbrev -a29
+ipc_shm +ipc.sh -a26
+ipc_shm-Xabbrev +ipc.sh -Xabbrev -a26
ipc_shm-Xraw +ipc.sh -Xraw -a19
-ipc_shm-Xverbose +ipc.sh -Xverbose -a36
+ipc_shm-Xverbose +ipc.sh -Xverbose -a34
kcmp -a22
kcmp-y -a22 -y -e trace=kcmp
kern_features -a16

View File

@ -0,0 +1,53 @@
From a75c7c4bcb6b48680275de3e99e17e0ebec811ec Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Thu, 7 Nov 2019 19:58:36 +0000
Subject: [PATCH] tests: fix -a argument in ipc_msgbuf-Xraw test
* tests/gen_tests.in (ipc_msgbuf-Xraw): Change -a argument from 20 to 19.
---
Backport change:
* tests/gen_tests.in change has been copied over to tests-m32/gen_tests.in
and tests-mx32/gen_tests.in.
---
tests/gen_tests.in | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Index: strace-4.24/tests/gen_tests.in
===================================================================
--- strace-4.24.orig/tests/gen_tests.in 2020-01-27 18:21:42.169892032 +0100
+++ strace-4.24/tests/gen_tests.in 2020-01-27 18:38:14.935773561 +0100
@@ -147,7 +147,7 @@
ipc_msg-Xraw +ipc.sh -Xraw -a16
ipc_msg-Xverbose +ipc.sh -Xverbose -a34
ipc_msgbuf-Xabbrev +ipc_msgbuf.test -Xabbrev
-ipc_msgbuf-Xraw +ipc_msgbuf.test -Xraw -a20
+ipc_msgbuf-Xraw +ipc_msgbuf.test -Xraw -a19
ipc_msgbuf-Xverbose +ipc_msgbuf.test -Xverbose
ipc_sem +ipc.sh -a29
ipc_sem-Xabbrev +ipc.sh -Xabbrev -a29
Index: strace-4.24/tests-m32/gen_tests.in
===================================================================
--- strace-4.24.orig/tests-m32/gen_tests.in 2020-01-27 18:38:00.954898561 +0100
+++ strace-4.24/tests-m32/gen_tests.in 2020-01-27 18:38:23.407697816 +0100
@@ -147,7 +147,7 @@
ipc_msg-Xraw +ipc.sh -Xraw -a16
ipc_msg-Xverbose +ipc.sh -Xverbose -a34
ipc_msgbuf-Xabbrev +ipc_msgbuf.test -Xabbrev
-ipc_msgbuf-Xraw +ipc_msgbuf.test -Xraw -a20
+ipc_msgbuf-Xraw +ipc_msgbuf.test -Xraw -a19
ipc_msgbuf-Xverbose +ipc_msgbuf.test -Xverbose
ipc_sem +ipc.sh -a29
ipc_sem-Xabbrev +ipc.sh -Xabbrev -a29
Index: strace-4.24/tests-mx32/gen_tests.in
===================================================================
--- strace-4.24.orig/tests-mx32/gen_tests.in 2020-01-27 18:37:59.481911731 +0100
+++ strace-4.24/tests-mx32/gen_tests.in 2020-01-27 18:38:24.645686747 +0100
@@ -147,7 +147,7 @@
ipc_msg-Xraw +ipc.sh -Xraw -a16
ipc_msg-Xverbose +ipc.sh -Xverbose -a34
ipc_msgbuf-Xabbrev +ipc_msgbuf.test -Xabbrev
-ipc_msgbuf-Xraw +ipc_msgbuf.test -Xraw -a20
+ipc_msgbuf-Xraw +ipc_msgbuf.test -Xraw -a19
ipc_msgbuf-Xverbose +ipc_msgbuf.test -Xverbose
ipc_sem +ipc.sh -a29
ipc_sem-Xabbrev +ipc.sh -Xabbrev -a29

View File

@ -0,0 +1,288 @@
From d6c71dd0611e7e337edaf36c35ad51a90f404b14 Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Sun, 30 Dec 2018 15:35:21 +0000
Subject: [PATCH] Fix preprocessor indentation
Indent the C preprocessor directives to reflect their nesting
using the following script:
$ cppi -l $(git grep -El '^[[:space:]]*#[[:space:]]*(if|ifdef|ifndef|elif|else|endif|define|pragma)[[:space:]]' |grep -v '\.sh$') |while read f; do
cppi < "$f" > "$f".cppi; mv "$f".cppi "$f"
done
---
bpf_attr.h | 106 ++++++++++++++++++++++++++++++-------------------------------
1 file changed, 53 insertions(+), 53 deletions(-)
diff --git a/bpf_attr.h b/bpf_attr.h
index 925221d..dc7694c 100644
--- a/bpf_attr.h
+++ b/bpf_attr.h
@@ -6,7 +6,7 @@
*/
#ifndef STRACE_BPF_ATTR_H
-#define STRACE_BPF_ATTR_H
+# define STRACE_BPF_ATTR_H
/*
* The policy is that all fields of type uint64_t in this header file
@@ -19,21 +19,21 @@
* v4.16-rc1~123^2~109^2~5^2~4.
*/
-#ifndef BPF_OBJ_NAME_LEN
-# define BPF_OBJ_NAME_LEN 16U
-#else
-# if BPF_OBJ_NAME_LEN != 16U
-# error "Unexpected value of BPF_OBJ_NAME_LEN"
+# ifndef BPF_OBJ_NAME_LEN
+# define BPF_OBJ_NAME_LEN 16U
+# else
+# if BPF_OBJ_NAME_LEN != 16U
+# error "Unexpected value of BPF_OBJ_NAME_LEN"
+# endif
# endif
-#endif
-#ifndef BPF_TAG_SIZE
-# define BPF_TAG_SIZE 8
-#else
-# if BPF_TAG_SIZE != 8
-# error "Unexpected value of BPF_TAG_SIZE"
+# ifndef BPF_TAG_SIZE
+# define BPF_TAG_SIZE 8
+# else
+# if BPF_TAG_SIZE != 8
+# error "Unexpected value of BPF_TAG_SIZE"
+# endif
# endif
-#endif
struct BPF_MAP_CREATE_struct {
uint32_t map_type;
@@ -47,9 +47,9 @@ struct BPF_MAP_CREATE_struct {
uint32_t map_ifindex;
};
-#define BPF_MAP_CREATE_struct_size \
+# define BPF_MAP_CREATE_struct_size \
sizeof(struct BPF_MAP_CREATE_struct)
-#define expected_BPF_MAP_CREATE_struct_size 48
+# define expected_BPF_MAP_CREATE_struct_size 48
struct BPF_MAP_LOOKUP_ELEM_struct {
uint32_t map_fd;
@@ -57,9 +57,9 @@ struct BPF_MAP_LOOKUP_ELEM_struct {
uint64_t ATTRIBUTE_ALIGNED(8) value;
};
-#define BPF_MAP_LOOKUP_ELEM_struct_size \
+# define BPF_MAP_LOOKUP_ELEM_struct_size \
sizeof(struct BPF_MAP_LOOKUP_ELEM_struct)
-#define expected_BPF_MAP_LOOKUP_ELEM_struct_size 24
+# define expected_BPF_MAP_LOOKUP_ELEM_struct_size 24
struct BPF_MAP_UPDATE_ELEM_struct {
uint32_t map_fd;
@@ -68,18 +68,18 @@ struct BPF_MAP_UPDATE_ELEM_struct {
uint64_t ATTRIBUTE_ALIGNED(8) flags;
};
-#define BPF_MAP_UPDATE_ELEM_struct_size \
+# define BPF_MAP_UPDATE_ELEM_struct_size \
sizeof(struct BPF_MAP_UPDATE_ELEM_struct)
-#define expected_BPF_MAP_UPDATE_ELEM_struct_size 32
+# define expected_BPF_MAP_UPDATE_ELEM_struct_size 32
struct BPF_MAP_DELETE_ELEM_struct {
uint32_t map_fd;
uint64_t ATTRIBUTE_ALIGNED(8) key;
};
-#define BPF_MAP_DELETE_ELEM_struct_size \
+# define BPF_MAP_DELETE_ELEM_struct_size \
sizeof(struct BPF_MAP_DELETE_ELEM_struct)
-#define expected_BPF_MAP_DELETE_ELEM_struct_size 16
+# define expected_BPF_MAP_DELETE_ELEM_struct_size 16
struct BPF_MAP_GET_NEXT_KEY_struct {
uint32_t map_fd;
@@ -87,9 +87,9 @@ struct BPF_MAP_GET_NEXT_KEY_struct {
uint64_t ATTRIBUTE_ALIGNED(8) next_key;
};
-#define BPF_MAP_GET_NEXT_KEY_struct_size \
+# define BPF_MAP_GET_NEXT_KEY_struct_size \
sizeof(struct BPF_MAP_GET_NEXT_KEY_struct)
-#define expected_BPF_MAP_GET_NEXT_KEY_struct_size 24
+# define expected_BPF_MAP_GET_NEXT_KEY_struct_size 24
struct BPF_PROG_LOAD_struct {
uint32_t prog_type;
@@ -106,9 +106,9 @@ struct BPF_PROG_LOAD_struct {
uint32_t expected_attach_type;
};
-#define BPF_PROG_LOAD_struct_size \
+# define BPF_PROG_LOAD_struct_size \
offsetofend(struct BPF_PROG_LOAD_struct, expected_attach_type)
-#define expected_BPF_PROG_LOAD_struct_size 72
+# define expected_BPF_PROG_LOAD_struct_size 72
struct BPF_OBJ_PIN_struct {
uint64_t ATTRIBUTE_ALIGNED(8) pathname;
@@ -116,12 +116,12 @@ struct BPF_OBJ_PIN_struct {
uint32_t file_flags;
};
-#define BPF_OBJ_PIN_struct_size \
+# define BPF_OBJ_PIN_struct_size \
sizeof(struct BPF_OBJ_PIN_struct)
-#define expected_BPF_OBJ_PIN_struct_size 16
+# define expected_BPF_OBJ_PIN_struct_size 16
-#define BPF_OBJ_GET_struct BPF_OBJ_PIN_struct
-#define BPF_OBJ_GET_struct_size BPF_OBJ_PIN_struct_size
+# define BPF_OBJ_GET_struct BPF_OBJ_PIN_struct
+# define BPF_OBJ_GET_struct_size BPF_OBJ_PIN_struct_size
struct BPF_PROG_ATTACH_struct {
uint32_t target_fd;
@@ -130,9 +130,9 @@ struct BPF_PROG_ATTACH_struct {
uint32_t attach_flags;
};
-#define BPF_PROG_ATTACH_struct_size \
+# define BPF_PROG_ATTACH_struct_size \
sizeof(struct BPF_PROG_ATTACH_struct)
-#define expected_BPF_PROG_ATTACH_struct_size 16
+# define expected_BPF_PROG_ATTACH_struct_size 16
struct BPF_PROG_DETACH_struct {
uint32_t target_fd;
@@ -140,9 +140,9 @@ struct BPF_PROG_DETACH_struct {
uint32_t attach_type;
};
-#define BPF_PROG_DETACH_struct_size \
+# define BPF_PROG_DETACH_struct_size \
sizeof(struct BPF_PROG_DETACH_struct)
-#define expected_BPF_PROG_DETACH_struct_size 12
+# define expected_BPF_PROG_DETACH_struct_size 12
struct BPF_PROG_TEST_RUN_struct /* test */ {
uint32_t prog_fd;
@@ -155,9 +155,9 @@ struct BPF_PROG_TEST_RUN_struct /* test */ {
uint32_t duration;
};
-#define BPF_PROG_TEST_RUN_struct_size \
+# define BPF_PROG_TEST_RUN_struct_size \
sizeof(struct BPF_PROG_TEST_RUN_struct)
-#define expected_BPF_PROG_TEST_RUN_struct_size 40
+# define expected_BPF_PROG_TEST_RUN_struct_size 40
struct BPF_PROG_GET_NEXT_ID_struct {
uint32_t start_id;
@@ -165,12 +165,12 @@ struct BPF_PROG_GET_NEXT_ID_struct {
uint32_t open_flags;
};
-#define BPF_PROG_GET_NEXT_ID_struct_size \
+# define BPF_PROG_GET_NEXT_ID_struct_size \
sizeof(struct BPF_PROG_GET_NEXT_ID_struct)
-#define expected_BPF_PROG_GET_NEXT_ID_struct_size 12
+# define expected_BPF_PROG_GET_NEXT_ID_struct_size 12
-#define BPF_MAP_GET_NEXT_ID_struct BPF_PROG_GET_NEXT_ID_struct
-#define BPF_MAP_GET_NEXT_ID_struct_size BPF_PROG_GET_NEXT_ID_struct_size
+# define BPF_MAP_GET_NEXT_ID_struct BPF_PROG_GET_NEXT_ID_struct
+# define BPF_MAP_GET_NEXT_ID_struct_size BPF_PROG_GET_NEXT_ID_struct_size
struct BPF_PROG_GET_FD_BY_ID_struct {
uint32_t prog_id;
@@ -178,9 +178,9 @@ struct BPF_PROG_GET_FD_BY_ID_struct {
uint32_t open_flags;
};
-#define BPF_PROG_GET_FD_BY_ID_struct_size \
+# define BPF_PROG_GET_FD_BY_ID_struct_size \
sizeof(struct BPF_PROG_GET_FD_BY_ID_struct)
-#define expected_BPF_PROG_GET_FD_BY_ID_struct_size 12
+# define expected_BPF_PROG_GET_FD_BY_ID_struct_size 12
struct BPF_MAP_GET_FD_BY_ID_struct {
uint32_t map_id;
@@ -188,9 +188,9 @@ struct BPF_MAP_GET_FD_BY_ID_struct {
uint32_t open_flags;
};
-#define BPF_MAP_GET_FD_BY_ID_struct_size \
+# define BPF_MAP_GET_FD_BY_ID_struct_size \
sizeof(struct BPF_MAP_GET_FD_BY_ID_struct)
-#define expected_BPF_MAP_GET_FD_BY_ID_struct_size 12
+# define expected_BPF_MAP_GET_FD_BY_ID_struct_size 12
struct BPF_OBJ_GET_INFO_BY_FD_struct /* info */ {
uint32_t bpf_fd;
@@ -198,9 +198,9 @@ struct BPF_OBJ_GET_INFO_BY_FD_struct /* info */ {
uint64_t ATTRIBUTE_ALIGNED(8) info;
};
-#define BPF_OBJ_GET_INFO_BY_FD_struct_size \
+# define BPF_OBJ_GET_INFO_BY_FD_struct_size \
sizeof(struct BPF_OBJ_GET_INFO_BY_FD_struct)
-#define expected_BPF_OBJ_GET_INFO_BY_FD_struct_size 16
+# define expected_BPF_OBJ_GET_INFO_BY_FD_struct_size 16
struct BPF_PROG_QUERY_struct /* query */ {
uint32_t target_fd;
@@ -211,18 +211,18 @@ struct BPF_PROG_QUERY_struct /* query */ {
uint32_t prog_cnt;
};
-#define BPF_PROG_QUERY_struct_size \
+# define BPF_PROG_QUERY_struct_size \
offsetofend(struct BPF_PROG_QUERY_struct, prog_cnt)
-#define expected_BPF_PROG_QUERY_struct_size 28
+# define expected_BPF_PROG_QUERY_struct_size 28
struct BPF_RAW_TRACEPOINT_OPEN_struct /* raw_tracepoint */ {
uint64_t ATTRIBUTE_ALIGNED(8) name;
uint32_t prog_fd;
};
-#define BPF_RAW_TRACEPOINT_OPEN_struct_size \
+# define BPF_RAW_TRACEPOINT_OPEN_struct_size \
offsetofend(struct BPF_RAW_TRACEPOINT_OPEN_struct, prog_fd)
-#define expected_BPF_RAW_TRACEPOINT_OPEN_struct_size 12
+# define expected_BPF_RAW_TRACEPOINT_OPEN_struct_size 12
struct bpf_map_info_struct {
uint32_t type;
@@ -241,9 +241,9 @@ struct bpf_map_info_struct {
uint64_t ATTRIBUTE_ALIGNED(8) netns_ino; /* skip check */
};
-#define bpf_map_info_struct_size \
+# define bpf_map_info_struct_size \
sizeof(struct bpf_map_info_struct)
-#define expected_bpf_map_info_struct_size 64
+# define expected_bpf_map_info_struct_size 64
struct bpf_prog_info_struct {
uint32_t type;
@@ -267,8 +267,8 @@ struct bpf_prog_info_struct {
uint64_t ATTRIBUTE_ALIGNED(8) netns_ino; /* skip check */
};
-#define bpf_prog_info_struct_size \
+# define bpf_prog_info_struct_size \
sizeof(struct bpf_prog_info_struct)
-#define expected_bpf_prog_info_struct_size 104
+# define expected_bpf_prog_info_struct_size 104
#endif /* !STRACE_BPF_ATTR_H */
--
2.1.4

View File

@ -0,0 +1,28 @@
From 579f27020c59c426a8fef8b970da9907f59809f8 Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Tue, 12 Mar 2019 11:17:20 +0000
Subject: [PATCH] bpf: exclude bit fields from the check
Currently we have no instruments to check the size and offsets
of bit fields.
* gen_bpf_attr_check.sh: Do not print bit fields.
* m4/gen_bpf_attr_m4.awk: Likewise.
---
gen_bpf_attr_check.sh | 2 +-
m4/gen_bpf_attr_m4.awk | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
Index: strace-4.24/gen_bpf_attr_check.sh
===================================================================
--- strace-4.24.orig/gen_bpf_attr_check.sh 2020-01-30 13:18:02.606944355 +0100
+++ strace-4.24/gen_bpf_attr_check.sh 2020-01-30 13:31:03.710562191 +0100
@@ -30,7 +30,7 @@
enum="$enum${enum:+.}"
ENUM="$ENUM${ENUM:+_}"
sed -n '/^struct '"$struct"' [^{]*{/,/^};$/p' < "$input" |
- sed -n 's/^[[:space:]]\+[^][;]*[[:space:]]\([^][[:space:];]\+\)\(\[[^;]*\]\)\?;$/\1/p' |
+ sed -n 's/^[[:space:]]\+[^][;:]*[[:space:]]\([^][[:space:];:]\+\)\(\[[^;:]*\]\)\?;$/\1/p' |
while read field; do
FIELD="$(printf %s "$field" |tr '[:lower:]' '[:upper:]')"
cat <<EOF

View File

@ -0,0 +1,156 @@
From cabd6955d3c3048bb2ba19032b504eeb3776a86f Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Tue, 12 Mar 2019 11:17:20 +0000
Subject: [PATCH] bpf: print struct bpf_prog_info.gpl_compatible
This bit field was added by Linux commit v4.18-rc1~114^2~376^2~6.
* bpf_attr.h (struct bpf_prog_info_struct): Add gpl_compatible field.
* bpf.c (print_bpf_prog_info): Print gpl_compatible field.
* tests/bpf-obj_get_info_by_fd.c (main): Update expected output.
---
bpf.c | 5 ++++-
bpf_attr.h | 1 +
tests/bpf-obj_get_info_by_fd.c | 3 +++
3 files changed, 8 insertions(+), 1 deletion(-)
Index: strace-4.24/bpf.c
===================================================================
--- strace-4.24.orig/bpf.c 2020-01-28 00:12:27.629445789 +0100
+++ strace-4.24/bpf.c 2020-01-28 00:14:36.905228319 +0100
@@ -528,11 +528,14 @@
/*
* ifindex, netns_dev, and netns_ino fields were introduced
- * by Linux commit v4.16-rc1~123^2~227^2~5^2~2.
+ * by Linux commit v4.16-rc1~123^2~227^2~5^2~2, and
+ * gpl_compatible was added later by Linux commit
+ * v4.18-rc1~114^2~376^2~6.
*/
if (len <= offsetof(struct bpf_prog_info_struct, ifindex))
goto print_bpf_prog_info_end;
PRINT_FIELD_IFINDEX(", ", info, ifindex);
+ tprintf(", gpl_compatible=%u", info.gpl_compatible);
PRINT_FIELD_DEV(", ", info, netns_dev);
PRINT_FIELD_U(", ", info, netns_ino);
Index: strace-4.24/bpf_attr.h
===================================================================
--- strace-4.24.orig/bpf_attr.h 2020-01-28 00:14:12.107461855 +0100
+++ strace-4.24/bpf_attr.h 2020-01-28 00:14:36.905228319 +0100
@@ -259,6 +259,7 @@
uint64_t ATTRIBUTE_ALIGNED(8) map_ids;
char name[BPF_OBJ_NAME_LEN];
uint32_t ifindex;
+ uint32_t gpl_compatible:1;
/*
* The kernel UAPI is broken by Linux commit
* v4.16-rc1~123^2~227^2~5^2~2 .
Index: strace-4.24/tests/bpf-obj_get_info_by_fd.c
===================================================================
--- strace-4.24.orig/tests/bpf-obj_get_info_by_fd.c 2020-01-28 00:12:27.629445789 +0100
+++ strace-4.24/tests/bpf-obj_get_info_by_fd.c 2020-01-28 00:14:36.905228319 +0100
@@ -461,6 +461,9 @@
offsetof(struct bpf_prog_info_struct, ifindex))
printf(", ifindex=%u", prog_info->ifindex);
if (bpf_prog_get_info_attr.info_len >
+ offsetofend(struct bpf_prog_info_struct, ifindex))
+ printf(", gpl_compatible=%u", prog_info->gpl_compatible);
+ if (bpf_prog_get_info_attr.info_len >
offsetof(struct bpf_prog_info_struct, netns_dev))
printf(", netns_dev=makedev(%u, %u)",
major(prog_info->netns_dev),
Index: strace-4.24/tests-m32/bpf-obj_get_info_by_fd.c
===================================================================
--- strace-4.24.orig/tests-m32/bpf-obj_get_info_by_fd.c 2020-01-27 17:41:26.542587684 +0100
+++ strace-4.24/tests-m32/bpf-obj_get_info_by_fd.c 2020-01-28 00:15:16.441855977 +0100
@@ -461,6 +461,9 @@
offsetof(struct bpf_prog_info_struct, ifindex))
printf(", ifindex=%u", prog_info->ifindex);
if (bpf_prog_get_info_attr.info_len >
+ offsetofend(struct bpf_prog_info_struct, ifindex))
+ printf(", gpl_compatible=%u", prog_info->gpl_compatible);
+ if (bpf_prog_get_info_attr.info_len >
offsetof(struct bpf_prog_info_struct, netns_dev))
printf(", netns_dev=makedev(%u, %u)",
major(prog_info->netns_dev),
Index: strace-4.24/tests-m32/bpf.c
===================================================================
--- strace-4.24.orig/tests-m32/bpf.c 2018-07-11 02:00:57.000000000 +0200
+++ strace-4.24/tests-m32/bpf.c 2020-01-28 00:15:08.917926835 +0100
@@ -5,27 +5,7 @@
* Copyright (c) 2015-2018 The strace developers.
* All rights reserved.
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "tests.h"
Index: strace-4.24/tests-mx32/bpf-obj_get_info_by_fd.c
===================================================================
--- strace-4.24.orig/tests-mx32/bpf-obj_get_info_by_fd.c 2020-01-27 17:41:26.542587684 +0100
+++ strace-4.24/tests-mx32/bpf-obj_get_info_by_fd.c 2020-01-28 00:15:18.824833536 +0100
@@ -461,6 +461,9 @@
offsetof(struct bpf_prog_info_struct, ifindex))
printf(", ifindex=%u", prog_info->ifindex);
if (bpf_prog_get_info_attr.info_len >
+ offsetofend(struct bpf_prog_info_struct, ifindex))
+ printf(", gpl_compatible=%u", prog_info->gpl_compatible);
+ if (bpf_prog_get_info_attr.info_len >
offsetof(struct bpf_prog_info_struct, netns_dev))
printf(", netns_dev=makedev(%u, %u)",
major(prog_info->netns_dev),
Index: strace-4.24/tests-mx32/bpf.c
===================================================================
--- strace-4.24.orig/tests-mx32/bpf.c 2018-07-11 02:00:57.000000000 +0200
+++ strace-4.24/tests-mx32/bpf.c 2020-01-28 00:15:10.852908612 +0100
@@ -5,27 +5,7 @@
* Copyright (c) 2015-2018 The strace developers.
* All rights reserved.
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "tests.h"

View File

@ -0,0 +1,199 @@
From 14a9b6ca66109fc1231eb16e98a9ce4262fb610c Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Tue, 12 Mar 2019 11:17:20 +0000
Subject: [PATCH] bpf: add support for btf_* fields in BPF_MAP_CREATE
* bpf_attr.h (struct BPF_MAP_CREATE_struct): Add btf_fd,
btf_key_type_id, and btf_value_type_id fields.
* bpf.c (BEGIN_BPF_CMD_DECODER(BPF_MAP_CREATE)): Decode btf_fd,
btf_key_type_id, and btf_value_type_id fields introduced by Linux
commits v4.18-rc1~114^2~417^2~1^2~3 and v4.18-rc1~114^2~148^2~7^2~2.
* tests/bpf.c (BPF_MAP_CREATE_checks): Check it.
* tests/bpf-obj_get_info_by_fd.c (print_map_create): Update expected
output.
---
bpf.c | 10 ++++++++++
bpf_attr.h | 5 ++++-
tests/bpf-obj_get_info_by_fd.c | 4 ++++
tests/bpf.c | 20 ++++++++++++++++++++
4 files changed, 38 insertions(+), 1 deletion(-)
Index: strace-4.24/bpf.c
===================================================================
--- strace-4.24.orig/bpf.c 2020-01-28 00:14:36.905228319 +0100
+++ strace-4.24/bpf.c 2020-01-28 00:15:26.973756792 +0100
@@ -212,6 +212,16 @@
if (len <= offsetof(struct BPF_MAP_CREATE_struct, map_ifindex))
break;
PRINT_FIELD_IFINDEX(", ", attr, map_ifindex);
+
+ /*
+ * The following three fields were introduced by Linux commits
+ * v4.18-rc1~114^2~417^2~1^2~3 and v4.18-rc1~114^2~148^2~7^2~2.
+ */
+ if (len <= offsetof(struct BPF_MAP_CREATE_struct, btf_fd))
+ break;
+ PRINT_FIELD_FD(", ", attr, btf_fd, tcp);
+ PRINT_FIELD_U(", ", attr, btf_key_type_id);
+ PRINT_FIELD_U(", ", attr, btf_value_type_id);
}
END_BPF_CMD_DECODER(RVAL_DECODED | RVAL_FD)
Index: strace-4.24/bpf_attr.h
===================================================================
--- strace-4.24.orig/bpf_attr.h 2020-01-28 00:14:36.905228319 +0100
+++ strace-4.24/bpf_attr.h 2020-01-28 00:15:26.974756783 +0100
@@ -45,11 +45,14 @@
uint32_t numa_node;
char map_name[BPF_OBJ_NAME_LEN];
uint32_t map_ifindex;
+ uint32_t btf_fd;
+ uint32_t btf_key_type_id;
+ uint32_t btf_value_type_id;
};
# define BPF_MAP_CREATE_struct_size \
sizeof(struct BPF_MAP_CREATE_struct)
-# define expected_BPF_MAP_CREATE_struct_size 48
+# define expected_BPF_MAP_CREATE_struct_size 60
struct BPF_MAP_LOOKUP_ELEM_struct {
uint32_t map_fd;
Index: strace-4.24/tests/bpf-obj_get_info_by_fd.c
===================================================================
--- strace-4.24.orig/tests/bpf-obj_get_info_by_fd.c 2020-01-28 00:14:36.905228319 +0100
+++ strace-4.24/tests/bpf-obj_get_info_by_fd.c 2020-01-28 00:15:26.974756783 +0100
@@ -84,6 +84,10 @@
printf(", map_name=\"test_map\"");
if (size > offsetof(struct BPF_MAP_CREATE_struct, map_ifindex))
printf(", map_ifindex=0");
+ if (size > offsetof(struct BPF_MAP_CREATE_struct, btf_fd)) {
+ printf(", btf_fd=0</dev/null>"
+ ", btf_key_type_id=0, btf_value_type_id=0");
+ }
printf("}, %zu) = ", size);
if (rc >= 0)
printf("%ld<anon_inode:bpf-map>\n", rc);
Index: strace-4.24/tests/bpf.c
===================================================================
--- strace-4.24.orig/tests/bpf.c 2020-01-28 00:14:36.905228319 +0100
+++ strace-4.24/tests/bpf.c 2020-01-28 00:15:26.975756773 +0100
@@ -400,6 +400,26 @@
", map_ifindex=" IFINDEX_LO_STR,
.init_fn = init_BPF_MAP_CREATE_attr7,
},
+ { /* 8 */
+ .data = { .BPF_MAP_CREATE_data = {
+ .btf_fd = 0xbadc0ded,
+ .btf_key_type_id = 0xfacefeed,
+ .btf_value_type_id = 0xcafef00d
+ } },
+ .size = offsetofend(struct BPF_MAP_CREATE_struct,
+ btf_value_type_id),
+ .str = "map_type=BPF_MAP_TYPE_UNSPEC"
+ ", key_size=0"
+ ", value_size=0"
+ ", max_entries=0"
+ ", map_flags=0"
+ ", inner_map_fd=0"
+ ", map_name=\"\""
+ ", map_ifindex=0"
+ ", btf_fd=-1159983635"
+ ", btf_key_type_id=4207869677"
+ ", btf_value_type_id=3405705229"
+ },
};
static const struct bpf_attr_check BPF_MAP_LOOKUP_ELEM_checks[] = {
Index: strace-4.24/tests-m32/bpf-obj_get_info_by_fd.c
===================================================================
--- strace-4.24.orig/tests-m32/bpf-obj_get_info_by_fd.c 2020-01-28 00:15:16.441855977 +0100
+++ strace-4.24/tests-m32/bpf-obj_get_info_by_fd.c 2020-01-28 00:15:51.739523557 +0100
@@ -84,6 +84,10 @@
printf(", map_name=\"test_map\"");
if (size > offsetof(struct BPF_MAP_CREATE_struct, map_ifindex))
printf(", map_ifindex=0");
+ if (size > offsetof(struct BPF_MAP_CREATE_struct, btf_fd)) {
+ printf(", btf_fd=0</dev/null>"
+ ", btf_key_type_id=0, btf_value_type_id=0");
+ }
printf("}, %zu) = ", size);
if (rc >= 0)
printf("%ld<anon_inode:bpf-map>\n", rc);
Index: strace-4.24/tests-m32/bpf.c
===================================================================
--- strace-4.24.orig/tests-m32/bpf.c 2020-01-28 00:15:08.917926835 +0100
+++ strace-4.24/tests-m32/bpf.c 2020-01-28 00:15:45.840579111 +0100
@@ -400,6 +400,26 @@
", map_ifindex=" IFINDEX_LO_STR,
.init_fn = init_BPF_MAP_CREATE_attr7,
},
+ { /* 8 */
+ .data = { .BPF_MAP_CREATE_data = {
+ .btf_fd = 0xbadc0ded,
+ .btf_key_type_id = 0xfacefeed,
+ .btf_value_type_id = 0xcafef00d
+ } },
+ .size = offsetofend(struct BPF_MAP_CREATE_struct,
+ btf_value_type_id),
+ .str = "map_type=BPF_MAP_TYPE_UNSPEC"
+ ", key_size=0"
+ ", value_size=0"
+ ", max_entries=0"
+ ", map_flags=0"
+ ", inner_map_fd=0"
+ ", map_name=\"\""
+ ", map_ifindex=0"
+ ", btf_fd=-1159983635"
+ ", btf_key_type_id=4207869677"
+ ", btf_value_type_id=3405705229"
+ },
};
static const struct bpf_attr_check BPF_MAP_LOOKUP_ELEM_checks[] = {
Index: strace-4.24/tests-mx32/bpf-obj_get_info_by_fd.c
===================================================================
--- strace-4.24.orig/tests-mx32/bpf-obj_get_info_by_fd.c 2020-01-28 00:15:18.824833536 +0100
+++ strace-4.24/tests-mx32/bpf-obj_get_info_by_fd.c 2020-01-28 00:15:55.110491811 +0100
@@ -84,6 +84,10 @@
printf(", map_name=\"test_map\"");
if (size > offsetof(struct BPF_MAP_CREATE_struct, map_ifindex))
printf(", map_ifindex=0");
+ if (size > offsetof(struct BPF_MAP_CREATE_struct, btf_fd)) {
+ printf(", btf_fd=0</dev/null>"
+ ", btf_key_type_id=0, btf_value_type_id=0");
+ }
printf("}, %zu) = ", size);
if (rc >= 0)
printf("%ld<anon_inode:bpf-map>\n", rc);
Index: strace-4.24/tests-mx32/bpf.c
===================================================================
--- strace-4.24.orig/tests-mx32/bpf.c 2020-01-28 00:15:10.852908612 +0100
+++ strace-4.24/tests-mx32/bpf.c 2020-01-28 00:15:48.667552488 +0100
@@ -400,6 +400,26 @@
", map_ifindex=" IFINDEX_LO_STR,
.init_fn = init_BPF_MAP_CREATE_attr7,
},
+ { /* 8 */
+ .data = { .BPF_MAP_CREATE_data = {
+ .btf_fd = 0xbadc0ded,
+ .btf_key_type_id = 0xfacefeed,
+ .btf_value_type_id = 0xcafef00d
+ } },
+ .size = offsetofend(struct BPF_MAP_CREATE_struct,
+ btf_value_type_id),
+ .str = "map_type=BPF_MAP_TYPE_UNSPEC"
+ ", key_size=0"
+ ", value_size=0"
+ ", max_entries=0"
+ ", map_flags=0"
+ ", inner_map_fd=0"
+ ", map_name=\"\""
+ ", map_ifindex=0"
+ ", btf_fd=-1159983635"
+ ", btf_key_type_id=4207869677"
+ ", btf_value_type_id=3405705229"
+ },
};
static const struct bpf_attr_check BPF_MAP_LOOKUP_ELEM_checks[] = {

View File

@ -0,0 +1,119 @@
From 27bd13d3664a6047e9431e01bd13fc04cc5e373b Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Tue, 12 Mar 2019 11:17:20 +0000
Subject: [PATCH] bpf: add support for btf_* fields in struct bpf_map_info
* bpf_attr.h (struct bpf_map_info_struct): Add btf_fd, btf_key_type_id,
and btf_value_type_id fields.
* bpf.c (print_bpf_map_info): Decode btf_fd, btf_key_type_id,
and btf_value_type_id fields introduced by Linux commits
v4.18-rc1~114^2~223^2~21^2~4 and v4.18-rc1~114^2~148^2~7^2~2.
* tests/bpf-obj_get_info_by_fd.c (main): Update expected output.
---
bpf.c | 10 ++++++++++
bpf_attr.h | 7 +++++--
tests/bpf-obj_get_info_by_fd.c | 9 +++++++++
3 files changed, 24 insertions(+), 2 deletions(-)
Index: strace-4.24/bpf.c
===================================================================
--- strace-4.24.orig/bpf.c 2020-01-28 00:15:26.973756792 +0100
+++ strace-4.24/bpf.c 2020-01-28 00:15:59.919446522 +0100
@@ -466,6 +466,16 @@
PRINT_FIELD_DEV(", ", info, netns_dev);
PRINT_FIELD_U(", ", info, netns_ino);
+ /*
+ * The next three fields were introduced by Linux commits
+ * v4.18-rc1~114^2~223^2~21^2~4 and v4.18-rc1~114^2~148^2~7^2~2.
+ */
+ if (len <= offsetof(struct bpf_map_info_struct, btf_id))
+ goto print_bpf_map_info_end;
+ PRINT_FIELD_U(", ", info, btf_id);
+ PRINT_FIELD_U(", ", info, btf_key_type_id);
+ PRINT_FIELD_U(", ", info, btf_value_type_id);
+
decode_attr_extra_data(tcp, info_buf, size, bpf_map_info_struct_size);
print_bpf_map_info_end:
Index: strace-4.24/bpf_attr.h
===================================================================
--- strace-4.24.orig/bpf_attr.h 2020-01-28 00:15:26.974756783 +0100
+++ strace-4.24/bpf_attr.h 2020-01-28 00:15:59.919446522 +0100
@@ -242,11 +242,14 @@
*/
uint64_t ATTRIBUTE_ALIGNED(8) netns_dev; /* skip check */
uint64_t ATTRIBUTE_ALIGNED(8) netns_ino; /* skip check */
+ uint32_t btf_id;
+ uint32_t btf_key_type_id;
+ uint32_t btf_value_type_id;
};
# define bpf_map_info_struct_size \
- sizeof(struct bpf_map_info_struct)
-# define expected_bpf_map_info_struct_size 64
+ offsetofend(struct bpf_map_info_struct, btf_value_type_id)
+# define expected_bpf_map_info_struct_size 76
struct bpf_prog_info_struct {
uint32_t type;
Index: strace-4.24/tests/bpf-obj_get_info_by_fd.c
===================================================================
--- strace-4.24.orig/tests/bpf-obj_get_info_by_fd.c 2020-01-28 00:15:26.974756783 +0100
+++ strace-4.24/tests/bpf-obj_get_info_by_fd.c 2020-01-28 00:15:59.920446513 +0100
@@ -324,6 +324,15 @@
if (bpf_map_get_info_attr.info_len >
offsetof(struct bpf_map_info_struct, netns_ino))
printf(", netns_ino=%" PRIu64, map_info->netns_ino);
+ if (bpf_map_get_info_attr.info_len >
+ offsetof(struct bpf_map_info_struct, btf_id))
+ PRINT_FIELD_U(", ", *map_info, btf_id);
+ if (bpf_map_get_info_attr.info_len >
+ offsetof(struct bpf_map_info_struct, btf_key_type_id))
+ PRINT_FIELD_U(", ", *map_info, btf_key_type_id);
+ if (bpf_map_get_info_attr.info_len >
+ offsetof(struct bpf_map_info_struct, btf_value_type_id))
+ PRINT_FIELD_U(", ", *map_info, btf_value_type_id);
printf("}");
#else /* !VERBOSE */
printf("%p", map_info);
Index: strace-4.24/tests-m32/bpf-obj_get_info_by_fd.c
===================================================================
--- strace-4.24.orig/tests-m32/bpf-obj_get_info_by_fd.c 2020-01-28 00:15:51.739523557 +0100
+++ strace-4.24/tests-m32/bpf-obj_get_info_by_fd.c 2020-01-28 00:16:14.855305862 +0100
@@ -324,6 +324,15 @@
if (bpf_map_get_info_attr.info_len >
offsetof(struct bpf_map_info_struct, netns_ino))
printf(", netns_ino=%" PRIu64, map_info->netns_ino);
+ if (bpf_map_get_info_attr.info_len >
+ offsetof(struct bpf_map_info_struct, btf_id))
+ PRINT_FIELD_U(", ", *map_info, btf_id);
+ if (bpf_map_get_info_attr.info_len >
+ offsetof(struct bpf_map_info_struct, btf_key_type_id))
+ PRINT_FIELD_U(", ", *map_info, btf_key_type_id);
+ if (bpf_map_get_info_attr.info_len >
+ offsetof(struct bpf_map_info_struct, btf_value_type_id))
+ PRINT_FIELD_U(", ", *map_info, btf_value_type_id);
printf("}");
#else /* !VERBOSE */
printf("%p", map_info);
Index: strace-4.24/tests-mx32/bpf-obj_get_info_by_fd.c
===================================================================
--- strace-4.24.orig/tests-mx32/bpf-obj_get_info_by_fd.c 2020-01-28 00:15:55.110491811 +0100
+++ strace-4.24/tests-mx32/bpf-obj_get_info_by_fd.c 2020-01-28 00:16:23.096228252 +0100
@@ -324,6 +324,15 @@
if (bpf_map_get_info_attr.info_len >
offsetof(struct bpf_map_info_struct, netns_ino))
printf(", netns_ino=%" PRIu64, map_info->netns_ino);
+ if (bpf_map_get_info_attr.info_len >
+ offsetof(struct bpf_map_info_struct, btf_id))
+ PRINT_FIELD_U(", ", *map_info, btf_id);
+ if (bpf_map_get_info_attr.info_len >
+ offsetof(struct bpf_map_info_struct, btf_key_type_id))
+ PRINT_FIELD_U(", ", *map_info, btf_key_type_id);
+ if (bpf_map_get_info_attr.info_len >
+ offsetof(struct bpf_map_info_struct, btf_value_type_id))
+ PRINT_FIELD_U(", ", *map_info, btf_value_type_id);
printf("}");
#else /* !VERBOSE */
printf("%p", map_info);

View File

@ -0,0 +1,220 @@
From d1f90bcdc7cf95cf442321f18452d0367e80b7d5 Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Tue, 12 Mar 2019 11:17:20 +0000
Subject: [PATCH] bpf: add support for *jited_ksyms and *jited_func_lens fields
in struct bpf_prog_info
* bpf_attr.h (struct bpf_prog_info_struct): Add nr_jited_ksyms,
nr_jited_func_lens, jited_ksyms, and jited_func_lens fields.
* bpf.c (struct obj_get_info_saved): Likewise.
(print_bpf_prog_info): Decode these fields introduced by Linux commits
v4.18-rc1~114^2~148^2~3^2~6 and v4.18-rc1~114^2~148^2~3^2~2.
* tests/bpf-obj_get_info_by_fd.c (main): Update expected output.
---
bpf.c | 40 ++++++++++++++++++++++++++++++++++++++++
bpf_attr.h | 6 +++++-
tests/bpf-obj_get_info_by_fd.c | 21 +++++++++++++++++++++
3 files changed, 66 insertions(+), 1 deletion(-)
Index: strace-4.24/bpf.c
===================================================================
--- strace-4.24.orig/bpf.c 2020-01-28 00:15:59.919446522 +0100
+++ strace-4.24/bpf.c 2020-01-28 00:16:27.823183735 +0100
@@ -427,6 +427,11 @@
uint32_t jited_prog_len;
uint32_t xlated_prog_len;
uint32_t nr_map_ids;
+
+ uint32_t nr_jited_ksyms;
+ uint32_t nr_jited_func_lens;
+ uint64_t jited_ksyms;
+ uint64_t jited_func_lens;
};
static void
@@ -497,6 +502,10 @@
saved->jited_prog_len = info.jited_prog_len;
saved->xlated_prog_len = info.xlated_prog_len;
saved->nr_map_ids = info.nr_map_ids;
+ saved->nr_jited_ksyms = info.nr_jited_ksyms;
+ saved->nr_jited_func_lens = info.nr_jited_func_lens;
+ saved->jited_ksyms = info.jited_ksyms;
+ saved->jited_func_lens = info.jited_func_lens;
return;
}
@@ -559,6 +568,37 @@
PRINT_FIELD_DEV(", ", info, netns_dev);
PRINT_FIELD_U(", ", info, netns_ino);
+ /*
+ * The next four fields were introduced by Linux commits
+ * v4.18-rc1~114^2~148^2~3^2~6 and v4.18-rc1~114^2~148^2~3^2~2.
+ */
+ if (len <= offsetof(struct bpf_prog_info_struct, nr_jited_ksyms))
+ goto print_bpf_prog_info_end;
+
+ tprints(", nr_jited_ksyms=");
+ if (saved->nr_jited_ksyms != info.nr_jited_ksyms)
+ tprintf("%" PRIu32 " => ", saved->nr_jited_ksyms);
+ tprintf("%" PRIu32, info.nr_jited_ksyms);
+
+ tprints(", nr_jited_func_lens=");
+ if (saved->nr_jited_func_lens != info.nr_jited_func_lens)
+ tprintf("%" PRIu32 " => ", saved->nr_jited_func_lens);
+ tprintf("%" PRIu32, info.nr_jited_func_lens);
+
+ tprints(", jited_ksyms=");
+ if (saved->jited_ksyms != info.jited_ksyms) {
+ printaddr64(saved->jited_ksyms);
+ tprints(" => ");
+ }
+ printaddr64(info.jited_ksyms);
+
+ tprints(", jited_func_lens=");
+ if (saved->jited_func_lens != info.jited_func_lens) {
+ printaddr64(saved->jited_func_lens);
+ tprints(" => ");
+ }
+ printaddr64(info.jited_func_lens);
+
decode_attr_extra_data(tcp, info_buf, size, bpf_prog_info_struct_size);
print_bpf_prog_info_end:
Index: strace-4.24/bpf_attr.h
===================================================================
--- strace-4.24.orig/bpf_attr.h 2020-01-28 00:15:59.919446522 +0100
+++ strace-4.24/bpf_attr.h 2020-01-28 00:16:27.823183735 +0100
@@ -272,10 +272,14 @@
*/
uint64_t ATTRIBUTE_ALIGNED(8) netns_dev; /* skip check */
uint64_t ATTRIBUTE_ALIGNED(8) netns_ino; /* skip check */
+ uint32_t nr_jited_ksyms;
+ uint32_t nr_jited_func_lens;
+ uint64_t ATTRIBUTE_ALIGNED(8) jited_ksyms;
+ uint64_t ATTRIBUTE_ALIGNED(8) jited_func_lens;
};
# define bpf_prog_info_struct_size \
sizeof(struct bpf_prog_info_struct)
-# define expected_bpf_prog_info_struct_size 104
+# define expected_bpf_prog_info_struct_size 128
#endif /* !STRACE_BPF_ATTR_H */
Index: strace-4.24/tests/bpf-obj_get_info_by_fd.c
===================================================================
--- strace-4.24.orig/tests/bpf-obj_get_info_by_fd.c 2020-01-28 00:15:59.920446513 +0100
+++ strace-4.24/tests/bpf-obj_get_info_by_fd.c 2020-01-28 00:16:27.823183735 +0100
@@ -358,6 +358,8 @@
memset(prog_info, 0, PROG_INFO_SZ);
for (unsigned int i = 0; i < 4; i++) {
prog_info->jited_prog_len = 0;
+ prog_info->nr_jited_ksyms = 0;
+ prog_info->nr_jited_func_lens = 0;
memset(prog_info + 1, 0, PROG_INFO_SZ - sizeof(*prog_info));
switch (i) {
case 1:
@@ -485,6 +487,25 @@
offsetof(struct bpf_prog_info_struct, netns_ino))
printf(", netns_ino=%" PRIu64, prog_info->netns_ino);
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, nr_jited_ksyms)) {
+ printf(", nr_jited_ksyms=0");
+ if (prog_info->nr_jited_ksyms)
+ printf(" => %u", prog_info->nr_jited_ksyms);
+ }
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, nr_jited_func_lens)) {
+ printf(", nr_jited_func_lens=0");
+ if (prog_info->nr_jited_func_lens)
+ printf(" => %u", prog_info->nr_jited_func_lens);
+ }
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, jited_ksyms))
+ printf(", jited_ksyms=NULL");
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, jited_func_lens))
+ printf(", jited_func_lens=NULL");
+
printf("}");
# else /* !VERBOSE */
printf("%p", prog_info);
Index: strace-4.24/tests-m32/bpf-obj_get_info_by_fd.c
===================================================================
--- strace-4.24.orig/tests-m32/bpf-obj_get_info_by_fd.c 2020-01-28 00:16:14.855305862 +0100
+++ strace-4.24/tests-m32/bpf-obj_get_info_by_fd.c 2020-01-28 00:16:37.300094485 +0100
@@ -358,6 +358,8 @@
memset(prog_info, 0, PROG_INFO_SZ);
for (unsigned int i = 0; i < 4; i++) {
prog_info->jited_prog_len = 0;
+ prog_info->nr_jited_ksyms = 0;
+ prog_info->nr_jited_func_lens = 0;
memset(prog_info + 1, 0, PROG_INFO_SZ - sizeof(*prog_info));
switch (i) {
case 1:
@@ -485,6 +487,25 @@
offsetof(struct bpf_prog_info_struct, netns_ino))
printf(", netns_ino=%" PRIu64, prog_info->netns_ino);
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, nr_jited_ksyms)) {
+ printf(", nr_jited_ksyms=0");
+ if (prog_info->nr_jited_ksyms)
+ printf(" => %u", prog_info->nr_jited_ksyms);
+ }
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, nr_jited_func_lens)) {
+ printf(", nr_jited_func_lens=0");
+ if (prog_info->nr_jited_func_lens)
+ printf(" => %u", prog_info->nr_jited_func_lens);
+ }
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, jited_ksyms))
+ printf(", jited_ksyms=NULL");
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, jited_func_lens))
+ printf(", jited_func_lens=NULL");
+
printf("}");
# else /* !VERBOSE */
printf("%p", prog_info);
Index: strace-4.24/tests-mx32/bpf-obj_get_info_by_fd.c
===================================================================
--- strace-4.24.orig/tests-mx32/bpf-obj_get_info_by_fd.c 2020-01-28 00:16:23.096228252 +0100
+++ strace-4.24/tests-mx32/bpf-obj_get_info_by_fd.c 2020-01-28 00:16:34.082124791 +0100
@@ -358,6 +358,8 @@
memset(prog_info, 0, PROG_INFO_SZ);
for (unsigned int i = 0; i < 4; i++) {
prog_info->jited_prog_len = 0;
+ prog_info->nr_jited_ksyms = 0;
+ prog_info->nr_jited_func_lens = 0;
memset(prog_info + 1, 0, PROG_INFO_SZ - sizeof(*prog_info));
switch (i) {
case 1:
@@ -485,6 +487,25 @@
offsetof(struct bpf_prog_info_struct, netns_ino))
printf(", netns_ino=%" PRIu64, prog_info->netns_ino);
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, nr_jited_ksyms)) {
+ printf(", nr_jited_ksyms=0");
+ if (prog_info->nr_jited_ksyms)
+ printf(" => %u", prog_info->nr_jited_ksyms);
+ }
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, nr_jited_func_lens)) {
+ printf(", nr_jited_func_lens=0");
+ if (prog_info->nr_jited_func_lens)
+ printf(" => %u", prog_info->nr_jited_func_lens);
+ }
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, jited_ksyms))
+ printf(", jited_ksyms=NULL");
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, jited_func_lens))
+ printf(", jited_func_lens=NULL");
+
printf("}");
# else /* !VERBOSE */
printf("%p", prog_info);

View File

@ -0,0 +1,410 @@
From 940fe50f5a72d2624b217ccaf720b05f06a4dd90 Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Tue, 12 Mar 2019 11:17:20 +0000
Subject: [PATCH] bpf: add support for new twelve fields in struct
bpf_prog_info
* bpf_attr.h (struct bpf_prog_info_struct): Add btf_id,
func_info_rec_size, func_info, nr_func_info, nr_line_info, line_info,
jited_line_info, nr_jited_line_info, line_info_rec_size,
jited_line_info_rec_size, nr_prog_tags, and prog_tags fields.
* bpf.c (struct obj_get_info_saved): Add func_info_rec_size,
nr_func_info, nr_line_info, jited_line_info, nr_jited_line_info,
line_info_rec_size, jited_line_info_rec_size, and nr_prog_tags fields.
(print_bpf_prog_info): Decode the twelve fields introduced by Linux
commits v5.0-rc1~129^2~209^2~16^2~8, v5.0-rc1~129^2~114^2~5^2~6,
v5.0-rc1~129^2~114^2^2~2, and v5.0-rc1~129^2~15^2~22.
* NEWS: Mention the latest bpf decoding enhancements.
* tests/bpf-obj_get_info_by_fd.c (main): Update expected output.
Resolves: https://github.com/strace/strace/issues/94
---
NEWS | 1 +
bpf.c | 78 ++++++++++++++++++++++++++++++++++++++++++
bpf_attr.h | 14 +++++++-
tests/bpf-obj_get_info_by_fd.c | 66 +++++++++++++++++++++++++++++++++++
4 files changed, 158 insertions(+), 1 deletion(-)
Index: strace-4.24/bpf.c
===================================================================
--- strace-4.24.orig/bpf.c 2020-01-28 00:16:27.823183735 +0100
+++ strace-4.24/bpf.c 2020-01-28 00:16:43.588035268 +0100
@@ -432,6 +432,15 @@
uint32_t nr_jited_func_lens;
uint64_t jited_ksyms;
uint64_t jited_func_lens;
+
+ uint32_t func_info_rec_size;
+ uint32_t nr_func_info;
+ uint32_t nr_line_info;
+ uint32_t nr_jited_line_info;
+ uint64_t jited_line_info;
+ uint32_t line_info_rec_size;
+ uint32_t jited_line_info_rec_size;
+ uint32_t nr_prog_tags;
};
static void
@@ -507,6 +516,15 @@
saved->jited_ksyms = info.jited_ksyms;
saved->jited_func_lens = info.jited_func_lens;
+ saved->func_info_rec_size = info.func_info_rec_size;
+ saved->nr_func_info = info.nr_func_info;
+ saved->nr_line_info = info.nr_line_info;
+ saved->nr_jited_line_info = info.nr_jited_line_info;
+ saved->jited_line_info = info.jited_line_info;
+ saved->line_info_rec_size = info.line_info_rec_size;
+ saved->jited_line_info_rec_size = info.jited_line_info_rec_size;
+ saved->nr_prog_tags = info.nr_prog_tags;
+
return;
}
@@ -599,6 +617,66 @@
}
printaddr64(info.jited_func_lens);
+ /*
+ * The next twelve fields were introduced by Linux commits
+ * v5.0-rc1~129^2~209^2~16^2~8
+ * v5.0-rc1~129^2~114^2~5^2~6
+ * v5.0-rc1~129^2~114^2^2~2
+ * v5.0-rc1~129^2~15^2~22
+ */
+ if (len <= offsetof(struct bpf_prog_info_struct, btf_id))
+ goto print_bpf_prog_info_end;
+
+ PRINT_FIELD_U(", ", info, btf_id);
+
+ tprints(", func_info_rec_size=");
+ if (saved->func_info_rec_size != info.func_info_rec_size)
+ tprintf("%" PRIu32 " => ", saved->func_info_rec_size);
+ tprintf("%" PRIu32, info.func_info_rec_size);
+
+ PRINT_FIELD_ADDR64(", ", info, func_info);
+
+ tprints(", nr_func_info=");
+ if (saved->nr_func_info != info.nr_func_info)
+ tprintf("%" PRIu32 " => ", saved->nr_func_info);
+ tprintf("%" PRIu32, info.nr_func_info);
+
+ tprints(", nr_line_info=");
+ if (saved->nr_line_info != info.nr_line_info)
+ tprintf("%" PRIu32 " => ", saved->nr_line_info);
+ tprintf("%" PRIu32, info.nr_line_info);
+
+ PRINT_FIELD_ADDR64(", ", info, line_info);
+
+ tprints(", jited_line_info=");
+ if (saved->jited_line_info != info.jited_line_info) {
+ printaddr64(saved->jited_line_info);
+ tprints(" => ");
+ }
+ printaddr64(info.jited_line_info);
+
+ tprints(", nr_jited_line_info=");
+ if (saved->nr_jited_line_info != info.nr_jited_line_info)
+ tprintf("%" PRIu32 " => ", saved->nr_jited_line_info);
+ tprintf("%" PRIu32, info.nr_jited_line_info);
+
+ tprints(", line_info_rec_size=");
+ if (saved->line_info_rec_size != info.line_info_rec_size)
+ tprintf("%" PRIu32 " => ", saved->line_info_rec_size);
+ tprintf("%" PRIu32, info.line_info_rec_size);
+
+ tprints(", jited_line_info_rec_size=");
+ if (saved->jited_line_info_rec_size != info.jited_line_info_rec_size)
+ tprintf("%" PRIu32 " => ", saved->jited_line_info_rec_size);
+ tprintf("%" PRIu32, info.jited_line_info_rec_size);
+
+ tprints(", nr_prog_tags=");
+ if (saved->nr_prog_tags != info.nr_prog_tags)
+ tprintf("%" PRIu32 " => ", saved->nr_prog_tags);
+ tprintf("%" PRIu32, info.nr_prog_tags);
+
+ PRINT_FIELD_ADDR64(", ", info, prog_tags);
+
decode_attr_extra_data(tcp, info_buf, size, bpf_prog_info_struct_size);
print_bpf_prog_info_end:
Index: strace-4.24/bpf_attr.h
===================================================================
--- strace-4.24.orig/bpf_attr.h 2020-01-28 00:16:27.823183735 +0100
+++ strace-4.24/bpf_attr.h 2020-01-28 00:16:43.588035268 +0100
@@ -276,10 +276,22 @@
uint32_t nr_jited_func_lens;
uint64_t ATTRIBUTE_ALIGNED(8) jited_ksyms;
uint64_t ATTRIBUTE_ALIGNED(8) jited_func_lens;
+ uint32_t btf_id;
+ uint32_t func_info_rec_size;
+ uint64_t ATTRIBUTE_ALIGNED(8) func_info;
+ uint32_t nr_func_info;
+ uint32_t nr_line_info;
+ uint64_t ATTRIBUTE_ALIGNED(8) line_info;
+ uint64_t ATTRIBUTE_ALIGNED(8) jited_line_info;
+ uint32_t nr_jited_line_info;
+ uint32_t line_info_rec_size;
+ uint32_t jited_line_info_rec_size;
+ uint32_t nr_prog_tags;
+ uint64_t ATTRIBUTE_ALIGNED(8) prog_tags;
};
# define bpf_prog_info_struct_size \
sizeof(struct bpf_prog_info_struct)
-# define expected_bpf_prog_info_struct_size 128
+# define expected_bpf_prog_info_struct_size 192
#endif /* !STRACE_BPF_ATTR_H */
Index: strace-4.24/tests/bpf-obj_get_info_by_fd.c
===================================================================
--- strace-4.24.orig/tests/bpf-obj_get_info_by_fd.c 2020-01-28 00:16:27.823183735 +0100
+++ strace-4.24/tests/bpf-obj_get_info_by_fd.c 2020-01-28 00:16:43.589035258 +0100
@@ -360,6 +360,14 @@
prog_info->jited_prog_len = 0;
prog_info->nr_jited_ksyms = 0;
prog_info->nr_jited_func_lens = 0;
+ prog_info->func_info_rec_size = 0;
+ prog_info->nr_func_info = 0;
+ prog_info->nr_line_info = 0;
+ prog_info->nr_jited_line_info = 0;
+ prog_info->jited_line_info = 0;
+ prog_info->line_info_rec_size = 0;
+ prog_info->jited_line_info_rec_size = 0;
+ prog_info->nr_prog_tags = 0;
memset(prog_info + 1, 0, PROG_INFO_SZ - sizeof(*prog_info));
switch (i) {
case 1:
@@ -506,6 +514,64 @@
offsetof(struct bpf_prog_info_struct, jited_func_lens))
printf(", jited_func_lens=NULL");
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, btf_id))
+ PRINT_FIELD_U(", ", *prog_info, btf_id);
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, func_info_rec_size)) {
+ printf(", func_info_rec_size=0");
+ if (prog_info->func_info_rec_size)
+ printf(" => %u", prog_info->func_info_rec_size);
+ }
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, func_info))
+ printf(", func_info=NULL");
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, nr_func_info)) {
+ printf(", nr_func_info=0");
+ if (prog_info->nr_func_info)
+ printf(" => %u", prog_info->nr_func_info);
+ }
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, nr_line_info)) {
+ printf(", nr_line_info=0");
+ if (prog_info->nr_line_info)
+ printf(" => %u", prog_info->nr_line_info);
+ }
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, line_info))
+ printf(", line_info=NULL");
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, jited_line_info))
+ printf(", jited_line_info=NULL");
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, nr_jited_line_info)) {
+ printf(", nr_jited_line_info=0");
+ if (prog_info->nr_jited_line_info)
+ printf(" => %u", prog_info->nr_jited_line_info);
+ }
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, line_info_rec_size)) {
+ printf(", line_info_rec_size=0");
+ if (prog_info->line_info_rec_size)
+ printf(" => %u", prog_info->line_info_rec_size);
+ }
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, jited_line_info_rec_size)) {
+ printf(", jited_line_info_rec_size=0");
+ if (prog_info->jited_line_info_rec_size)
+ printf(" => %u", prog_info->jited_line_info_rec_size);
+ }
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, nr_prog_tags)) {
+ printf(", nr_prog_tags=0");
+ if (prog_info->nr_prog_tags)
+ printf(" => %u", prog_info->nr_prog_tags);
+ }
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, prog_tags))
+ printf(", prog_tags=NULL");
+
printf("}");
# else /* !VERBOSE */
printf("%p", prog_info);
Index: strace-4.24/tests-m32/bpf-obj_get_info_by_fd.c
===================================================================
--- strace-4.24.orig/tests-m32/bpf-obj_get_info_by_fd.c 2020-01-28 00:16:37.300094485 +0100
+++ strace-4.24/tests-m32/bpf-obj_get_info_by_fd.c 2020-01-28 00:16:49.360980900 +0100
@@ -360,6 +360,14 @@
prog_info->jited_prog_len = 0;
prog_info->nr_jited_ksyms = 0;
prog_info->nr_jited_func_lens = 0;
+ prog_info->func_info_rec_size = 0;
+ prog_info->nr_func_info = 0;
+ prog_info->nr_line_info = 0;
+ prog_info->nr_jited_line_info = 0;
+ prog_info->jited_line_info = 0;
+ prog_info->line_info_rec_size = 0;
+ prog_info->jited_line_info_rec_size = 0;
+ prog_info->nr_prog_tags = 0;
memset(prog_info + 1, 0, PROG_INFO_SZ - sizeof(*prog_info));
switch (i) {
case 1:
@@ -506,6 +514,64 @@
offsetof(struct bpf_prog_info_struct, jited_func_lens))
printf(", jited_func_lens=NULL");
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, btf_id))
+ PRINT_FIELD_U(", ", *prog_info, btf_id);
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, func_info_rec_size)) {
+ printf(", func_info_rec_size=0");
+ if (prog_info->func_info_rec_size)
+ printf(" => %u", prog_info->func_info_rec_size);
+ }
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, func_info))
+ printf(", func_info=NULL");
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, nr_func_info)) {
+ printf(", nr_func_info=0");
+ if (prog_info->nr_func_info)
+ printf(" => %u", prog_info->nr_func_info);
+ }
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, nr_line_info)) {
+ printf(", nr_line_info=0");
+ if (prog_info->nr_line_info)
+ printf(" => %u", prog_info->nr_line_info);
+ }
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, line_info))
+ printf(", line_info=NULL");
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, jited_line_info))
+ printf(", jited_line_info=NULL");
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, nr_jited_line_info)) {
+ printf(", nr_jited_line_info=0");
+ if (prog_info->nr_jited_line_info)
+ printf(" => %u", prog_info->nr_jited_line_info);
+ }
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, line_info_rec_size)) {
+ printf(", line_info_rec_size=0");
+ if (prog_info->line_info_rec_size)
+ printf(" => %u", prog_info->line_info_rec_size);
+ }
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, jited_line_info_rec_size)) {
+ printf(", jited_line_info_rec_size=0");
+ if (prog_info->jited_line_info_rec_size)
+ printf(" => %u", prog_info->jited_line_info_rec_size);
+ }
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, nr_prog_tags)) {
+ printf(", nr_prog_tags=0");
+ if (prog_info->nr_prog_tags)
+ printf(" => %u", prog_info->nr_prog_tags);
+ }
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, prog_tags))
+ printf(", prog_tags=NULL");
+
printf("}");
# else /* !VERBOSE */
printf("%p", prog_info);
Index: strace-4.24/tests-mx32/bpf-obj_get_info_by_fd.c
===================================================================
--- strace-4.24.orig/tests-mx32/bpf-obj_get_info_by_fd.c 2020-01-28 00:16:34.082124791 +0100
+++ strace-4.24/tests-mx32/bpf-obj_get_info_by_fd.c 2020-01-28 00:16:51.902956961 +0100
@@ -360,6 +360,14 @@
prog_info->jited_prog_len = 0;
prog_info->nr_jited_ksyms = 0;
prog_info->nr_jited_func_lens = 0;
+ prog_info->func_info_rec_size = 0;
+ prog_info->nr_func_info = 0;
+ prog_info->nr_line_info = 0;
+ prog_info->nr_jited_line_info = 0;
+ prog_info->jited_line_info = 0;
+ prog_info->line_info_rec_size = 0;
+ prog_info->jited_line_info_rec_size = 0;
+ prog_info->nr_prog_tags = 0;
memset(prog_info + 1, 0, PROG_INFO_SZ - sizeof(*prog_info));
switch (i) {
case 1:
@@ -506,6 +514,64 @@
offsetof(struct bpf_prog_info_struct, jited_func_lens))
printf(", jited_func_lens=NULL");
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, btf_id))
+ PRINT_FIELD_U(", ", *prog_info, btf_id);
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, func_info_rec_size)) {
+ printf(", func_info_rec_size=0");
+ if (prog_info->func_info_rec_size)
+ printf(" => %u", prog_info->func_info_rec_size);
+ }
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, func_info))
+ printf(", func_info=NULL");
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, nr_func_info)) {
+ printf(", nr_func_info=0");
+ if (prog_info->nr_func_info)
+ printf(" => %u", prog_info->nr_func_info);
+ }
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, nr_line_info)) {
+ printf(", nr_line_info=0");
+ if (prog_info->nr_line_info)
+ printf(" => %u", prog_info->nr_line_info);
+ }
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, line_info))
+ printf(", line_info=NULL");
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, jited_line_info))
+ printf(", jited_line_info=NULL");
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, nr_jited_line_info)) {
+ printf(", nr_jited_line_info=0");
+ if (prog_info->nr_jited_line_info)
+ printf(" => %u", prog_info->nr_jited_line_info);
+ }
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, line_info_rec_size)) {
+ printf(", line_info_rec_size=0");
+ if (prog_info->line_info_rec_size)
+ printf(" => %u", prog_info->line_info_rec_size);
+ }
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, jited_line_info_rec_size)) {
+ printf(", jited_line_info_rec_size=0");
+ if (prog_info->jited_line_info_rec_size)
+ printf(" => %u", prog_info->jited_line_info_rec_size);
+ }
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, nr_prog_tags)) {
+ printf(", nr_prog_tags=0");
+ if (prog_info->nr_prog_tags)
+ printf(" => %u", prog_info->nr_prog_tags);
+ }
+ if (bpf_prog_get_info_attr.info_len >
+ offsetof(struct bpf_prog_info_struct, prog_tags))
+ printf(", prog_tags=NULL");
+
printf("}");
# else /* !VERBOSE */
printf("%p", prog_info);

View File

@ -0,0 +1,79 @@
From c661605b520fa64b6fc042a642027c14ae9a62f9 Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Tue, 21 May 2019 23:30:35 +0000
Subject: [PATCH] tests: robustify bpf-obj_get_info_by_fd test against future
kernels
* tests/bpf-obj_get_info_by_fd.c (print_prog_load, main): Change
log_level from 42 to 7, to placate Linux kernels containing commit
v5.2-rc1~133^2~193^2~18^2~9.
---
tests/bpf-obj_get_info_by_fd.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
Index: strace-4.24/tests/bpf-obj_get_info_by_fd.c
===================================================================
--- strace-4.24.orig/tests/bpf-obj_get_info_by_fd.c 2020-01-28 00:16:43.589035258 +0100
+++ strace-4.24/tests/bpf-obj_get_info_by_fd.c 2020-01-28 01:49:32.228432719 +0100
@@ -180,7 +180,7 @@
if (size > offsetof(struct BPF_PROG_LOAD_struct, license))
printf(", license=\"BSD\"");
if (size > offsetof(struct BPF_PROG_LOAD_struct, log_buf))
- printf(", log_level=42, log_size=%zu, log_buf=\"\"",
+ printf(", log_level=7, log_size=%zu, log_buf=\"\"",
sizeof(log_buf));
if (size > offsetof(struct BPF_PROG_LOAD_struct, kern_version))
printf(", kern_version=KERNEL_VERSION(57005, 192, 222)");
@@ -239,7 +239,7 @@
.insn_cnt = ARRAY_SIZE(socket_prog),
.insns = (uintptr_t) socket_prog,
.license = (uintptr_t) license,
- .log_level = 42,
+ .log_level = 7,
.log_size = sizeof(log_buf),
.log_buf = (uintptr_t) log_buf,
.kern_version = 0xdeadc0de,
Index: strace-4.24/tests-m32/bpf-obj_get_info_by_fd.c
===================================================================
--- strace-4.24.orig/tests-m32/bpf-obj_get_info_by_fd.c 2020-01-28 00:16:49.360980900 +0100
+++ strace-4.24/tests-m32/bpf-obj_get_info_by_fd.c 2020-01-28 01:53:08.192398852 +0100
@@ -180,7 +180,7 @@
if (size > offsetof(struct BPF_PROG_LOAD_struct, license))
printf(", license=\"BSD\"");
if (size > offsetof(struct BPF_PROG_LOAD_struct, log_buf))
- printf(", log_level=42, log_size=%zu, log_buf=\"\"",
+ printf(", log_level=7, log_size=%zu, log_buf=\"\"",
sizeof(log_buf));
if (size > offsetof(struct BPF_PROG_LOAD_struct, kern_version))
printf(", kern_version=KERNEL_VERSION(57005, 192, 222)");
@@ -239,7 +239,7 @@
.insn_cnt = ARRAY_SIZE(socket_prog),
.insns = (uintptr_t) socket_prog,
.license = (uintptr_t) license,
- .log_level = 42,
+ .log_level = 7,
.log_size = sizeof(log_buf),
.log_buf = (uintptr_t) log_buf,
.kern_version = 0xdeadc0de,
Index: strace-4.24/tests-mx32/bpf-obj_get_info_by_fd.c
===================================================================
--- strace-4.24.orig/tests-mx32/bpf-obj_get_info_by_fd.c 2020-01-28 00:16:51.902956961 +0100
+++ strace-4.24/tests-mx32/bpf-obj_get_info_by_fd.c 2020-01-28 01:53:10.772374555 +0100
@@ -180,7 +180,7 @@
if (size > offsetof(struct BPF_PROG_LOAD_struct, license))
printf(", license=\"BSD\"");
if (size > offsetof(struct BPF_PROG_LOAD_struct, log_buf))
- printf(", log_level=42, log_size=%zu, log_buf=\"\"",
+ printf(", log_level=7, log_size=%zu, log_buf=\"\"",
sizeof(log_buf));
if (size > offsetof(struct BPF_PROG_LOAD_struct, kern_version))
printf(", kern_version=KERNEL_VERSION(57005, 192, 222)");
@@ -239,7 +239,7 @@
.insn_cnt = ARRAY_SIZE(socket_prog),
.insns = (uintptr_t) socket_prog,
.license = (uintptr_t) license,
- .log_level = 42,
+ .log_level = 7,
.log_size = sizeof(log_buf),
.log_buf = (uintptr_t) log_buf,
.kern_version = 0xdeadc0de,

View File

@ -0,0 +1,37 @@
From 0b051a218d5e7e51677c26c691dcf619a7d894e9 Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Mon, 11 Feb 2019 23:35:07 +0000
Subject: [PATCH] Wire up rseq syscall on architectures that use generic
unistd.h
* linux/32/syscallent.h [293]: Wire up rseq syscall introduced by linux
commit v4.19-rc1~109^2~47.
* linux/64/syscallent.h [293]: Likewise.
* NEWS: Mention this.
---
NEWS | 2 ++
linux/32/syscallent.h | 1 +
linux/64/syscallent.h | 1 +
3 files changed, 4 insertions(+)
Index: strace-4.24/linux/32/syscallent.h
===================================================================
--- strace-4.24.orig/linux/32/syscallent.h 2019-06-13 01:05:32.297055881 +0200
+++ strace-4.24/linux/32/syscallent.h 2019-06-13 01:05:42.887824722 +0200
@@ -283,6 +283,7 @@
[290] = { 1, 0, SEN(pkey_free), "pkey_free" },
[291] = { 5, TD|TF|TSTA, SEN(statx), "statx" },
[292] = { 6, 0, SEN(io_pgetevents), "io_pgetevents" },
+[293] = { 4, 0, SEN(rseq), "rseq" },
#undef sys_ARCH_mmap
#undef ARCH_WANT_SYNC_FILE_RANGE2
Index: strace-4.24/linux/64/syscallent.h
===================================================================
--- strace-4.24.orig/linux/64/syscallent.h 2019-06-13 01:05:32.297055881 +0200
+++ strace-4.24/linux/64/syscallent.h 2019-06-13 01:05:42.888824700 +0200
@@ -276,3 +276,4 @@
[290] = { 1, 0, SEN(pkey_free), "pkey_free" },
[291] = { 5, TD|TF|TSTA, SEN(statx), "statx" },
[292] = { 6, 0, SEN(io_pgetevents), "io_pgetevents" },
+[293] = { 4, 0, SEN(rseq), "rseq" },

View File

@ -0,0 +1,39 @@
From 898f0ad0bc498c45734bc95917b74cfdc6466c26 Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Mon, 11 Feb 2019 23:35:07 +0000
Subject: [PATCH] Wire up kexec_file_load syscall on architectures that use
generic unistd.h
* linux/32/syscallent.h [294]: Wire up kexec_file_load syscall
introduced by linux commit v5.0-rc1~35^2~41^2~15.
* linux/64/syscallent.h [294]: Likewise.
* NEWS: Mention this.
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1676045
---
NEWS | 2 +-
linux/32/syscallent.h | 1 +
linux/64/syscallent.h | 1 +
3 files changed, 3 insertions(+), 1 deletion(-)
Index: strace-4.24/linux/32/syscallent.h
===================================================================
--- strace-4.24.orig/linux/32/syscallent.h 2019-06-13 01:05:42.887824722 +0200
+++ strace-4.24/linux/32/syscallent.h 2019-06-13 01:06:00.405442367 +0200
@@ -284,6 +284,7 @@
[291] = { 5, TD|TF|TSTA, SEN(statx), "statx" },
[292] = { 6, 0, SEN(io_pgetevents), "io_pgetevents" },
[293] = { 4, 0, SEN(rseq), "rseq" },
+[294] = { 5, TD, SEN(kexec_file_load), "kexec_file_load" },
#undef sys_ARCH_mmap
#undef ARCH_WANT_SYNC_FILE_RANGE2
Index: strace-4.24/linux/64/syscallent.h
===================================================================
--- strace-4.24.orig/linux/64/syscallent.h 2019-06-13 01:05:42.888824700 +0200
+++ strace-4.24/linux/64/syscallent.h 2019-06-13 01:06:00.405442367 +0200
@@ -277,3 +277,4 @@
[291] = { 5, TD|TF|TSTA, SEN(statx), "statx" },
[292] = { 6, 0, SEN(io_pgetevents), "io_pgetevents" },
[293] = { 4, 0, SEN(rseq), "rseq" },
+[294] = { 5, TD, SEN(kexec_file_load), "kexec_file_load" },

View File

@ -0,0 +1,42 @@
Limit the scope of qual_fault.tests on aarch64 as otherwise it takes
unacceptable amount of time on available builders (more than an hour).
Index: strace-4.24/tests/qual_fault.test
===================================================================
--- strace-4.24.orig/tests/qual_fault.test 2019-06-13 17:37:10.708269613 +0200
+++ strace-4.24/tests/qual_fault.test 2019-06-13 17:41:29.358829506 +0200
@@ -75,18 +75,32 @@
done
}
-for err in '' ENOSYS 22 einval; do
+
+case "$STRACE_ARCH" in
+ aarch64)
+ NUMBERS1='2'
+ NUMBERS2='3'
+ ERRS='EnoSys 22'
+ ;;
+ *)
+ ERRS='ENOSYS 22 einval'
+ NUMBERS1='1 2 3 5 7 11'
+ NUMBERS2='1 2 3 5 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 5 7 11; do
+ for F in $(echo $NUMBERS1); do
check_fault_injection \
writev $fault "$err" $F '' 1
check_fault_injection \
writev $fault "$err" $F + 1
- for S in 1 2 3 5 7 11; do
+ for S in $(echo $NUMBERS2); do
check_fault_injection \
writev $fault "$err" $F $S 1
check_fault_injection \

View File

@ -0,0 +1,76 @@
Unfortunately, strace 5.1 rebase didn't make it into RHEL 8.2.
As a result, ksystent tests now fails due to presence of new io_uring* syscalls.
Disable it for 8.2 in anticipation of a rebase in 8.3 timeframe.
Index: strace-4.24/tests-m32/Makefile.am
===================================================================
--- strace-4.24.orig/tests-m32/Makefile.am 2019-12-02 18:36:41.156516491 +0100
+++ strace-4.24/tests-m32/Makefile.am 2019-12-02 20:32:00.744610221 +0100
@@ -323,7 +323,6 @@
get_regs.test \
inject-nf.test \
interactive_block.test \
- ksysent.test \
localtime.test \
opipe.test \
options-syntax.test \
Index: strace-4.24/tests-m32/Makefile.in
===================================================================
--- strace-4.24.orig/tests-m32/Makefile.in 2019-12-02 18:36:41.079516234 +0100
+++ strace-4.24/tests-m32/Makefile.in 2019-12-02 20:32:07.676582952 +0100
@@ -4246,7 +4246,6 @@
inject-nf.test \
interactive_block.test \
kill_child.test \
- ksysent.test \
localtime.test \
looping_threads.test \
opipe.test \
Index: strace-4.24/tests-mx32/Makefile.am
===================================================================
--- strace-4.24.orig/tests-mx32/Makefile.am 2019-12-02 18:36:41.156516491 +0100
+++ strace-4.24/tests-mx32/Makefile.am 2019-12-02 20:32:33.983479462 +0100
@@ -323,7 +323,6 @@
get_regs.test \
inject-nf.test \
interactive_block.test \
- ksysent.test \
localtime.test \
opipe.test \
options-syntax.test \
Index: strace-4.24/tests-mx32/Makefile.in
===================================================================
--- strace-4.24.orig/tests-mx32/Makefile.in 2019-12-02 18:36:41.080516237 +0100
+++ strace-4.24/tests-mx32/Makefile.in 2019-12-02 20:32:29.375497590 +0100
@@ -4246,7 +4246,6 @@
inject-nf.test \
interactive_block.test \
kill_child.test \
- ksysent.test \
localtime.test \
looping_threads.test \
opipe.test \
Index: strace-4.24/tests/Makefile.am
===================================================================
--- strace-4.24.orig/tests/Makefile.am 2019-12-02 18:36:41.156516491 +0100
+++ strace-4.24/tests/Makefile.am 2019-12-02 20:31:29.951731358 +0100
@@ -308,7 +308,6 @@
inject-nf.test \
interactive_block.test \
kill_child.test \
- ksysent.test \
localtime.test \
looping_threads.test \
opipe.test \
Index: strace-4.24/tests/Makefile.in
===================================================================
--- strace-4.24.orig/tests/Makefile.in 2019-12-02 18:36:41.160516504 +0100
+++ strace-4.24/tests/Makefile.in 2019-12-02 20:31:49.786653329 +0100
@@ -4259,7 +4259,6 @@
inject-nf.test \
interactive_block.test \
kill_child.test \
- ksysent.test \
localtime.test \
looping_threads.test \
opipe.test \

918
SPECS/strace.spec Normal file
View File

@ -0,0 +1,918 @@
Summary: Tracks and displays system calls associated with a running process
Name: strace
Version: 4.24
Release: 9%{?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}/%{name}-%{version}.tar.xz
BuildRequires: libacl-devel time gcc gzip
BuildRequires: pkgconfig(bluez)
BuildRequires: elfutils-devel binutils-devel
## General bug fixes
# v4.25~91 "evdev: fix decoding of bit sets"
Patch1: 0001-evdev-fix-decoding-of-bit-sets.patch
# v4.25~90 "evdev: fix decoding of EVIOCGBIT(0, ...)"
Patch2: 0002-evdev-fix-decoding-of-EVIOCGBIT-0.patch
# v4.25~83 "xlat: fix typo in smc_protocols.in"
Patch3: 0003-xlat-fix-typo-in-smc_protocols.in.patch
## Pre-requisite for the queueing patch
# v4.25~82 "strace.c: introduce struct tcb_wait_data"
Patch4: 0004-strace.c-introduce-struct-tcb_wait_data.patch
## Documentation
# v4.26~83 "Document -X option in strace -h output"
Patch5: 0005-Document-X-option-in-strace-h-output.patch
## Addresses https://bugzilla.redhat.com/1660759 ("strace prints "xlat_idx:
## Unexpected xlat value 0 at index 4" messages")
# v4.26~36 "evdev: fix off-by-one error in decode_bitset"
Patch6: 0006-evdev-fix-off-by-one-error-in-decode_bitset.patch
# v4.26~35 "nlattr: fix off-by-one error in indexed xlat lookup"
Patch7: 0007-nlattr-fix-off-by-one-error-in-indexed-xlat-lookup.patch
# v4.26~34 "aio: fix off-by-one error in indexed xlat lookup"
Patch8: 0008-aio-fix-off-by-one-error-in-indexed-xlat-lookup.patch
# v4.26~31 "rtnl_link: fix off-by-one errors in indexed and sorted xlat lookups"
Patch9: 0009-rtnl_link-fix-off-by-one-errors-in-indexed-and-sorte.patch
# v4.26~30 "rtnl_link: fix off-by-one errors in indexed and sorted xlat lookups"
Patch10: 0010-xlat_idx-do-not-issue-warnings-for-holes-in-indices.patch
## man page updates
# v4.26~27 "strace.1.in: print names of entities in bold, provide man page sections"
Patch11: 0011-strace.1.in-print-names-of-entities-in-bold-provide-.patch
# v4.26~26 "strace.1.in: consistently use CTRL-combinations"
Patch12: 0012-strace.1.in-consistently-use-CTRL-combinations.patch
## License change
# v4.26~53 "tests: change the license to GPL-2.0-or-later"
Patch13: 0013-tests-change-the-license-to-GPL-2.0-or-later.patch
# v4.26~52 "Change the license of strace to LGPL-2.1-or-later"
Patch14: 0014-Change-the-license-of-strace-to-LGPL-2.1-or-later.patch
## Tests fixes, can be hit on newer kernels
# v5.0~95 "tests: use tail_alloc instead of calloc in bpf-obj_get_info_by_fd-prog*"
Patch15: 0015-tests-use-tail_alloc-instead-of-calloc-in-bpf-obj_ge.patch
# v5.0~94 "tests: fix prog_info initialization in bpf-obj_get_info_by_fd-prog*"
Patch16: 0016-tests-fix-prog_info-initialization-in-bpf-obj_get_in.patch
## General bug fixes
# v5.0~71 "Merge "<... resumed>" printing"
Patch17: 0017-Merge-.-resumed-printing.patch
# v5.0~69 "Use accessors for tcp->s_ent, return a stub struct if it is NULL"
Patch18: 0018-Use-accessors-for-tcp-s_ent-return-a-stub-struct-if-.patch
# v5.0~66 "syscall.c: set MEMORY_MAPPING_CHANGE in stub sysent"
Patch19: 0019-syscall.c-set-MEMORY_MAPPING_CHANGE-in-stub-sysent.patch
## Addresses https://bugzilla.redhat.com/1662936 ("strace reports
## 'ptrace(SYSCALL): No such process' on multi-threaded testcase on RHEL-8")
# v5.0~67 "Make inline message on failed restart attempt more verbose"
Patch20: 0020-Make-inline-message-on-failed-restart-attempt-more-v.patch
# v5.0~64 "ptrace_restart: do not print diagnostics when ptrace returns ESRCH"
Patch21: 0021-ptrace_restart-do-not-print-diagnostics-when-ptrace-.patch
## Pre-requisites for the queueing patch
# v5.0~60 "tests: add kill_child test"
Patch22: 0022-tests-add-kill_child-test.patch
# v5.0~30 "tests: move PTRACE_SEIZE check to a separate file"
Patch23: 0023-tests-move-PTRACE_SEIZE-check-to-a-separate-file.patch
# v5.0~29 "tests: check tracing of orphaned process group"
Patch24: 0024-tests-check-tracing-of-orphaned-process-group.patch
# v5.0~27 "tests: check tracing of looping threads"
Patch25: 0025-tests-check-tracing-of-looping-threads.patch
## Implementation of tcp queueing
## Addresses https://bugzilla.redhat.com/1609318 ("Some threads are not created
## when strace with -f option is executed") and all previous its incarnations
## (478419, 526740, 851457, 1610774).
# v5.0~26 "Add a generic list implementation"
Patch26: 0026-Add-a-generic-list-implementation.patch
# v5.0~25 "Implement queueing of threads before dispatching them"
Patch27: 0027-Implement-queueing-of-threads-before-dispatching-the.patch
## Pre-requisites for "evdev: fix array size calculation in decode_bitset_"
# v4.25~30 "macros: add ROUNDUP macro"
Patch28: 0028-macros-add-ROUNDUP-macro.patch
# v5.0~45 "util: update dumpstr" (only macros.h change)
Patch29: 0029-util-update-dumpstr.patch
## Reported by covscan
# v5.2-3-g7ada13f "evdev: avoid bit vector decoding on non-successful and 0 return codes"
Patch30: 0030-evdev-avoid-bit-vector-decoding-on-non-successful-an.patch
# v5.2-4-g96194ed "evdev: fix array size calculation in decode_bitset_"
Patch31: 0031-evdev-fix-array-size-calculation-in-decode_bitset_.patch
## Pre-requisite for "tests: test evdev bitset decoding more thoroughly"
# v4.25~89 "tests: check decoding of successful evdev ioctl"
Patch32: 0032-tests-check-decoding-of-successful-evdev-ioctl.patch
## Test for patches "evdev: avoid bit vector decoding on non-successful and 0
## return codes" and "evdev: fix array size calculation in decode_bitset_"
# v5.2-5-gcdd8206 "tests: test evdev bitset decoding more thoroughly"
Patch33: 0033-tests-test-evdev-bitset-decoding-more-thoroughly.patch
## https://bugzilla.redhat.com/1747475 https://bugzilla.redhat.com/1747514
# v4.26~65 "s390x: beautify sthyi data tail prints"
Patch34: 0034-s390x-beautify-sthyi-data-tail-prints.patch
## Reported by covscan (https://bugzilla.redhat.com/1747524
## https://bugzilla.redhat.com/1747526 https://bugzilla.redhat.com/1747530)
# v5.2-84-g91281fec "v4l2: avoid shifting left a signed number by 31 bit"
Patch35: 0035-v4l2-avoid-shifting-left-a-signed-number-by-31-bit.patch
# v5.2~21 "syscall.c: avoid infinite loop in subcalls parsing"
Patch36: 0036-syscall.c-avoid-infinite-loop-in-subcalls-parsing.patch
# v5.2~19 "kvm: avoid bogus vcpu_info assignment in vcpu_register"
Patch37: 0037-kvm-avoid-bogus-vcpu_info-assignment-in-vcpu_registe.patch
# v5.4~97 "xlat: use unsgined type for mount_flags fallback values"
Patch38: 0038-xlat-use-unsgined-type-for-mount_flags-fallback-valu.patch
## Missing stack traces on attach (https://bugzilla.redhat.com/1788636)
## RHEL 7: https://bugzilla.redhat.com/1790052
## RHEL 8: https://bugzilla.redhat.com/1790053
## RHEL 6 DTS: https://bugzilla.redhat.com/1790058
## RHEL 7 DTS: https://bugzilla.redhat.com/1790057
## RHEL 8 DTS: https://bugzilla.redhat.com/1790054
# v5.4-18-g69b2c33 "unwind-libdw: fix initialization of libdwfl cache"
Patch39: 0039-unwind-libdw-fix-initialization-of-libdwfl-cache.patch
## v5.4-27-g35e080a "syscall: do not capture stack trace while the tracee executes strace code"
#Patch40: 0040-syscall-do-not-capture-stack-trace-while-the-tracee-.patch
# v5.4-63-g8e515c7 "tests: add strace-k-p test"
Patch41: 0041-tests-add-strace-k-p-test.patch
## https://bugzilla.redhat.com/1746885
# v5.2-92-gc108f0b "sockaddr: properly decode sockaddr_hci addresses without hci_channel"
Patch42: 0042-sockaddr-properly-decode-sockaddr_hci-addresses-with.patch
## Some ipc tests from strace internal testsuite occasionally fail
## https://bugzilla.redhat.com/1795251 https://bugzilla.redhat.com/1795261
## https://bugzilla.redhat.com/1794490 https://bugzilla.redhat.com/1795273
# v5.3~102 "tests: fix expected output for some ipc tests"
Patch43: 0043-tests-fix-expected-output-for-some-ipc-tests.patch
# v5.4~49 "tests: fix -a argument in ipc_msgbuf-Xraw test"
Patch44: 0044-tests-fix-a-argument-in-ipc_msgbuf-Xraw-test.patch
## Update bpf decoder, as bpf-obj_get_info_by_fd-prog-v.gen.test has started
## to fail after BPF rebase in RHEL 8.2 kernel.
# v5.0~98 "Fix preprocessor indentation", only the bpf_attr.h chunks
Patch45: 0045-Fix-preprocessor-indentation.patch
# v5.0~24 "bpf: exclude bit fields from the check"
Patch46: 0046-bpf-exclude-bit-fields-from-the-check.patch
# v5.0~23 "bpf: print struct bpf_prog_info.gpl_compatible"
Patch47: 0047-bpf-print-struct-bpf_prog_info.gpl_compatible.patch
# v5.0~22 "bpf: add support for btf_* fields in BPF_MAP_CREATE"
Patch48: 0048-bpf-add-support-for-btf_-fields-in-BPF_MAP_CREATE.patch
# v5.0~21 "bpf: add support for btf_* fields in struct bpf_map_info"
Patch49: 0049-bpf-add-support-for-btf_-fields-in-struct-bpf_map_in.patch
# v5.0~20 "bpf: add support for *jited_ksyms and *jited_func_lens fields in struct bpf_prog_info"
Patch50: 0050-bpf-add-support-for-jited_ksyms-and-jited_func_lens-.patch
# v5.0~19 "bpf: add support for new twelve fields in struct bpf_prog_info"
Patch51: 0051-bpf-add-support-for-new-twelve-fields-in-struct-bpf_.patch
# v5.1~6 "tests: robustify bpf-obj_get_info_by_fd test against future kernels"
Patch52: 0052-tests-robustify-bpf-obj_get_info_by_fd-test-against-.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"
Patch100: 0100-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"
Patch101: 0101-Wire-up-kexec_file_load-syscall-on-architectures-tha.patch
### RHEL7-only: headers on some builders do not provide O_TMPFILE
#Patch200: 0200-strace-provide-O_TMPFILE-fallback-definition.patch
## RHEL-only: aarch64 brew builders are extremely slow on qual_fault.test
Patch201: 0201-limit-qual_fault-scope-on-aarch64.patch
## RHEL8.2-only: disable ksysent test due to missing rebase
Patch202: 0202-disable-ksysent-on-8.2.patch
# We no longer need to build a separate strace32 binary, but we don't want
# to break existing strace32 users' workflows.
%define strace32_arches ppc64 s390x
%ifarch %{strace32_arches}
%define _isa_compat %{?__isa_name:(%{__isa_name}-32)}%{!?__isa:%{nil}}
%define evr %{?epoch:%{epoch}:}%{version}-%{release}
Provides: strace32 = %{evr}
Obsoletes: strace32 < %{version} strace32%{_isa_compat} < %{version}
%endif
%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
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
%patch5 -p1
%patch6 -p1
%patch7 -p1
%patch8 -p1
%patch9 -p1
%patch10 -p1
%patch11 -p1
%patch12 -p1
%patch13 -p1
%patch14 -p1
%patch15 -p1
%patch16 -p1
%patch17 -p1
%patch18 -p1
%patch19 -p1
%patch20 -p1
%patch21 -p1
%patch22 -p1
%patch23 -p1
%patch24 -p1
%patch25 -p1
%patch26 -p1
%patch27 -p1
%patch28 -p1
%patch29 -p1
%patch30 -p1
%patch31 -p1
%patch32 -p1
%patch33 -p1
%patch34 -p1
%patch35 -p1
%patch36 -p1
%patch37 -p1
%patch38 -p1
%patch39 -p1
#%patch40 -p1
%patch41 -p1
%patch42 -p1
%patch43 -p1
%patch44 -p1
%patch45 -p1
%patch46 -p1
%patch47 -p1
%patch48 -p1
%patch49 -p1
%patch50 -p1
%patch51 -p1
%patch52 -p1
%patch100 -p1
%patch101 -p1
#%patch200 -p1
%patch201 -p1
%patch202 -p1
echo -n %version-%release > .tarball-version
echo -n 2019 > .year
echo -n 2019-12-02 > .strace.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.h>' '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'
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=" -I%{_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
# Commit v4.26-50-gb1a2db9 is needed for enforcing libiberty usage with
# --with-libiberty
%configure --enable-mpers=check --with-libdw
make %{?_smp_mflags}
%install
make DESTDIR=%{buildroot} install
%ifarch %{strace32_arches}
ln -s ./strace %{buildroot}%{_bindir}/strace32
%endif
# remove unpackaged files from the buildroot
rm -f %{buildroot}%{_bindir}/strace-graph
# 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
# (0022-tests-add-kill_child-test.patch,
# 0024-tests-check-tracing-of-orphaned-process-group.patch,
# 0025-tests-check-tracing-of-looping-threads.patch,
# 0032-tests-check-decoding-of-successful-evdev-ioctl.patch)
chmod u+x tests/*.test tests-m32/*.test tests-mx32/*.test
%{buildroot}%{_bindir}/strace -V
# 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 -j2 -k check VERBOSE=1 V=1 TIMEOUT_DURATION=5400
echo 'BEGIN OF TEST SUITE INFORMATION'
tail -n 99999 -- tests*/test-suite.log
tail -n 99999 -- tests*/ksysent.log ||:
find tests* -type f -name '*.log' -print0 |
xargs -r0 grep -H '^KERNEL BUG:' -- ||:
echo 'END OF TEST SUITE INFORMATION'
%files
%defattr(-,root,root)
%doc CREDITS ChangeLog.gz ChangeLog-CVS.gz COPYING LGPL-2.1-or-later NEWS README
%{_bindir}/strace
%ifarch %{strace32_arches}
%{_bindir}/strace32
%endif
%{_bindir}/strace-log-merge
%{_mandir}/man1/*
%changelog
* Thu Jan 30 2020 Eugene Syromiatnikov <esyr@redhat.com> - 4.24-9
- Fix the "extra tokens at end of #ifdef directive" warning:
579f2702 "bpf: exclude bit fields from the check".
* Mon Jan 27 2020 Eugene Syromiatnikov <esyr@redhat.com> - 4.24-8
- Fix expected alignment for IPC tests (#1795251):
4377e3a1 "tests: fix expected output for some ipc tests", and
a75c7c4b "tests: fix -a argument in ipc_msgbuf-Xraw test".
- Update tests-m32/looping_threads.test and tests-mx32/looping_threads.test
in 0025-tests-check-tracing-of-looping-threads.patch.
- Update the bpf syscall decoder:
d6c71dd0 "Fix preprocessor indentation",
cabd6955 "bpf: print struct bpf_prog_info.gpl_compatible",
14a9b6ca "bpf: add support for btf_* fields in BPF_MAP_CREATE",
27bd13d3 "bpf: add support for btf_* fields in struct bpf_map_info",
d1f90bcd "bpf: add support for *jited_ksyms and *jited_func_lens fields
in struct bpf_prog_info", and
940fe50f "bpf: add support for new twelve fields in struct bpf_prog_info".
c661605b "tests: robustify bpf-obj_get_info_by_fd test against future kernels"
* Thu Jan 23 2020 Eugene Syromiatnikov <esyr@redhat.com> - 4.24-7
- Fix printing stack traces for early syscalls on process attach (#1790053):
69b2c33a "unwind-libdw: fix initialization of libdwfl cache" and
8e515c74 "tests: add strace-k-p test".
- Properly decode struct sockaddr_hci without hci_channel field.
- Update tests-m32/ioctl_evdev.c and tests-mx32/ioctl_evdev.c
in 0002-evdev-fix-decoding-of-EVIOCGBIT-0.patch.
- Update tests-m32/Makefile.in and tests-mx32/Makefile.in
in 0032-tests-check-decoding-of-successful-evdev-ioctl.patch.
* Mon Dec 02 2019 Eugene Syromiatnikov <esyr@redhat.com> - 4.24-6
- Pull upstream fix for ioctl evdev bitset decoding, fix the tests (#1747214).
- Include commit v4.26~65 "s390x: beautify sthyi data tail prints" (#1747514).
- Include upstream patches that fix issues reported by covscan (#1747526):
91281fec "v4l2: avoid shifting left a signed number by 31 bit",
522ad3a0 "syscall.c: avoid infinite loop in subcalls parsing",
9446038e "kvm: avoid bogus vcpu_info assignment in vcpu_register", and
2b64854e "xlat: use unsgined type for mount_flags fallback values".
* Fri Jun 14 2019 Eugene Syromiatnikov <esyr@redhat.com> - 4.24-5
- Use SPDX abbreviations for licenses.
* Wed Jun 12 2019 Eugene Syromiatnikov <esyr@redhat.com> - 4.24-4
- Sync up thread handling unfairness fix with the upstream version.
- Fix "xlat_idx: Unexpected xlat value 0 at index ..." messages (#1660759).
- Remove "ptrace(SYSCALL): No such process" messages (#1662936).
- Wire up rseq and kexec_file_load on aarch64 (#1676045).
* Mon Dec 17 2018 Eugene Syromiatnikov <esyr@redhat.com> - 4.24-3
- Add current version of the thread handling unfairness fix.
* Mon Sep 03 2018 Eugene Syromiatnikov <esyr@redhat.com> - 4.24-2
- Add transition for strace32 package pn those architectures that
provided it in RHEL 7 (ppc64 and s390x).
* Tue Aug 14 2018 Eugene Syromiatnikov <esyr@redhat.com> - 4.24-1
- Rebase to v4.24.
* Sun Aug 05 2018 Eugene Syromiatnikov <esyr@redhat.com> - 4.23-4
- Fix tests build with fresh glibc that now provides struct statx in sys/stat.h.
- Resolves #1611749.
* Thu Jul 19 2018 Eugene Syromiatnikov <esyr@redhat.com> - 4.23-3
- Wire up io_pgetevents and rseq on hppa, microblaze, mips, powerpc, and s390.
* Sat Jun 16 2018 Eugene Syromiatnikov <esyr@redhat.com> - 4.23-2
- Increase test timeout duration.
* Thu Jun 14 2018 Dmitry V. Levin <ldv@altlinux.org> - 4.23-1
- v4.22 -> v4.23.
- Enabled libdw backend for -k option (#1568647).
* Thu Apr 05 2018 Dmitry V. Levin <ldv@altlinux.org> - 4.22-1
- v4.21 -> v4.22.
* Tue Feb 13 2018 Dmitry V. Levin <ldv@altlinux.org> - 4.21-1
- v4.20 -> v4.21.
* Mon Nov 13 2017 Dmitry V. Levin <ldv@altlinux.org> - 4.20-1
- v4.19 -> v4.20.
* Tue Sep 05 2017 Dmitry V. Levin <ldv@altlinux.org> - 4.19-1
- v4.18 -> v4.19.
* Wed Jul 05 2017 Dmitry V. Levin <ldv@altlinux.org> - 4.18-1
- v4.17 -> v4.18.
* Wed May 24 2017 Dmitry V. Levin <ldv@altlinux.org> - 4.17-1
- v4.16 -> v4.17.
* Tue Feb 14 2017 Dmitry V. Levin <ldv@altlinux.org> - 4.16-1
- v4.15 -> v4.16.
* Wed Dec 14 2016 Dmitry V. Levin <ldv@altlinux.org> - 4.15-1
- v4.14-100-g622af42 -> v4.15.
* Wed Nov 16 2016 Dmitry V. Levin <ldv@altlinux.org> - 4.14.0.100.622a-1
- v4.14 -> v4.14-100-g622af42:
+ implemented syscall fault injection.
* Tue Oct 04 2016 Dmitry V. Levin <ldv@altlinux.org> - 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 <ldv@altlinux.org> - 4.13-1
- v4.12 -> v4.13.
* Tue May 31 2016 Dmitry V. Levin <ldv@altlinux.org> - 4.12-1
- v4.11-163-g972018f -> v4.12.
* Fri Feb 05 2016 Fedora Release Engineering <releng@fedoraproject.org> - 4.11.0.163.9720-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
* Fri Jan 15 2016 Dmitry V. Levin <ldv@altlinux.org> - 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 <ldv@altlinux.org> - 4.11-2
- Enabled experimental -k option on x86_64 (#1170296).
* Mon Dec 21 2015 Dmitry V. Levin <ldv@altlinux.org> - 4.11-1
- New upstream release:
+ print nanoseconds along with seconds in stat family syscalls (#1251176).
* Fri Jun 19 2015 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 4.10-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
* Mon May 11 2015 Marcin Juszkiewicz <mjuszkiewicz@redhat.com> - 4.10-2
- Backport set of upstream patches to get it buildable on AArch64
* Fri Mar 06 2015 Dmitry V. Levin <ldv@altlinux.org> - 4.10-1
- New upstream release:
+ enhanced ioctl decoding (#902788).
* Mon Nov 03 2014 Lubomir Rintel <lkundrak@v3.sk> - 4.9-3
- Regenerate ioctl entries with proper kernel headers
* Mon Aug 18 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 4.9-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
* Fri Aug 15 2014 Dmitry V. Levin <ldv@altlinux.org> - 4.9-1
- New upstream release:
+ fixed build when <sys/ptrace.h> and <linux/ptrace.h> 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 <dan[at]danny.cz> - 4.8-5
- update for ppc64
* Sun Jun 08 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 4.8-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
* Fri Dec 6 2013 Peter Robinson <pbrobinson@fedoraproject.org> 4.8-3
- Fix FTBFS
* Sun Aug 04 2013 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 4.8-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild
* Mon Jun 03 2013 Dmitry V. Levin <ldv@altlinux.org> - 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 <rel-eng@lists.fedoraproject.org> - 4.7-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild
* Sat Jul 21 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 4.7-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
* Wed May 02 2012 Dmitry V. Levin <ldv@altlinux.org> 4.7-1
- New upstream release.
+ implemented proper handling of real SIGTRAPs (#162774).
* Sat Jan 14 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 4.6-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild
* Mon Mar 14 2011 Dmitry V. Levin <ldv@altlinux.org> - 4.6-1
- New upstream release.
+ fixed a corner case in waitpid handling (#663547).
* Wed Feb 09 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 4.5.20-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
* Tue Apr 13 2010 Roland McGrath <roland@redhat.com> - 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 <roland@redhat.com> - 4.5.19-1
- New upstream release, work mostly by Dmitry V. Levin <ldv@altlinux.org>
+ 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 <roland@redhat.com> - 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 <roland@redhat.com> - 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 <roland@redhat.com> - 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 <roland@redhat.com> - 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 <jakub@redhat.com> - 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 <roland@redhat.com> - 4.5.14-3
- Fix bogus decoding of syscalls >= 300 (#201462, #202620).
* Fri Jul 14 2006 Jesse Keating <jkeating@redhat.com> - 4.5.14-2
- rebuild
* Fri Feb 10 2006 Jesse Keating <jkeating@redhat.com> - 4.5.14-1.2
- bump again for long double bug on ppc{,64}
* Tue Feb 07 2006 Jesse Keating <jkeating@redhat.com> - 4.5.14-1.1
- rebuilt for new gcc4.1 snapshot and glibc changes
* Mon Jan 16 2006 Roland McGrath <roland@redhat.com> - 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 <roland@redhat.com> - 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 <roland@redhat.com> - 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 <roland@redhat.com> - 4.5.11-1
- Build tweaks.
- Note 4.5.10 select fix (#151570).
* Mon Mar 14 2005 Roland McGrath <roland@redhat.com> - 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 <roland@redhat.com> - 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 <roland@redhat.com> - 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 <roland@redhat.com> - 4.5.7-2
- new upstream version, misc fixes and updates (#128091, #129166, #128391, #129378, #130965, #131177)
* Mon Jul 12 2004 Roland McGrath <roland@redhat.com> 4.5.6-1
- new upstream version, updates ioctl lists (#127398), fixes quotactl (#127393), more ioctl decoding (#126917)
* Sun Jun 27 2004 Roland McGrath <roland@redhat.com> 4.5.5-1
- new upstream version, fixes x86-64 biarch support (#126547)
* Tue Jun 15 2004 Elliot Lee <sopwith@redhat.com> 4.5.4-2
- rebuilt
* Thu Jun 3 2004 Roland McGrath <roland@redhat.com> 4.5.4-0.FC1
- rebuilt for FC1 update
* Thu Jun 3 2004 Roland McGrath <roland@redhat.com> 4.5.4-1
- new upstream version, more ioctls (#122257), minor fixes
* Fri Apr 16 2004 Roland McGrath <roland@redhat.com> 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 <sopwith@redhat.com> 4.5.2-1.1
- rebuilt
* Mon Mar 1 2004 Roland McGrath <roland@redhat.com> 4.5.2-1
- new upstream version, sched_* calls (#116990), show core flag (#112117)
* Fri Feb 13 2004 Elliot Lee <sopwith@redhat.com>
- rebuilt
* Thu Nov 13 2003 Roland McGrath <roland@redhat.com> 4.5.1-1
- new upstream version, more fixes (#108012, #105366, #105359, #105358)
* Tue Sep 30 2003 Roland McGrath <roland@redhat.com> 4.5-3
- revert bogus s390 fix
* Thu Sep 25 2003 Roland McGrath <roland@redhat.com> 4.5-1.2.1AS
- rebuilt for 2.1AS erratum
* Wed Sep 24 2003 Roland McGrath <roland@redhat.com> 4.5-2
- rebuilt
* Wed Sep 24 2003 Roland McGrath <roland@redhat.com> 4.5-1
- new upstream version, more fixes (#101499, #104365)
* Thu Jul 17 2003 Roland McGrath <roland@redhat.com> 4.4.99-2
- rebuilt
* Thu Jul 17 2003 Roland McGrath <roland@redhat.com> 4.4.99-1
- new upstream version, groks more new system calls, PF_INET6 sockets
* Tue Jun 10 2003 Roland McGrath <roland@redhat.com> 4.4.98-1
- new upstream version, more fixes (#90754, #91085)
* Wed Jun 04 2003 Elliot Lee <sopwith@redhat.com>
- rebuilt
* Sun Mar 30 2003 Roland McGrath <roland@redhat.com> 4.4.96-1
- new upstream version, handles yet more 2.5 syscalls, x86_64 & ia64 fixes
* Mon Feb 24 2003 Elliot Lee <sopwith@redhat.com> 4.4.95-2
- rebuilt
* Mon Feb 24 2003 Roland McGrath <roland@redhat.com> 4.4.95-1
- new upstream version, fixed getresuid/getresgid (#84959)
* Wed Feb 19 2003 Roland McGrath <roland@redhat.com> 4.4.94-1
- new upstream version, new option -E to set environment variables (#82392)
* Wed Jan 22 2003 Tim Powers <timp@redhat.com> 4.4.93-2
- rebuilt
* Tue Jan 21 2003 Roland McGrath <roland@redhat.com> 4.4.93-1
- new upstream version, fixes ppc and s390 bugs, adds missing ptrace requests
* Fri Jan 10 2003 Roland McGrath <roland@redhat.com> 4.4.91-1
- new upstream version, fixes -f on x86-64
* Fri Jan 10 2003 Roland McGrath <roland@redhat.com> 4.4.90-1
- new upstream version, fixes all known bugs modulo ia64 and s390 issues
* Fri Jan 03 2003 Florian La Roche <Florian.LaRoche@redhat.de> 4.4-11
- add further s390 patch from IBM
* Wed Nov 27 2002 Tim Powers <timp@redhat.com> 4.4-10
- remove unpackaged files from the buildroot
* Mon Oct 07 2002 Phil Knirsch <pknirsch@redhat.com> 4.4-9.1
- Added latest s390(x) patch.
* Fri Sep 06 2002 Karsten Hopp <karsten@redhat.de> 4.4-9
- preliminary x86_64 support with an ugly patch to help
debugging. Needs cleanup!
* Mon Sep 2 2002 Jakub Jelinek <jakub@redhat.com> 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 <jakub@redhat.com> 4.4-7
- fix strace -f (Roland McGrath, #68994)
- handle ?et_thread_area, SA_RESTORER (Ulrich Drepper)
* Fri Jun 21 2002 Jakub Jelinek <jakub@redhat.com> 4.4-6
- handle futexes, *xattr, sendfile64, etc. (Ulrich Drepper)
- handle modify_ldt (#66894)
* Thu May 23 2002 Tim Powers <timp@redhat.com>
- automated rebuild
* Tue Apr 16 2002 Jakub Jelinek <jakub@redhat.com> 4.4-4
- fix for the last patch by Jeff Law (#62591)
* Mon Mar 4 2002 Preston Brown <pbrown@redhat.com> 4.4-3
- integrate patch from Jeff Law to eliminate hang tracing threads
* Sat Feb 23 2002 Florian La Roche <Florian.LaRoche@redhat.de>
- minor update from debian tar-ball
* Wed Jan 02 2002 Florian La Roche <Florian.LaRoche@redhat.de>
- update to 4.4
* Sun Jul 22 2001 Florian La Roche <Florian.LaRoche@redhat.de>
- disable s390 patches, they are already included
* Wed Jul 18 2001 Preston Brown <pbrown@redhat.com> 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 <than@redhat.com>
- port s390 patches from IBM
* Wed May 16 2001 Nalin Dahyabhai <nalin@redhat.com>
- modify new syscall patch to allocate enough heap space in setgroups32()
* Wed Feb 14 2001 Jakub Jelinek <jakub@redhat.com>
- #include <time.h> in addition to <sys/time.h>
* Fri Jan 26 2001 Karsten Hopp <karsten@redhat.com>
- clean up conflicting patches. This happened only
when building on S390
* Fri Jan 19 2001 Bill Nottingham <notting@redhat.com>
- update to CVS, reintegrate ia64 support
* Fri Dec 8 2000 Bernhard Rosenkraenzer <bero@redhat.com>
- Get S/390 support into the normal package
* Sat Nov 18 2000 Florian La Roche <Florian.LaRoche@redhat.de>
- added S/390 patch from IBM, adapting it to not conflict with
IA64 patch
* Sat Aug 19 2000 Jakub Jelinek <jakub@redhat.com>
- 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 <jakub@redhat.com>
- add a bunch of new 2.4 syscalls (#14036)
* Wed Jul 12 2000 Prospector <bugzilla@redhat.com>
- automatic rebuild
- excludearch ia64
* Fri Jun 2 2000 Matt Wilson <msw@redhat.com>
- use buildinstall for FHS
* Wed May 24 2000 Jakub Jelinek <jakub@redhat.com>
- make things compile on sparc
- fix sigreturn on sparc
* Fri Mar 31 2000 Bill Nottingham <notting@redhat.com>
- fix stat64 misdef (#10485)
* Tue Mar 21 2000 Michael K. Johnson <johnsonm@redhat.com>
- added ia64 patch
* Thu Feb 03 2000 Cristian Gafton <gafton@redhat.com>
- man pages are compressed
- version 4.2 (why are we keeping all these patches around?)
* Sat Nov 27 1999 Jeff Johnson <jbj@redhat.com>
- update to 4.1 (with sparc socketcall patch).
* Fri Nov 12 1999 Jakub Jelinek <jakub@redhat.com>
- fix socketcall on sparc.
* Thu Sep 02 1999 Cristian Gafton <gafton@redhat.com>
- fix KERN_SECURELVL compile problem
* Tue Aug 31 1999 Cristian Gafton <gafton@redhat.com>
- added alpha patch from HJLu to fix the osf_sigprocmask interpretation
* Sat Jun 12 1999 Jeff Johnson <jbj@redhat.com>
- update to 3.99.1.
* Wed Jun 2 1999 Jeff Johnson <jbj@redhat.com>
- add (the other :-) jj's sparc patch.
* Wed May 26 1999 Jeff Johnson <jbj@redhat.com>
- 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 <jbj@redhat.com>
- don't rely on (broken!) rpm %%patch (#2735)
* Tue Apr 06 1999 Preston Brown <pbrown@redhat.com>
- strip binary
* Sun Mar 21 1999 Cristian Gafton <gafton@redhat.com>
- auto rebuild in the new build environment (release 16)
* Tue Feb 9 1999 Jeff Johnson <jbj@redhat.com>
- vfork est arrive!
* Tue Feb 9 1999 Christopher Blizzard <blizzard@redhat.com>
- Add patch to follow clone() syscalls, too.
* Sun Jan 17 1999 Jeff Johnson <jbj@redhat.com>
- patch to build alpha/sparc with glibc 2.1.
* Thu Dec 03 1998 Cristian Gafton <gafton@redhat.com>
- patch to build on ARM
* Wed Sep 30 1998 Jeff Johnson <jbj@redhat.com>
- fix typo (printf, not tprintf).
* Sat Sep 19 1998 Jeff Johnson <jbj@redhat.com>
- fix compile problem on sparc.
* Tue Aug 18 1998 Cristian Gafton <gafton@redhat.com>
- buildroot
* Mon Jul 20 1998 Cristian Gafton <gafton@redhat.com>
- added the umoven patch from James Youngman <jay@gnu.org>
- fixed build problems on newer glibc releases
* Mon Jun 08 1998 Prospector System <bugs@redhat.com>
- translations modified for de, fr, tr