about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--README12
-rw-r--r--fail.114
-rw-r--r--fail.c17
3 files changed, 33 insertions, 10 deletions
diff --git a/README b/README
index e057c9f..bf5a812 100644
--- a/README
+++ b/README
@@ -4,7 +4,7 @@ NAME
      fail – crash in various possible ways
 
 SYNOPSIS
-     fail [-123DOabcdikrst]
+     fail [-123DORabcdikrst]
 
 DESCRIPTION
      fail crashes in various possible ways to help you debug how other
@@ -29,6 +29,9 @@ DESCRIPTION
              Warning: this may lock up your machine and/or result in killing
              other processes, too.  Use with caution.
 
+     -R      Trigger an infinite recursion that uses alloca(3) heavily (to
+             test GCC's -fstack-clash-protection).
+
      -a      Call abort(3).
 
      -b      Trigger SIGBUS by accessing mmap(2) memory beyond the end of a
@@ -42,7 +45,8 @@ DESCRIPTION
 
      -k      Raise SIGKILL.
 
-     -r      Trigger an infinite recursion.
+     -r      Trigger an infinite recursion that uses less than a page of stack
+             per level.
 
      -s      Trigger a segmentation fault by writing to a null pointer.
 
@@ -63,6 +67,6 @@ LICENSE
      To the extent possible under law, the creator of this work has waived all
      copyright and related or neighboring rights to this work.
 
-           http://creativecommons.org/publicdomain/zero/1.0/
+     http://creativecommons.org/publicdomain/zero/1.0/
 
-Void Linux                     February 8, 2017                     Void Linux
+Void Linux                     January 11, 2019                     Void Linux
diff --git a/fail.1 b/fail.1
index c1ff07e..8026683 100644
--- a/fail.1
+++ b/fail.1
@@ -1,4 +1,4 @@
-.Dd February 08, 2017
+.Dd January 11, 2019
 .Dt FAIL 1
 .Os
 .Sh NAME
@@ -6,7 +6,7 @@
 .Nd crash in various possible ways
 .Sh SYNOPSIS
 .Nm
-.Op Fl 123DOabcdikrst
+.Op Fl 123DORabcdikrst
 .Sh DESCRIPTION
 .Nm
 crashes in various possible ways to
@@ -42,6 +42,14 @@ A dot is printed after each 16MB allocation.
 this may lock up your machine
 and/or result in killing other processes, too.
 Use with caution.
+.It Fl R
+Trigger an infinite recursion that uses
+.Xr alloca 3
+heavily
+.Po
+to test GCC's
+.Fl fstack-clash-protection
+.Pc .
 .It Fl a
 Call
 .Xr abort 3 .
@@ -60,7 +68,7 @@ Execute an illegal instruction.
 .It Fl k
 Raise SIGKILL.
 .It Fl r
-Trigger an infinite recursion.
+Trigger an infinite recursion that uses less than a page of stack per level.
 .It Fl s
 Trigger a segmentation fault by writing to a null pointer.
 .It Fl t
diff --git a/fail.c b/fail.c
index b95b1b6..5d1b80b 100644
--- a/fail.c
+++ b/fail.c
@@ -9,6 +9,7 @@
 #include <sys/stat.h>
 #include <sys/types.h>
 
+#include <alloca.h>
 #include <fcntl.h>
 #include <signal.h>
 #include <stdio.h>
@@ -73,13 +74,22 @@ oom()
 void
 recurse(char *n)
 {
-	char m[1024];
+	char m[512];
 	recurse(m);
 	if (n)
 		m[0] = n[0] = 42;
 }
 
 void
+recurse_alloca(char *n)
+{
+	char *m = alloca(1024*1024);
+	recurse_alloca(m);
+	if (n)
+		m[0] = n[0] = 42;
+}
+
+void
 abortme()
 {
 	abort();
@@ -148,13 +158,14 @@ main(int argc, char *argv[])
 {
 	int c;
 
-	while ((c = getopt(argc, argv, "123DOabcdikrst")) != -1) {
+	while ((c = getopt(argc, argv, "123DORabcdikrst")) != -1) {
 		switch (c) {
 		case '1': exit(-1); break;
 		case '2': exit(2); break;
 		case '3': exit(111); break;
 		case 'D': uninterruptible(); break;
 		case 'O': oom(); break;
+		case 'R': recurse_alloca(0); break;
 		case 'a': abortme(); break;
 		case 'b': mmap_sigbus(); break;
 		case 'c': violate_seccomp(); break;
@@ -167,6 +178,6 @@ main(int argc, char *argv[])
 		}
 	}
 
-	write(2, "Usage: fail [-123Oabcdikrst]\n", 29);
+	write(2, "Usage: fail [-123ORabcdikrst]\n", 30);
 	exit(1);
 }