about summary refs log tree commit diff
path: root/fail.c
diff options
context:
space:
mode:
authorLeah Neukirchen <leah@vuxu.org>2019-12-19 12:51:29 +0100
committerLeah Neukirchen <leah@vuxu.org>2019-12-19 12:51:29 +0100
commita34791cc02949d22d2b4a5f7e0ddc63d617dd6d0 (patch)
tree62deadf77ae4bb9e3ca46faaebcc332144282429 /fail.c
parentf2a8f228da6b1a73f40abc5a5e83433d67c38943 (diff)
downloadfail-a34791cc02949d22d2b4a5f7e0ddc63d617dd6d0.tar.gz
fail-a34791cc02949d22d2b4a5f7e0ddc63d617dd6d0.tar.xz
fail-a34791cc02949d22d2b4a5f7e0ddc63d617dd6d0.zip
add -S for stack smashing
Diffstat (limited to 'fail.c')
-rw-r--r--fail.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/fail.c b/fail.c
index 855189c..a054e6e 100644
--- a/fail.c
+++ b/fail.c
@@ -14,6 +14,7 @@
 #include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <unistd.h>
 
 void
@@ -90,6 +91,15 @@ recurse_alloca(char *n)
 }
 
 void
+stack_smash()
+{
+	char buffer[2];
+	strcpy(buffer, "stack smash stack smash stack smash stack smash");
+	printf("%s", buffer);
+	/* if we exit here, gcc may optimize the smashing detection away */
+}
+
+void
 abortme()
 {
 	abort();
@@ -160,7 +170,7 @@ main(int argc, char *argv[])
 {
 	int c;
 
-	while ((c = getopt(argc, argv, "123DORabcdikrst")) != -1) {
+	while ((c = getopt(argc, argv, "123DORSabcdikrst")) != -1) {
 		switch (c) {
 		case '1': exit(-1); break;
 		case '2': exit(2); break;
@@ -176,10 +186,11 @@ main(int argc, char *argv[])
 		case 'k': killme(); break;
 		case 'r': recurse(0); break;
 		case 's': segfault(); break;
+		case 'S': stack_smash(); break;
 		case 't': trap(); break;
 		}
 	}
 
-	write(2, "Usage: fail [-123ORabcdikrst]\n", 30);
+	write(2, "Usage: fail [-123ORSabcdikrst]\n", 31);
 	exit(1);
 }