Blame SOURCES/0022-tests-add-kill_child-test.patch

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