summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--regress/usr.bin/lastcomm/Makefile52
-rw-r--r--regress/usr.bin/lastcomm/callstack.c (renamed from regress/usr.bin/lastcomm/stackmap.c)15
-rw-r--r--regress/usr.bin/lastcomm/syscallwx.c50
-rw-r--r--regress/usr.bin/lastcomm/trapstack.c84
4 files changed, 186 insertions, 15 deletions
diff --git a/regress/usr.bin/lastcomm/Makefile b/regress/usr.bin/lastcomm/Makefile
index d9c62b52b3d..026ccba11e3 100644
--- a/regress/usr.bin/lastcomm/Makefile
+++ b/regress/usr.bin/lastcomm/Makefile
@@ -1,13 +1,29 @@
-# $OpenBSD: Makefile,v 1.5 2019/09/10 19:01:24 bluhm Exp $
+# $OpenBSD: Makefile,v 1.6 2019/09/23 08:34:07 bluhm Exp $
# Start with a clean /var/account/acct accounting file and turn on
# process accounting with accton(8). Each test executes a command
# with a unique name and checks the flags in the lastcomm(1) output.
# Run tests with fork, map, core, xsig, pledge, trap accounting.
-PROGS= crash stackmap
-WARNINGS= Yes
-CLEANFILES= regress-*
+.if ! (make(clean) || make(cleandir) || make(obj))
+
+MOUNT_OBJ !!= mount | grep ^$$(df -P . | tail -1 | awk '{ print $$1 }')
+
+.if "${MOUNT_OBJ:M*wxallowed*}" == ""
+REGRESS_SKIP_TARGETS += run-syscallwx
+.endif
+
+.endif
+
+.if ${MACHINE} == amd64 || ${MACHINE} == armv7
+# calling trapsignal() from syscall path does not work on amd64
+REGRESS_EXPECTED_FAILURES += run-callstack run-syscallwx
+.endif
+
+PROGS= crash trapstack callstack syscallwx
+WARNINGS= Yes
+LDADD_syscallwx= -z wxneeded
+CLEANFILES= regress-*
REGRESS_SETUP_ONCE = setup-rotate
# Rotate accouting files and keep statistics, from /etc/daily.
@@ -29,13 +45,29 @@ run-fork:
./regress-fork -c '( : ) &'
lastcomm regress-fork | grep -q ' -F '
-REGRESS_TARGETS += run-stackmap
-run-stackmap: stackmap
+REGRESS_TARGETS += run-trapstack
+run-trapstack: trapstack
+ @echo '\n======== $@ ========'
+ # Use invalid stack pointer, trap, SIGSEGV handler, check -M flag.
+ cp -f trapstack regress-trapstack
+ ./regress-trapstack
+ lastcomm regress-trapstack | grep -q ' -MT '
+
+REGRESS_TARGETS += run-callstack
+run-callstack: callstack
+ @echo '\n======== $@ ========'
+ # Use invalid stack pointer, syscall, SIGSEGV handler, check -M flag.
+ cp -f callstack regress-callstack
+ ./regress-callstack
+ lastcomm regress-callstack | grep -q ' -MT '
+
+REGRESS_TARGETS += run-syscallwx
+run-syscallwx: syscallwx
@echo '\n======== $@ ========'
- # Use invalid stack pointer, run SIGSEGV handler, check the -M flag.
- cp -f stackmap regress-stackmap
- ./regress-stackmap
- lastcomm regress-stackmap | grep -q ' -MT '
+ # Use writable syscall code, run SIGSEGV handler, check -M flag.
+ cp -f syscallwx regress-syscallwx
+ ./regress-syscallwx
+ lastcomm regress-syscallwx | grep -q ' -MT '
REGRESS_TARGETS += run-core
run-core:
diff --git a/regress/usr.bin/lastcomm/stackmap.c b/regress/usr.bin/lastcomm/callstack.c
index 66a82fe8182..c2a21f2bddb 100644
--- a/regress/usr.bin/lastcomm/stackmap.c
+++ b/regress/usr.bin/lastcomm/callstack.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: stackmap.c,v 1.1 2019/09/10 19:01:24 bluhm Exp $ */
+/* $OpenBSD: callstack.c,v 1.1 2019/09/23 08:34:07 bluhm Exp $ */
/*
* Copyright (c) 2018 Todd Mortimer <mortimer@openbsd.org>
* Copyright (c) 2019 Alexander Bluhm <bluhm@openbsd.org>
@@ -32,6 +32,7 @@ main(int argc, char *argv[])
stack_t ss;
struct sigaction act;
void (**newstack)(void);
+ long pagesize;
ss.ss_sp = malloc(SIGSTKSZ);
if (ss.ss_sp == NULL)
@@ -46,21 +47,25 @@ main(int argc, char *argv[])
act.sa_flags = SA_ONSTACK;
/* set up an alt stack on the heap that just calls doexit */
- newstack = malloc(SIGSTKSZ);
+ pagesize = sysconf(_SC_PAGESIZE);
+ if (pagesize == -1)
+ err(1, "sysconf");
+ newstack = malloc(pagesize > SIGSTKSZ ? pagesize : SIGSTKSZ);
if (newstack == NULL)
err(1, "malloc newstack");
- newstack[0] = doexit;
+ /* allow stack to change half a page up and down. */
+ newstack[pagesize/sizeof(*newstack)/2] = doexit;
if (sigaction(SIGSEGV, &act, NULL) == -1)
err(1, "sigaction");
- pivot(newstack);
+ pivot(&newstack[pagesize/sizeof(*newstack)/2]);
return 3;
}
void
handler(int signum)
{
- _exit(0);
+ _exit(0);
}
void
diff --git a/regress/usr.bin/lastcomm/syscallwx.c b/regress/usr.bin/lastcomm/syscallwx.c
new file mode 100644
index 00000000000..0eff81e6ff5
--- /dev/null
+++ b/regress/usr.bin/lastcomm/syscallwx.c
@@ -0,0 +1,50 @@
+/* $OpenBSD: syscallwx.c,v 1.1 2019/09/23 08:34:07 bluhm Exp $ */
+/*
+ * Copyright (c) 2018 Todd Mortimer <mortimer@openbsd.org>
+ * Copyright (c) 2019 Alexander Bluhm <bluhm@openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/mman.h>
+
+#include <err.h>
+#include <signal.h>
+#include <unistd.h>
+
+void handler(int);
+
+int
+main(int argc, char *argv[])
+{
+ pid_t pid;
+
+ pid = getpid();
+ if (pid == -1)
+ err(1, "getpid");
+ /* map kill system call in libc writeable */
+ if (mprotect(kill, 100, PROT_EXEC | PROT_WRITE | PROT_READ) == -1)
+ err(1, "mprotect");
+
+ if (signal(SIGSEGV, handler) == SIG_ERR)
+ err(1, "signal");
+ if (kill(pid, SIGABRT) == -1)
+ err(1, "kill");
+ return 3;
+}
+
+void
+handler(int signum)
+{
+ _exit(0);
+}
diff --git a/regress/usr.bin/lastcomm/trapstack.c b/regress/usr.bin/lastcomm/trapstack.c
new file mode 100644
index 00000000000..8737e112b55
--- /dev/null
+++ b/regress/usr.bin/lastcomm/trapstack.c
@@ -0,0 +1,84 @@
+/* $OpenBSD: trapstack.c,v 1.1 2019/09/23 08:34:07 bluhm Exp $ */
+/*
+ * Copyright (c) 2018 Todd Mortimer <mortimer@openbsd.org>
+ * Copyright (c) 2019 Alexander Bluhm <bluhm@openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/mman.h>
+
+#include <err.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <unistd.h>
+
+#include "pivot.h"
+
+void handler(int);
+void dotrap(void);
+
+static char *trapmap;
+
+int
+main(int argc, char *argv[])
+{
+ stack_t ss;
+ struct sigaction act;
+ void (**newstack)(void);
+ long pagesize;
+
+ ss.ss_sp = malloc(SIGSTKSZ);
+ if (ss.ss_sp == NULL)
+ err(1, "malloc sigstack");
+ ss.ss_size = SIGSTKSZ;
+ ss.ss_flags = 0;
+ if (sigaltstack(&ss, NULL) == -1)
+ err(1, "sigaltstack");
+
+ act.sa_handler = handler;
+ sigemptyset(&act.sa_mask);
+ act.sa_flags = SA_ONSTACK;
+
+ /* set up an alt stack on the heap that just calls dotrap */
+ pagesize = sysconf(_SC_PAGESIZE);
+ if (pagesize == -1)
+ err(1, "sysconf");
+ newstack = malloc(pagesize > SIGSTKSZ ? pagesize : SIGSTKSZ);
+ if (newstack == NULL)
+ err(1, "malloc newstack");
+ /* allow stack to change half a page up and down. */
+ newstack[pagesize/sizeof(*newstack)/2] = dotrap;
+
+ trapmap = mmap(NULL, pagesize, PROT_READ | PROT_WRITE, 0, -1, 0);
+ if (trapmap == NULL)
+ err(1, "mmap");
+
+ if (sigaction(SIGSEGV, &act, NULL) == -1)
+ err(1, "sigaction");
+ pivot(&newstack[pagesize/sizeof(*newstack)/2]);
+ return 3;
+}
+
+void
+handler(int signum)
+{
+ _exit(0);
+}
+
+void
+dotrap(void)
+{
+ trapmap[0] = 'x';
+ exit(2);
+}