[PATCH] POC for fault injection

student haris.phnx at gmail.com
Mon Mar 21 05:05:05 UTC 2016


From: Md Haris Iqbal <haris.phnx at gmail.com>

---
 strace.c  | 22 +++++++++++++++++++--
 syscall.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 85 insertions(+), 3 deletions(-)

diff --git a/strace.c b/strace.c
index 49d6f3d..42cd9a6 100644
--- a/strace.c
+++ b/strace.c
@@ -1487,6 +1487,11 @@ get_os_release(void)
  * Don't want main() to inline us and defeat the reason
  * we have a separate function.
  */
+
+void fail_syscall(int);
+void set_fail_flag(void);
+void set_failing_parameters(char* str);
+
 static void ATTRIBUTE_NOINLINE
 init(int argc, char *argv[])
 {
@@ -1523,7 +1528,7 @@ init(int argc, char *argv[])
 		"k"
 #endif
 		"D"
-		"a:e:o:O:p:s:S:u:E:P:I:")) != EOF) {
+		"a:e:g:j:o:O:p:s:S:u:E:P:I:")) != EOF) {
 		switch (c) {
 		case 'b':
 			if (strcmp(optarg, "execve") != 0)
@@ -1600,6 +1605,13 @@ init(int argc, char *argv[])
 		case 'e':
 			qualify(optarg);
 			break;
+        case 'g':
+            qualify(optarg);
+            set_fail_flag();
+            break;
+        case 'j':
+            set_failing_parameters(optarg);
+            break;
 		case 'o':
 			outfname = xstrdup(optarg);
 			break;
@@ -2322,7 +2334,8 @@ show_stopsig:
 	 * This should be syscall entry or exit.
 	 * Handle it.
 	 */
-	if (trace_syscall(tcp) < 0) {
+    int temp = trace_syscall(tcp);
+    if (temp < 0) {
 		/*
 		 * ptrace() failed in trace_syscall().
 		 * Likely a result of process disappearing mid-flight.
@@ -2337,6 +2350,11 @@ show_stopsig:
 		return true;
 	}
 
+    if(temp == 3)
+    {
+        fail_syscall(pid);
+    }
+
 restart_tracee_with_sig_0:
 	sig = 0;
 
diff --git a/syscall.c b/syscall.c
index 6efcde5..61186bc 100644
--- a/syscall.c
+++ b/syscall.c
@@ -785,12 +785,54 @@ static void get_error(struct tcb *, const bool);
 static int getregs_old(pid_t);
 #endif
 
+/* custom for POC of fault injection*/
+
+void fail_syscall(int);
+void set_fail_flag(void);
+void set_failing_parameters(const char*);
+
+
+
+unsigned int fail_flag = 0;
+int probability = 100;
+int failing_prob = 0;
+void set_fail_flag()
+{
+    fail_flag = 1;
+    return;
+}
+
+void set_failing_parameters(const char* str)
+{
+    probability = atoi(str);
+    srand(time(NULL));
+    return;
+}
+
+/* END */
+
+
 static int
 trace_syscall_entering(struct tcb *tcp)
 {
 	int res, scno_good;
 
 	scno_good = res = get_scno(tcp);
+
+
+    /* POC code for fault injection */
+    if((rand() % 100) <= probability)
+        failing_prob = 1;
+
+    if ((tcp->qual_flg & QUAL_TRACE) && fail_flag == 1 && failing_prob == 1)
+    {
+        // probablity needs to be added using randon number genaratiion
+        tprintf("%s system called failed with probability %d\n", syscall_name(tcp->scno), probability);
+        tcp->flags |= TCB_INSYSCALL;
+        tcp->sys_func_rval = 0;
+        return 0;
+    }
+
 	if (res == 0)
 		return res;
 	if (res == 1)
@@ -878,17 +920,28 @@ trace_syscall_entering(struct tcb *tcp)
 	/* Measure the entrance time as late as possible to avoid errors. */
 	if (Tflag || cflag)
 		gettimeofday(&tcp->etime, NULL);
-	return res;
+    return res;
 }
 
 static int
 trace_syscall_exiting(struct tcb *tcp)
 {
+
 	int sys_res;
 	struct timeval tv;
 	int res;
 	long u_error;
 
+    if ((tcp->qual_flg & QUAL_TRACE) && fail_flag == 1 && failing_prob == 1)
+    {
+        // probablity needs to be added using randon number genaratiion
+        tprintf("%s system called failed with probability %d\n", syscall_name(tcp->scno), probability);
+        tcp->flags |= ~TCB_INSYSCALL;
+        failing_prob = 0;
+        return 3;
+    }
+
+
 	/* Measure the exit time as early as possible to avoid errors. */
 	if (Tflag || cflag)
 		gettimeofday(&tv, NULL);
@@ -1241,6 +1294,17 @@ get_regset(pid_t pid)
 }
 #endif /* ARCH_REGS_FOR_GETREGSET */
 
+void fail_syscall(pid)
+{
+    struct user_regs_struct regs;
+
+    ptrace(PTRACE_GETREGS, pid, NULL, &regs);
+    regs.rax = -1;
+    ptrace(PTRACE_SETREGS, pid, NULL, &regs);
+
+}
+
+
 void
 get_regs(pid_t pid)
 {
-- 
1.9.1





More information about the Strace-devel mailing list