import strace-4.24-9.el8
This commit is contained in:
commit
f19f425938
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
SOURCES/strace-4.24.tar.xz
|
1
.strace.metadata
Normal file
1
.strace.metadata
Normal file
@ -0,0 +1 @@
|
||||
09a8c9638fd02622157af9d744ad7c7f991c75df SOURCES/strace-4.24.tar.xz
|
37
SOURCES/0001-evdev-fix-decoding-of-bit-sets.patch
Normal file
37
SOURCES/0001-evdev-fix-decoding-of-bit-sets.patch
Normal 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
|
||||
|
173
SOURCES/0002-evdev-fix-decoding-of-EVIOCGBIT-0.patch
Normal file
173
SOURCES/0002-evdev-fix-decoding-of-EVIOCGBIT-0.patch
Normal 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));
|
52
SOURCES/0003-xlat-fix-typo-in-smc_protocols.in.patch
Normal file
52
SOURCES/0003-xlat-fix-typo-in-smc_protocols.in.patch
Normal 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
|
||||
};
|
291
SOURCES/0004-strace.c-introduce-struct-tcb_wait_data.patch
Normal file
291
SOURCES/0004-strace.c-introduce-struct-tcb_wait_data.patch
Normal 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
|
||||
|
28
SOURCES/0005-Document-X-option-in-strace-h-output.patch
Normal file
28
SOURCES/0005-Document-X-option-in-strace-h-output.patch
Normal 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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
@ -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
|
16068
SOURCES/0013-tests-change-the-license-to-GPL-2.0-or-later.patch
Normal file
16068
SOURCES/0013-tests-change-the-license-to-GPL-2.0-or-later.patch
Normal file
File diff suppressed because it is too large
Load Diff
11500
SOURCES/0014-Change-the-license-of-strace-to-LGPL-2.1-or-later.patch
Normal file
11500
SOURCES/0014-Change-the-license-of-strace-to-LGPL-2.1-or-later.patch
Normal file
File diff suppressed because it is too large
Load Diff
@ -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) {
|
@ -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 =
|
211
SOURCES/0017-Merge-.-resumed-printing.patch
Normal file
211
SOURCES/0017-Merge-.-resumed-printing.patch
Normal 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);
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
636
SOURCES/0022-tests-add-kill_child-test.patch
Normal file
636
SOURCES/0022-tests-add-kill_child-test.patch
Normal 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@
|
@ -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"
|
901
SOURCES/0024-tests-check-tracing-of-orphaned-process-group.patch
Normal file
901
SOURCES/0024-tests-check-tracing-of-orphaned-process-group.patch
Normal 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
|
874
SOURCES/0025-tests-check-tracing-of-looping-threads.patch
Normal file
874
SOURCES/0025-tests-check-tracing-of-looping-threads.patch
Normal 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))"
|
368
SOURCES/0026-Add-a-generic-list-implementation.patch
Normal file
368
SOURCES/0026-Add-a-generic-list-implementation.patch
Normal 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
|
||||
|
@ -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
|
||||
|
25
SOURCES/0028-macros-add-ROUNDUP-macro.patch
Normal file
25
SOURCES/0028-macros-add-ROUNDUP-macro.patch
Normal 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_))
|
49
SOURCES/0029-util-update-dumpstr.patch
Normal file
49
SOURCES/0029-util-update-dumpstr.patch
Normal 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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
1243
SOURCES/0032-tests-check-decoding-of-successful-evdev-ioctl.patch
Normal file
1243
SOURCES/0032-tests-check-decoding-of-successful-evdev-ioctl.patch
Normal file
File diff suppressed because it is too large
Load Diff
@ -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 }
|
37
SOURCES/0034-s390x-beautify-sthyi-data-tail-prints.patch
Normal file
37
SOURCES/0034-s390x-beautify-sthyi-data-tail-prints.patch
Normal 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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
@ -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;
|
||||
}
|
||||
|
724
SOURCES/0041-tests-add-strace-k-p-test.patch
Normal file
724
SOURCES/0041-tests-add-strace-k-p-test.patch
Normal 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" |
|
@ -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
|
||||
|
@ -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
|
@ -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
|
288
SOURCES/0045-Fix-preprocessor-indentation.patch
Normal file
288
SOURCES/0045-Fix-preprocessor-indentation.patch
Normal 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
|
||||
|
28
SOURCES/0046-bpf-exclude-bit-fields-from-the-check.patch
Normal file
28
SOURCES/0046-bpf-exclude-bit-fields-from-the-check.patch
Normal 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
|
156
SOURCES/0047-bpf-print-struct-bpf_prog_info.gpl_compatible.patch
Normal file
156
SOURCES/0047-bpf-print-struct-bpf_prog_info.gpl_compatible.patch
Normal 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"
|
@ -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[] = {
|
@ -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);
|
@ -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);
|
@ -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);
|
@ -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,
|
@ -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" },
|
@ -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" },
|
42
SOURCES/0201-limit-qual_fault-scope-on-aarch64.patch
Normal file
42
SOURCES/0201-limit-qual_fault-scope-on-aarch64.patch
Normal 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 \
|
76
SOURCES/0202-disable-ksysent-on-8.2.patch
Normal file
76
SOURCES/0202-disable-ksysent-on-8.2.patch
Normal 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
918
SPECS/strace.spec
Normal 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
|
Loading…
Reference in New Issue
Block a user